From 7ec5f9128521e20d9ad13de3fb66c41be0b932a3 Mon Sep 17 00:00:00 2001 From: deimosfr Date: Fri, 22 Dec 2023 17:52:00 +0000 Subject: [PATCH] deploy: 23a554d2c023348b441320ea946c6be4cd1d9861 --- 004ec9e5.4f0152e2.js => 004ec9e5.29a8450f.js | 4 +- ...SE.txt => 004ec9e5.29a8450f.js.LICENSE.txt | 0 03dbc155.57dfe7e9.js => 03dbc155.aa62e49e.js | 2 +- 1.5236ee97.js => 1.b6bd6afb.js | 4 +- ...s.LICENSE.txt => 1.b6bd6afb.js.LICENSE.txt | 0 17896441.5deb0378.js => 17896441.66ca3c52.js | 2 +- 1a3e0044.410046e9.js => 1a3e0044.5e90d335.js | 2 +- 1a6d3985.2998ed19.js => 1a6d3985.d3f4b70d.js | 2 +- 1be78505.9c8c9847.js => 1be78505.03ed5509.js | 4 +- ...SE.txt => 1be78505.03ed5509.js.LICENSE.txt | 0 1c13b173.dcad6c5c.js => 1c13b173.8f091d02.js | 4 +- ...SE.txt => 1c13b173.8f091d02.js.LICENSE.txt | 0 2.27ebdbf7.js => 2.6f1c9576.js | 2 +- 2121549d.83e910bc.js => 2121549d.e1f693a0.js | 2 +- 270.ce4f4441.js => 270.0b2e77a4.js | 4 +- ...LICENSE.txt => 270.0b2e77a4.js.LICENSE.txt | 0 2ea1d02e.d9f09dbd.js => 2ea1d02e.e074ce0d.js | 2 +- 3088ad98.43ffaec8.js => 3088ad98.810b2d56.js | 2 +- 30e307eb.9f08b9f7.js | 2 - 30e307eb.cc152329.js | 1 + 3116c1fa.e25c73d7.js => 3116c1fa.d79d732c.js | 4 +- ...SE.txt => 3116c1fa.d79d732c.js.LICENSE.txt | 0 3da71a70.faa6d352.js => 3da71a70.243cb025.js | 2 +- 404.html | 8 +- 410a9ba0.5c3bfd65.js => 410a9ba0.5da3baf5.js | 2 +- 54e7632e.c06ee927.js => 54e7632e.f37d554b.js | 4 +- ...SE.txt => 54e7632e.f37d554b.js.LICENSE.txt | 0 56c0a343.824050c2.js => 56c0a343.5aca429a.js | 2 +- 56cfbe62.ae1ea43d.js => 56cfbe62.63b6984a.js | 4 +- ...SE.txt => 56cfbe62.63b6984a.js.LICENSE.txt | 0 60296d59.e2bd789a.js => 60296d59.3e50ab5a.js | 2 +- 66bbed7b.709e2f79.js => 66bbed7b.a1c39270.js | 4 +- ...SE.txt => 66bbed7b.a1c39270.js.LICENSE.txt | 0 672ba3d6.9b98b029.js => 672ba3d6.7e2d9a2f.js | 4 +- ...SE.txt => 672ba3d6.7e2d9a2f.js.LICENSE.txt | 0 6ce627d6.918e632b.js => 6ce627d6.c4038975.js | 2 +- 83e9e333.6923a815.js => 83e9e333.ff6dd989.js | 4 +- ...SE.txt => 83e9e333.ff6dd989.js.LICENSE.txt | 0 89caf623.099fa5f4.js => 89caf623.86372b86.js | 2 +- 8d1c77c1.1993c6dc.js => 8d1c77c1.c4a12106.js | 4 +- ...SE.txt => 8d1c77c1.c4a12106.js.LICENSE.txt | 0 8f02216a.992fe6b6.js => 8f02216a.73099afe.js | 4 +- ...SE.txt => 8f02216a.73099afe.js.LICENSE.txt | 0 967beaa8.11f606ea.js => 967beaa8.cc029aba.js | 2 +- ab8f5b83.46371bbd.js => ab8f5b83.89894402.js | 2 +- b4dda200.9bd97e60.js => b4dda200.1e04ca2b.js | 4 +- ...SE.txt => b4dda200.1e04ca2b.js.LICENSE.txt | 0 b565c464.b03ae35c.js => b565c464.014da0f9.js | 2 +- bb89e1a0.10ae3bee.js => bb89e1a0.16b7ed81.js | 2 +- c24a85bb.97905c5d.js => c24a85bb.2fb9f705.js | 4 +- ...SE.txt => c24a85bb.2fb9f705.js.LICENSE.txt | 0 c4f5d8e4.7311bd1c.js => c4f5d8e4.619f4eb2.js | 4 +- ...SE.txt => c4f5d8e4.619f4eb2.js.LICENSE.txt | 0 c6d06197.f2d04dec.js => c6d06197.1de63217.js | 4 +- ...SE.txt => c6d06197.1de63217.js.LICENSE.txt | 0 community/index.html | 16 +- components/index.html | 16 +- contact/index.html | 16 +- d9a4c8ef.98d2bfff.js => d9a4c8ef.3804c972.js | 2 +- d9deea5f.4add985c.js => d9deea5f.f3635678.js | 4 +- ...SE.txt => d9deea5f.f3635678.js.LICENSE.txt | 0 db372ba8.afb302c4.js => db372ba8.d2cc54a0.js | 2 +- dea3d534.252309a6.js.LICENSE.txt | 5 - dea3d534.252309a6.js => dea3d534.6b9445e6.js | 4 +- ...SE.txt => dea3d534.6b9445e6.js.LICENSE.txt | 0 .../getting-started/basic-concepts/index.html | 20 +- docs/getting-started/deploy-my-app/index.html | 20 +- .../how-qovery-works/index.html | 20 +- docs/getting-started/index.html | 20 +- .../getting-started/install-qovery/index.html | 20 +- .../getting-started/what-is-qovery/index.html | 20 +- docs/getting-started/whats-next/index.html | 20 +- docs/index.html | 8 +- .../backup-and-restore/index.html | 20 +- .../encryption/index.html | 20 +- docs/security-and-compliance/gdpr/index.html | 20 +- docs/security-and-compliance/index.html | 20 +- docs/security-and-compliance/soc2/index.html | 20 +- docs/useful-resources/faq/index.html | 20 +- .../help-and-support/index.html | 20 +- docs/using-qovery/audit-logs/index.html | 20 +- .../advanced-settings/index.html | 20 +- .../application-health-checks/index.html | 20 +- .../configuration/application/index.html | 20 +- .../amazon-web-services/index.html | 20 +- .../digital-ocean/index.html | 20 +- .../google-cloud-platform/index.html | 20 +- .../cloud-service-provider/index.html | 20 +- .../microsoft-azure/index.html | 20 +- .../other-csps/index.html | 20 +- .../scaleway/index.html | 20 +- .../cluster-advanced-settings/index.html | 20 +- .../configuration/clusters/index.html | 20 +- .../configuration/cronjob/index.html | 20 +- .../configuration/database/index.html | 20 +- .../configuration/database/mongodb/index.html | 20 +- .../configuration/database/mysql/index.html | 20 +- .../database/postgresql/index.html | 20 +- .../configuration/database/redis/index.html | 20 +- .../configuration/deployment-rule/index.html | 20 +- .../environment-variable/index.html | 20 +- .../configuration/environment/index.html | 20 +- .../configuration/helm/index.html | 20 +- docs/using-qovery/configuration/index.html | 20 +- .../configuration/lifecycle-job/index.html | 20 +- .../configuration/object-storage/index.html | 20 +- .../organization/api-token/index.html | 20 +- .../container-registry/index.html | 20 +- .../git-repository-access/index.html | 20 +- .../organization/helm-repository/index.html | 20 +- .../configuration/organization/index.html | 20 +- .../organization/members-rbac/index.html | 20 +- .../configuration/project/index.html | 20 +- .../configuration/provider/index.html | 20 +- .../provider/kubernetes/index.html | 36 +- .../service-health-checks/index.html | 20 +- .../configuration/user-account/index.html | 20 +- .../deploying-with-auto-deploy/index.html | 20 +- .../deploying-with-ci-cd/index.html | 20 +- .../deployment/deployment-actions/index.html | 20 +- .../deployment/deployment-history/index.html | 20 +- .../deployment/deployment-pipeline/index.html | 20 +- .../deployment-strategies/index.html | 20 +- .../deployment/image-mirroring/index.html | 20 +- docs/using-qovery/deployment/index.html | 20 +- docs/using-qovery/deployment/logs/index.html | 20 +- .../index.html | 20 +- docs/using-qovery/index.html | 24 +- .../integration/api-integration/index.html | 20 +- .../integration/container-registry/index.html | 20 +- .../circle-ci/index.html | 20 +- .../github-actions/index.html | 20 +- .../gitlab-ci/index.html | 20 +- .../continuous-integration/index.html | 20 +- .../continuous-integration/jenkins/index.html | 20 +- .../integration/git-repository/index.html | 20 +- .../integration/helm-repository/index.html | 20 +- docs/using-qovery/integration/index.html | 24 +- .../integration/monitoring/datadog/index.html | 20 +- .../integration/monitoring/index.html | 20 +- .../monitoring/new-relic/index.html | 20 +- .../aws-secrets-manager/index.html | 20 +- .../secret-manager/doppler/index.html | 20 +- .../integration/secret-manager/index.html | 20 +- .../using-qovery/integration/slack/index.html | 20 +- .../integration/terraform/index.html | 20 +- .../integration/webhook/index.html | 20 +- docs/using-qovery/interface/cli/index.html | 28 +- docs/using-qovery/interface/index.html | 20 +- .../interface/rest-api/index.html | 20 +- .../interface/terraform-interface/index.html | 20 +- .../interface/web-interface/index.html | 20 +- docs/using-qovery/maintenance/index.html | 20 +- .../application-troubleshoot/index.html | 20 +- .../cluster-troubleshoot/index.html | 20 +- .../database-troubleshoot/index.html | 20 +- docs/using-qovery/troubleshoot/index.html | 24 +- .../lifecycle-troubleshoot/index.html | 20 +- f7098925.c179454d.js => f7098925.26c73e3a.js | 2 +- .../continuous-integration/index.html | 20 +- guides/advanced/costs-control/index.html | 20 +- guides/advanced/deploy-api-gateway/index.html | 20 +- .../advanced/deploy-aws-services/index.html | 20 +- .../deploy-external-services/index.html | 20 +- guides/advanced/deploy-frontend/index.html | 20 +- guides/advanced/helm-chart/index.html | 26 +- guides/advanced/index.html | 24 +- guides/advanced/microservices/index.html | 26 +- guides/advanced/migration/index.html | 20 +- guides/advanced/monitoring/index.html | 20 +- guides/advanced/monorepository/index.html | 20 +- guides/advanced/production/index.html | 20 +- guides/advanced/seed-database/index.html | 20 +- guides/advanced/terraform/index.html | 20 +- .../use-preview-environments/index.html | 20 +- .../guide-amazon-web-services/index.html | 20 +- .../guide-google-cloud-platform/index.html | 20 +- .../guide-microsoft-azure/index.html | 20 +- .../cloud-provider/guide-scaleway/index.html | 20 +- guides/cloud-provider/index.html | 16 +- .../create-a-database/index.html | 20 +- guides/getting-started/debugging/index.html | 20 +- .../deploy-your-first-application/index.html | 20 +- guides/getting-started/index.html | 16 +- .../managing-environment-variables/index.html | 20 +- .../setting-custom-domain/index.html | 20 +- guides/index.html | 64 +- guides/provider/guide-kubernetes/index.html | 20 +- guides/provider/index.html | 16 +- guides/tags/cloud-provider-aws/index.html | 24 +- guides/tags/cloud-provider-azure/index.html | 16 +- guides/tags/cloud-provider-gcp/index.html | 16 +- .../tags/cloud-provider-scaleway/index.html | 16 +- guides/tags/database-postgresql/index.html | 24 +- guides/tags/framework-rails/index.html | 16 +- guides/tags/index.html | 16 +- guides/tags/language-javascript/index.html | 16 +- guides/tags/language-kotlin/index.html | 24 +- guides/tags/language-ruby/index.html | 16 +- guides/tags/language-rust/index.html | 28 +- guides/tags/provider-kubernetes/index.html | 16 +- guides/tags/technology-docker/index.html | 16 +- guides/tags/technology-github/index.html | 16 +- guides/tags/technology-helm/index.html | 20 +- guides/tags/technology-qovery/index.html | 44 +- guides/tags/technology-terraform/index.html | 16 +- guides/tags/type-guide/index.html | 24 +- guides/tags/type-tutorial/index.html | 56 +- .../aws-sqs-lambda-with-qovery/index.html | 20 +- .../aws-vpc-peering-with-qovery/index.html | 20 +- .../index.html | 20 +- .../index.html | 24 +- .../cloudwatch-integration/index.html | 20 +- .../index.html | 24 +- .../index.html | 24 +- .../index.html | 24 +- .../index.html | 20 +- .../data-seeding-in-postgres/index.html | 20 +- .../index.html | 20 +- .../deploy-temporal-on-kubernetes/index.html | 20 +- .../generate-qovery-api-client/index.html | 20 +- .../index.html | 24 +- .../index.html | 20 +- guides/tutorial/grafana-install/index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 24 +- .../how-to-deploy-helm-charts/index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 20 +- .../how-to-write-a-dockerfile/index.html | 20 +- .../index.html | 24 +- guides/tutorial/index.html | 56 +- .../index.html | 20 +- .../index.html | 20 +- .../index.html | 24 +- .../index.html | 20 +- .../url-shortener-api-with-kotlin/index.html | 24 +- .../index.html | 20 +- .../use-aws-iam-roles-with-qovery/index.html | 20 +- .../working-with-git-submodules/index.html | 20 +- .../kubelet-credential-providers-plugin.png | Bin 0 -> 72438 bytes index.html | 16 +- mailing_list/index.html | 8 +- main.a3902645.js => main.9870bffd.js | 4 +- ...ICENSE.txt => main.9870bffd.js.LICENSE.txt | 0 ...in.011da512.js => runtime~main.b09772f0.js | 2 +- server.bundle.js | 553 +++++++++++++----- 256 files changed, 2421 insertions(+), 2188 deletions(-) rename 004ec9e5.4f0152e2.js => 004ec9e5.29a8450f.js (99%) rename 004ec9e5.4f0152e2.js.LICENSE.txt => 004ec9e5.29a8450f.js.LICENSE.txt (100%) rename 03dbc155.57dfe7e9.js => 03dbc155.aa62e49e.js (99%) rename 1.5236ee97.js => 1.b6bd6afb.js (99%) rename 1.5236ee97.js.LICENSE.txt => 1.b6bd6afb.js.LICENSE.txt (100%) rename 17896441.5deb0378.js => 17896441.66ca3c52.js (98%) rename 1a3e0044.410046e9.js => 1a3e0044.5e90d335.js (99%) rename 1a6d3985.2998ed19.js => 1a6d3985.d3f4b70d.js (99%) rename 1be78505.9c8c9847.js => 1be78505.03ed5509.js (99%) rename 1be78505.9c8c9847.js.LICENSE.txt => 1be78505.03ed5509.js.LICENSE.txt (100%) rename 1c13b173.dcad6c5c.js => 1c13b173.8f091d02.js (99%) rename 1c13b173.dcad6c5c.js.LICENSE.txt => 1c13b173.8f091d02.js.LICENSE.txt (100%) rename 2.27ebdbf7.js => 2.6f1c9576.js (98%) rename 2121549d.83e910bc.js => 2121549d.e1f693a0.js (99%) rename 270.ce4f4441.js => 270.0b2e77a4.js (98%) rename 270.ce4f4441.js.LICENSE.txt => 270.0b2e77a4.js.LICENSE.txt (100%) rename 2ea1d02e.d9f09dbd.js => 2ea1d02e.e074ce0d.js (98%) rename 3088ad98.43ffaec8.js => 3088ad98.810b2d56.js (99%) delete mode 100644 30e307eb.9f08b9f7.js create mode 100644 30e307eb.cc152329.js rename 3116c1fa.e25c73d7.js => 3116c1fa.d79d732c.js (99%) rename 3116c1fa.e25c73d7.js.LICENSE.txt => 3116c1fa.d79d732c.js.LICENSE.txt (100%) rename 3da71a70.faa6d352.js => 3da71a70.243cb025.js (99%) rename 410a9ba0.5c3bfd65.js => 410a9ba0.5da3baf5.js (99%) rename 54e7632e.c06ee927.js => 54e7632e.f37d554b.js (99%) rename 54e7632e.c06ee927.js.LICENSE.txt => 54e7632e.f37d554b.js.LICENSE.txt (100%) rename 56c0a343.824050c2.js => 56c0a343.5aca429a.js (99%) rename 56cfbe62.ae1ea43d.js => 56cfbe62.63b6984a.js (97%) rename 30e307eb.9f08b9f7.js.LICENSE.txt => 56cfbe62.63b6984a.js.LICENSE.txt (100%) rename 60296d59.e2bd789a.js => 60296d59.3e50ab5a.js (98%) rename 66bbed7b.709e2f79.js => 66bbed7b.a1c39270.js (99%) rename 56cfbe62.ae1ea43d.js.LICENSE.txt => 66bbed7b.a1c39270.js.LICENSE.txt (100%) rename 672ba3d6.9b98b029.js => 672ba3d6.7e2d9a2f.js (98%) rename 66bbed7b.709e2f79.js.LICENSE.txt => 672ba3d6.7e2d9a2f.js.LICENSE.txt (100%) rename 6ce627d6.918e632b.js => 6ce627d6.c4038975.js (99%) rename 83e9e333.6923a815.js => 83e9e333.ff6dd989.js (98%) rename 672ba3d6.9b98b029.js.LICENSE.txt => 83e9e333.ff6dd989.js.LICENSE.txt (100%) rename 89caf623.099fa5f4.js => 89caf623.86372b86.js (99%) rename 8d1c77c1.1993c6dc.js => 8d1c77c1.c4a12106.js (98%) rename 83e9e333.6923a815.js.LICENSE.txt => 8d1c77c1.c4a12106.js.LICENSE.txt (100%) rename 8f02216a.992fe6b6.js => 8f02216a.73099afe.js (98%) rename 8d1c77c1.1993c6dc.js.LICENSE.txt => 8f02216a.73099afe.js.LICENSE.txt (100%) rename 967beaa8.11f606ea.js => 967beaa8.cc029aba.js (98%) rename ab8f5b83.46371bbd.js => ab8f5b83.89894402.js (99%) rename b4dda200.9bd97e60.js => b4dda200.1e04ca2b.js (98%) rename 8f02216a.992fe6b6.js.LICENSE.txt => b4dda200.1e04ca2b.js.LICENSE.txt (100%) rename b565c464.b03ae35c.js => b565c464.014da0f9.js (99%) rename bb89e1a0.10ae3bee.js => bb89e1a0.16b7ed81.js (98%) rename c24a85bb.97905c5d.js => c24a85bb.2fb9f705.js (98%) rename b4dda200.9bd97e60.js.LICENSE.txt => c24a85bb.2fb9f705.js.LICENSE.txt (100%) rename c4f5d8e4.7311bd1c.js => c4f5d8e4.619f4eb2.js (99%) rename c24a85bb.97905c5d.js.LICENSE.txt => c4f5d8e4.619f4eb2.js.LICENSE.txt (100%) rename c6d06197.f2d04dec.js => c6d06197.1de63217.js (99%) rename c6d06197.f2d04dec.js.LICENSE.txt => c6d06197.1de63217.js.LICENSE.txt (100%) rename d9a4c8ef.98d2bfff.js => d9a4c8ef.3804c972.js (99%) rename d9deea5f.4add985c.js => d9deea5f.f3635678.js (99%) rename d9deea5f.4add985c.js.LICENSE.txt => d9deea5f.f3635678.js.LICENSE.txt (100%) rename db372ba8.afb302c4.js => db372ba8.d2cc54a0.js (99%) delete mode 100644 dea3d534.252309a6.js.LICENSE.txt rename dea3d534.252309a6.js => dea3d534.6b9445e6.js (99%) rename c4f5d8e4.7311bd1c.js.LICENSE.txt => dea3d534.6b9445e6.js.LICENSE.txt (100%) rename f7098925.c179454d.js => f7098925.26c73e3a.js (99%) create mode 100644 img/configuration/provider/kubelet-credential-providers-plugin.png rename main.a3902645.js => main.9870bffd.js (82%) rename main.a3902645.js.LICENSE.txt => main.9870bffd.js.LICENSE.txt (100%) rename runtime~main.011da512.js => runtime~main.b09772f0.js (82%) diff --git a/004ec9e5.4f0152e2.js b/004ec9e5.29a8450f.js similarity index 99% rename from 004ec9e5.4f0152e2.js rename to 004ec9e5.29a8450f.js index 805f0c6add..b480a21328 100644 --- a/004ec9e5.4f0152e2.js +++ b/004ec9e5.29a8450f.js @@ -1,2 +1,2 @@ -/*! For license information please see 004ec9e5.4f0152e2.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{153:function(n,t,e){"use strict";e.r(t);e(428);var r=e(0),u=e.n(r),i=e(445),a=e(516),o=e(430);t.default=function(n){var t=n.metadata,e=n.items,r=t.allTagsPath,c=t.name,l=t.count;return u.a.createElement(i.a,{title:'Guides tagged "'+c+'"',description:'Guide | Tagged "'+c+'"'},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,l," ",function(n,t){return n>1?t+"s":t}(l,"guide"),' tagged with "',c,'"'),u.a.createElement("div",{className:"hero--subtitle"},u.a.createElement(o.a,{href:r},"View All Tags")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e})))}},423:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},445:function(n,t,e){"use strict";e(457);var r=e(0),u=e.n(r),i=e(458),a=e(443),o=e(1),c=(e(446),e(447),e(459),e(430)),l=e(460),f=e(440),s=e.n(f),v=e(461),h=e.n(v),d=e(436),p=e(423),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},u.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(R,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(T,{alt:f.alt,url:v})):u.a.createElement(T,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(462),M=e(463),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.favicon,o=(e.tagline,e.title),c=e.themeConfig.image,l=e.url,f=n.children,s=n.title,v=n.noFooter,h=n.description,p=n.image,g=n.keywords,D=(n.permalink,n.version),_=s?s+" | "+o:o,m=p||c,y=l+Object(F.a)(m),b=Object(F.a)(r),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&u.a.createElement("title",null,_),_&&u.a.createElement("meta",{property:"og:title",content:_}),r&&u.a.createElement("link",{rel:"shortcut icon",href:b}),h&&u.a.createElement("meta",{name:"description",content:h}),h&&u.a.createElement("meta",{property:"og:description",content:h}),D&&u.a.createElement("meta",{name:"docsearch:version",content:D}),g&&g.length&&u.a.createElement("meta",{name:"keywords",content:g.join(",")}),m&&u.a.createElement("meta",{property:"og:image",content:y}),m&&u.a.createElement("meta",{property:"twitter:image",content:y}),m&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),w&&u.a.createElement("meta",{property:"og:url",content:w}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&u.a.createElement("link",{rel:"canonical",href:w})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},f),!v&&u.a.createElement(z,null)))}},450:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(423),o=e.n(a),c=e(436),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},451:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",A="[object Int8Array]",x="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,R=/&(?:amp|lt|gt|quot|#39);/g,T=/[&<>"']/g,z=RegExp(R.source),W=RegExp(T.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(G.source),K=/^\s+|\s+$/g,H=/^\s+/,Q=/\s+$/,J=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",An="(?:"+yn+"|"+bn+")",xn="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),Rn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",xn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+An,"$"].join("|")+")",kn+"?"+An+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Tn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[A]=Un[x]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[A]=Pn[x]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Vn=parseInt,Gn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Kn=Gn||Zn||Function("return this")(),Hn=t&&!t.nodeType&&t,Qn=Hn&&"object"==typeof r&&r&&!r.nodeType&&r,Jn=Qn&&Qn.exports===Hn,Yn=Jn&&Gn.process,Xn=function(){try{var n=Qn&&Qn.require&&Qn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function Rt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Tt=At({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),zt=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Tn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Ht=function n(t){var e,r=(t=null==t?Kn:Ht.defaults(Kn.Object(),t,Ht.pick(Kn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,An=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",xn=En.toString,jn=Fn.call(gn),On=Kn._,Nn=Dn("^"+Fn.call(Cn).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Jn?t.Buffer:void 0,Ln=t.Symbol,Tn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Gn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Hn=En.propertyIsEnumerable,Qn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,At=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Qt=t.clearTimeout!==Kn.clearTimeout&&t.clearTimeout,Jt=u&&u.now!==Kn.Date.now&&u.now,Yt=t.setTimeout!==Kn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,Ae=Ce?Ce.toString:void 0;function xe(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return Ai(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Qe(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(Ra(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ge(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case A:case x:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Te);var L=i.get(n);if(L)return L;i.set(n,a),Ka(n)?n.forEach((function(r){a.add(Qe(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Qe(r,t,e,u,n,i))}));var R=E?void 0:(v?l?Gu:Vu:l?bo:yo)(n);return ct(R||n,(function(r,u){R&&(r=n[u=r]),$e(a,u,Qe(r,t,e,u,n,i))})),a}function Je(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new Re(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Ju(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Ju(this,n).get(n)},Le.prototype.has=function(n){return Ju(this,n).has(n)},Le.prototype.set=function(n,t){var e=Ju(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},Re.prototype.add=Re.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Re.prototype.has=function(n){return this.__data__.has(n)},Te.prototype.clear=function(){this.__data__=new Se,this.size=0},Te.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Te.prototype.get=function(n){return this.__data__.get(n)},Te.prototype.has=function(n){return this.__data__.has(n)},Te.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new Re(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Qn.call(o,c,1),Qn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Qn.call(n,u,1):Xr(n,u)}}return n}function Rr(n,t){return n+ne(fe()*(t-n+1))}function Tr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function zr(n,t){return yi(di(n,t,Go),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,He(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Qa(a)&&(e?a<=t:a=200){var l=t?null:Tu(n);if(l)return qt(l);a=!1,u=It,c=new Re}else c=t?[]:o;n:for(;++r=r?n:Vr(n,t,e)}var fu=Qt||function(n){return Kn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Tn(t).set(new Tn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Qa(n),a=void 0!==t,o=null===t,c=t==t,l=Qa(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function Au(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Ku(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Kn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Jr(e),r=Jr(r)):(e=Qr(e),r=Qr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Qu())),zr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Jr(t)).length;if(e<2)return e?Tr(t,n):t;var r=Tr(t,Xt(n/Gt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new Re:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(J,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=xe(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return Ke(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Qu(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Qu(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=zr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:Ar)(n,Qu(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=zr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Jt||function(){return Kn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=zr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Hu(Da));r|=32}return Wu(n,r,t,e,u)})),_a=zr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Hu(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=zr((function(n,t){return Ye(n,1,t)})),ba=zr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Qu())):dt(ir(t,1),Nt(Qu()))).length;return zr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Hn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var Ra=ee||ic,Ta=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function za(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Ga(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Va(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Ga(n){if(!$a(n)||hr(n)!=D)return!1;var t=Gn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ka=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ha(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Qa(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Ja=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ha(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?He(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Qa(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(K,"");var e=an.test(n);return e||cn.test(n)?Vn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Jr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(Ke);var vo=zr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Gu(n),e),r&&(e=Qe(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Gu(n),(function(n){return[n]}));return t=Qu(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var Ao=zu(yo),xo=zu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Tt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var Ro=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var To=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var zo=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return zn.test(n)}(n)?function(n){return n.match(Rn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=zr((function(n,t){try{return at(n,void 0,t)}catch(e){return za(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=Au(),Vo=Au(!0);function Go(n){return n}function Zo(n){return wr("function"==typeof n?n:Qe(n,1))}var Ko=zr((function(n,t){return function(e){return _r(e,n,t)}})),Ho=zr((function(n,t){return function(e){return _r(n,e,t)}}));function Qo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Jo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=Ru("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=Ru("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=Ru("round"),hc=Ou((function(n,t){return n-t}),0);return xe.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=pa,xe.assign=oo,xe.assignIn=co,xe.assignInWith=lo,xe.assignWith=fo,xe.at=so,xe.before=ga,xe.bind=Da,xe.bindAll=Po,xe.bindKey=_a,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},xe.chain=na,xe.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Jr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},xe.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),zr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},xe.tail=function(n){var t=null==n?0:n.length;return t?Vr(n,1,t):[]},xe.take=function(n,t,e){return n&&n.length?Vr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},xe.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Vr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},xe.takeRightWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},xe.thru=ta,xe.toArray=no,xe.toPairs=Ao,xe.toPairsIn=xo,xe.toPath=function(n){return Ba(n)?dt(n,Ci):Qa(n)?[n]:Du(Fi(ao(n)))},xe.toPlainObject=io,xe.transform=function(n,t,e){var r=Ba(n),u=r||Ra(n)||Ja(n);if(t=Qu(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Gn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},xe.unary=function(n){return pa(n,1)},xe.union=$i,xe.unionBy=qi,xe.unionWith=Vi,xe.uniq=function(n){return n&&n.length?Yr(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Yr(n,Qu(t,2)):[]},xe.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},xe.unset=function(n,t){return null==n||Xr(n,t)},xe.unzip=Gi,xe.unzipWith=Zi,xe.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},xe.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},xe.values=jo,xe.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},xe.without=Ki,xe.words=Mo,xe.wrap=function(n,t){return Ca(au(t),n)},xe.xor=Hi,xe.xorBy=Qi,xe.xorWith=Ji,xe.zip=Yi,xe.zipObject=function(n,t){return uu(n||[],t||[],$e)},xe.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},xe.zipWith=Xi,xe.entries=Ao,xe.entriesIn=xo,xe.extend=co,xe.extendWith=lo,Qo(xe,xe),xe.add=ac,xe.attempt=Uo,xe.camelCase=Oo,xe.capitalize=No,xe.ceil=oc,xe.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),He(uo(n),t,e)},xe.clone=function(n){return Qe(n,4)},xe.cloneDeep=function(n){return Qe(n,5)},xe.cloneDeepWith=function(n,t){return Qe(n,5,t="function"==typeof t?t:void 0)},xe.cloneWith=function(n,t){return Qe(n,4,t="function"==typeof t?t:void 0)},xe.conformsTo=function(n,t){return null==t||Je(n,t,yo(t))},xe.deburr=Bo,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=cc,xe.endsWith=function(n,t,e){n=ao(n),t=Jr(t);var r=n.length,u=e=void 0===e?r:He(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},xe.eq=xa,xe.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(T,zt):n},xe.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(G,"\\$&"):n},xe.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Qu(t,3))},xe.find=ua,xe.findIndex=Ni,xe.findKey=function(n,t){return yt(n,Qu(t,3),cr)},xe.findLast=ia,xe.findLastIndex=Bi,xe.findLastKey=function(n,t){return yt(n,Qu(t,3),lr)},xe.floor=lc,xe.forEach=aa,xe.forEachRight=oa,xe.forIn=function(n,t){return null==n?n:ar(n,Qu(t,3),bo)},xe.forInRight=function(n,t){return null==n?n:or(n,Qu(t,3),bo)},xe.forOwn=function(n,t){return n&&cr(n,Qu(t,3))},xe.forOwnRight=function(n,t){return n&&lr(n,Qu(t,3))},xe.get=po,xe.gt=ja,xe.gte=Oa,xe.has=function(n,t){return null!=n&&ri(n,t,pr)},xe.hasIn=go,xe.head=Si,xe.identity=Go,xe.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ha(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},xe.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},xe.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},xe.isSet=Ka,xe.isString=Ha,xe.isSymbol=Qa,xe.isTypedArray=Ja,xe.isUndefined=function(n){return void 0===n},xe.isWeakMap=function(n){return $a(n)&&ei(n)==E},xe.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},xe.join=function(n,t){return null==n?"":ue.call(n,t)},xe.kebabCase=Io,xe.last=zi,xe.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},xe.lowerCase=So,xe.lowerFirst=Lo,xe.lt=Ya,xe.lte=Xa,xe.max=function(n){return n&&n.length?rr(n,Go,dr):void 0},xe.maxBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),dr):void 0},xe.mean=function(n){return Ct(n,Go)},xe.meanBy=function(n,t){return Ct(n,Qu(t,2))},xe.min=function(n){return n&&n.length?rr(n,Go,kr):void 0},xe.minBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),kr):void 0},xe.stubArray=uc,xe.stubFalse=ic,xe.stubObject=function(){return{}},xe.stubString=function(){return""},xe.stubTrue=function(){return!0},xe.multiply=sc,xe.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},xe.noConflict=function(){return Kn._===this&&(Kn._=On),this},xe.noop=Jo,xe.now=da,xe.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},xe.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return Rr(n,t)},xe.reduce=function(n,t,e){var r=Ba(n)?gt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,nr)},xe.reduceRight=function(n,t,e){var r=Ba(n)?Dt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,tr)},xe.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Tr(ao(n),t)},xe.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Qu(t));++e=i)return n;var o=e-Gt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Jr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},xe.unescape=function(n){return(n=ao(n))&&z.test(n)?n.replace(R,Kt):n},xe.uniqueId=function(n){var t=++kn;return ao(n)+t},xe.upperCase=zo,xe.upperFirst=Wo,xe.each=aa,xe.eachRight=oa,xe.first=Si,Qo(xe,(fc={},cr(xe,(function(n,t){Cn.call(xe.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),xe.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){xe[n].placeholder=xe})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Qu(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Go)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=zr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Qu(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=xe[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(xe.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(xe,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=xe[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[xu(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=Ai(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,Xn&&(xe.prototype[Xn]=function(){return this}),xe}();Kn._=Ht,void 0===(u=function(){return Ht}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(456)(n))},454:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},455:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(473),e(439),e(78);var r=e(475),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},456:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},465:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(466);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(n,t,e){var r=e(467);n.exports=function(n,t){return new(r(n))(t)}},467:function(n,t,e){var r=e(13),u=e(468),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},474:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(430),a=e(423),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},475:function(n,t,e){var r=e(476);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},476:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},480:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(430),e(474)),o=e(423),c=e.n(o),l=e(455),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},516:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(428),e(439),e(430)),a=e(440),o=e.n(a),c=e(480),l=e(455),f=e(436),s=e(441);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"cloud_provider"==n.category})),A=k?k.value:null,x=D.find((function(n){return"provider"==n.category})),j=x?x.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,R=Object(f.a)().siteConfig.customFields.metadata,T=R.installation,z=R.sources,W=R.sinks,M=R.languages,U=R.frameworks,P=R.technologies,$=R.cloud_providers,q=R.providers,V=T.platforms,G=N&&V[N],Z=I&&z[I],K=L&&W[L],H=b&&M.find((function(n){return n.name===b})),Q=w&&U.find((function(n){return n.name===w})),J=C&&P.find((function(n){return n.name===C})),Y=A&&$.find((function(n){return n.name===A})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(G||Z),tn=null!=K,en=null;Q?en=r?Q.dark_logo_path:Q.logo_path:J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:X?en=r?X.dark_logo_path:X.logo_path:H?en=r?H.dark_logo_path:H.logo_path:G?en=G.logo_path:Z&&(en=Z.logo_path);var rn=null;return K&&(rn=K.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(450),d=e(451),p=e.n(d),g=e(423),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file +/*! For license information please see 004ec9e5.29a8450f.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{153:function(n,t,e){"use strict";e.r(t);e(428);var r=e(0),u=e.n(r),i=e(445),a=e(516),o=e(430);t.default=function(n){var t=n.metadata,e=n.items,r=t.allTagsPath,c=t.name,l=t.count;return u.a.createElement(i.a,{title:'Guides tagged "'+c+'"',description:'Guide | Tagged "'+c+'"'},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,l," ",function(n,t){return n>1?t+"s":t}(l,"guide"),' tagged with "',c,'"'),u.a.createElement("div",{className:"hero--subtitle"},u.a.createElement(o.a,{href:r},"View All Tags")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(a.a,{items:e})))}},423:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},445:function(n,t,e){"use strict";e(457);var r=e(0),u=e.n(r),i=e(458),a=e(444),o=e(1),c=(e(448),e(449),e(459),e(430)),l=e(460),f=e(440),s=e.n(f),v=e(461),h=e.n(v),d=e(436),p=e(423),g=e.n(p),D=e(135),_=e.n(D),m=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:g()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(o.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!a||a0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},u.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(R,n))}))):null)}))),(f||a)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(T,{alt:f.alt,url:v})):u.a.createElement(T,{alt:f.alt,url:v})),u.a.createElement("small",null,a),u.a.createElement("br",null))))},W=e(462),M=e(463),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.favicon,o=(e.tagline,e.title),c=e.themeConfig.image,l=e.url,f=n.children,s=n.title,v=n.noFooter,h=n.description,p=n.image,g=n.keywords,D=(n.permalink,n.version),_=s?s+" | "+o:o,m=p||c,y=l+Object(F.a)(m),b=Object(F.a)(r),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(a.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&u.a.createElement("title",null,_),_&&u.a.createElement("meta",{property:"og:title",content:_}),r&&u.a.createElement("link",{rel:"shortcut icon",href:b}),h&&u.a.createElement("meta",{name:"description",content:h}),h&&u.a.createElement("meta",{property:"og:description",content:h}),D&&u.a.createElement("meta",{name:"docsearch:version",content:D}),g&&g.length&&u.a.createElement("meta",{name:"keywords",content:g.join(",")}),m&&u.a.createElement("meta",{property:"og:image",content:y}),m&&u.a.createElement("meta",{property:"twitter:image",content:y}),m&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),w&&u.a.createElement("meta",{property:"og:url",content:w}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&u.a.createElement("link",{rel:"canonical",href:w})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},f),!v&&u.a.createElement(z,null)))}},450:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),a=e(423),o=e.n(a),c=e(436),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,a=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,a,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),a.children):i.a.createElement(n,a)}}},451:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",a="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",g="[object Number]",D="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",A="[object Int8Array]",x="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,R=/&(?:amp|lt|gt|quot|#39);/g,T=/[&<>"']/g,z=RegExp(R.source),W=RegExp(T.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(G.source),K=/^\s+|\s+$/g,H=/^\s+/,Q=/\s+$/,J=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,an=/^0b[01]+$/i,on=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",gn="["+dn+"]",Dn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",An="(?:"+yn+"|"+bn+")",xn="(?:"+kn+"|"+bn+")",jn="(?:"+Dn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+Dn+"?",Dn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(Dn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),Rn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[gn,kn,"$"].join("|")+")",xn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[gn,kn+An,"$"].join("|")+")",kn+"?"+An+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),Tn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[A]=Un[x]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[g]=Un[D]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[A]=Pn[x]=Pn[j]=Pn[p]=Pn[g]=Pn[D]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Vn=parseInt,Gn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Kn=Gn||Zn||Function("return this")(),Hn=t&&!t.nodeType&&t,Qn=Hn&&"object"==typeof r&&r&&!r.nodeType&&r,Jn=Qn&&Qn.exports===Hn,Yn=Jn&&Gn.process,Xn=function(){try{var n=Qn&&Qn.require&&Qn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function at(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function ot(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function Rt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var Tt=At({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),zt=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return Tn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Ht=function n(t){var e,r=(t=null==t?Kn:Ht.defaults(Kn.Object(),t,Ht.pick(Kn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,gn=t.Object,Dn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=gn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,An=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",xn=En.toString,jn=Fn.call(gn),On=Kn._,Nn=Dn("^"+Fn.call(Cn).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Jn?t.Buffer:void 0,Ln=t.Symbol,Tn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Gn=Pt(gn.getPrototypeOf,gn),Zn=gn.create,Hn=En.propertyIsEnumerable,Qn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,At=function(){try{var n=Xu(gn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Qt=t.clearTimeout!==Kn.clearTimeout&&t.clearTimeout,Jt=u&&u.now!==Kn.Date.now&&u.now,Yt=t.setTimeout!==Kn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=gn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(gn.keys,gn),ae=pn.max,oe=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),ge=Xu(t,"WeakMap"),De=Xu(gn,"create"),_e=ge&&new ge,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(ge),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,Ae=Ce?Ce.toString:void 0;function xe(n){if($a(n)&&!Ba(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return Ai(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!Pa(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Qe(n,t,e,r,u,i){var a,o=1&t,l=2&t,v=4&t;if(e&&(a=u?e(n,r,u,i):e(n)),void 0!==a)return a;if(!Pa(n))return n;var E=Ba(n);if(E){if(a=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!o)return Du(n,a)}else{var I=ei(n),S=I==h||I==d;if(Ra(n))return su(n,o);if(I==D||I==c||S&&!u){if(a=l||S?{}:ui(n),!o)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,bo(t),n)}(a,n)):function(n,t){return _u(n,ni(n),t)}(n,Ge(a,n))}else{if(!Pn[I])return u?n:{};a=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case A:case x:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case g:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?gn(ke.call(u)):{}}var u}(n,I,o)}}i||(i=new Te);var L=i.get(n);if(L)return L;i.set(n,a),Ka(n)?n.forEach((function(r){a.add(Qe(r,t,e,r,n,i))})):qa(n)&&n.forEach((function(r,u){a.set(u,Qe(r,t,e,u,n,i))}));var R=E?void 0:(v?l?Gu:Vu:l?bo:yo)(n);return ct(R||n,(function(r,u){R&&(r=n[u=r]),$e(a,u,Qe(r,t,e,u,n,i))})),a}function Je(n,t,e){var r=e.length;if(null==n)return!r;for(n=gn(n);r--;){var u=e[r],i=t[u],a=n[u];if(void 0===a&&!(u in n)||!i(a))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,a=!0,o=n.length,c=[],l=t.length;if(!o)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,a=!1):t.length>=200&&(i=It,a=!1,t=new Re(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Ju(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Ju(this,n).get(n)},Le.prototype.has=function(n){return Ju(this,n).has(n)},Le.prototype.set=function(n,t){var e=Ju(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},Re.prototype.add=Re.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Re.prototype.has=function(n){return this.__data__.has(n)},Te.prototype.clear=function(){this.__data__=new Se,this.size=0},Te.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},Te.prototype.get=function(n){return this.__data__.get(n)},Te.prototype.has=function(n){return this.__data__.has(n)},Te.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(o)?t>1?ir(o,t-1,e,r,u):pt(u,o):r||(u[u.length]=o)}return u}var ar=Eu(),or=Eu(!0);function cr(n,t){return n&&ar(n,t,yo)}function lr(n,t){return n&&or(n,t,yo)}function fr(n,t){return st(t,(function(t){return Wa(n[t])}))}function sr(n,t){for(var e=0,r=(t=ou(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function gr(n,t){return null!=n&&t in gn(n)}function Dr(n,t,e){for(var u=e?ht:vt,i=n[0].length,a=n.length,o=a,c=r(a),l=1/0,f=[];o--;){var s=n[o];o&&t&&(s=dt(s,Nt(t))),l=oe(s.length,l),c[o]=!e&&(t||i>=120&&s.length>=120)?new Re(o&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=o)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)o!==n&&Qn.call(o,c,1),Qn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;ai(u)?Qn.call(n,u,1):Xr(n,u)}}return n}function Rr(n,t){return n+ne(fe()*(t-n+1))}function Tr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function zr(n,t){return yi(di(n,t,Go),n+"")}function Wr(n){return We(jo(n))}function Mr(n,t){var e=jo(n);return wi(e,He(t,0,e.length))}function Ur(n,t,e,r){if(!Pa(n))return n;for(var u=-1,i=(t=ou(t,n)).length,a=i-1,o=n;null!=o&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var a=r(i);++u>>1,a=n[i];null!==a&&!Qa(a)&&(e?a<=t:a=200){var l=t?null:Tu(n);if(l)return qt(l);a=!1,u=It,c=new Re}else c=t?[]:o;n:for(;++r=r?n:Vr(n,t,e)}var fu=Qt||function(n){return Kn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new Tn(t).set(new Tn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Qa(n),a=void 0!==t,o=null===t,c=t==t,l=Qa(t);if(!o&&!l&&!i&&n>t||i&&a&&c&&!o&&!l||r&&a&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,a=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,a&&oi(e[0],e[1],a)&&(i=u<3?void 0:i,u=1),t=gn(t);++r-1?u[i?t[a]:a]:void 0}}function Au(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var a=t[r];if("function"!=typeof a)throw new mn(i);if(u&&!o&&"wrapper"==Ku(a))var o=new Ne([],!0)}for(r=o?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Kn&&this instanceof D&&(C=g||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Jr(e),r=Jr(r)):(e=Qr(e),r=Qr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Qu())),zr((function(e){var r=this;return n(t,(function(n){return at(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Jr(t)).length;if(e<2)return e?Tr(t,n):t;var r=Tr(t,Xt(n/Gt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&oi(t,e,u)&&(e=u=void 0),t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e,u){for(var i=-1,a=ae(Xt((t-n)/(e||1)),0),o=r(a);a--;)o[u?a:++i]=n,n+=e;return o}(t,e,u=void 0===u?to))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new Re:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(J,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(o,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function na(n){var t=xe(n);return t.__chain__=!0,t}function ta(n,t){return t(n)}var ea=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return Ke(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&ai(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:ta,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ra=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var ua=ku(Ni),ia=ku(Bi);function aa(n,t){return(Ba(n)?ct:nr)(n,Qu(t,3))}function oa(n,t){return(Ba(n)?lt:tr)(n,Qu(t,3))}var ca=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var la=zr((function(n,t,e){var u=-1,i="function"==typeof t,a=Sa(n)?r(n.length):[];return nr(n,(function(n){a[++u]=i?at(t,n,e):_r(n,t,e)})),a})),fa=mu((function(n,t,e){Ze(n,e,t)}));function sa(n,t){return(Ba(n)?dt:Ar)(n,Qu(t,3))}var va=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ha=zr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&oi(n,t[0],t[1])?t=[]:e>2&&oi(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),da=Jt||function(){return Kn.Date.now()};function pa(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function ga(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var Da=zr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Hu(Da));r|=32}return Wu(n,r,t,e,u)})),_a=zr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Hu(_a));r|=32}return Wu(t,r,n,e,u)}));function ma(n,t,e){var r,u,a,o,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,o=n.apply(i,e)}function p(n){return f=n,c=mi(D,t),s?d(n):o}function g(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=a}function D(){var n=da();if(g(n))return _(n);c=mi(D,function(n){var e=t-(n-l);return v?oe(e,a-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,o)}function m(){var n=da(),e=g(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(D,t),d(l)}return void 0===c&&(c=mi(D,t)),o}return t=uo(t)||0,Pa(e)&&(s=!!e.leading,a=(v="maxWait"in e)?ae(uo(e.maxWait)||0,t):a,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?o:_(da())},m}var ya=zr((function(n,t){return Ye(n,1,t)})),ba=zr((function(n,t,e){return Ye(n,uo(t)||0,e)}));function Ea(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var a=n.apply(this,r);return e.cache=i.set(u,a)||i,a};return e.cache=new(Ea.Cache||Le),e}function wa(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Ea.Cache=Le;var Fa=cu((function(n,t){var e=(t=1==t.length&&Ba(t[0])?dt(t[0],Nt(Qu())):dt(ir(t,1),Nt(Qu()))).length;return zr((function(r){for(var u=-1,i=oe(r.length,e);++u=t})),Na=mr(function(){return arguments}())?mr:function(n){return $a(n)&&Cn.call(n,"callee")&&!Hn.call(n,"callee")},Ba=r.isArray,Ia=nt?Nt(nt):function(n){return $a(n)&&hr(n)==w};function Sa(n){return null!=n&&Ua(n.length)&&!Wa(n)}function La(n){return $a(n)&&Sa(n)}var Ra=ee||ic,Ta=tt?Nt(tt):function(n){return $a(n)&&hr(n)==s};function za(n){if(!$a(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Ga(n)}function Wa(n){if(!Pa(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Ma(n){return"number"==typeof n&&n==eo(n)}function Ua(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function Pa(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function $a(n){return null!=n&&"object"==typeof n}var qa=et?Nt(et):function(n){return $a(n)&&ei(n)==p};function Va(n){return"number"==typeof n||$a(n)&&hr(n)==g}function Ga(n){if(!$a(n)||hr(n)!=D)return!1;var t=Gn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Za=rt?Nt(rt):function(n){return $a(n)&&hr(n)==_};var Ka=ut?Nt(ut):function(n){return $a(n)&&ei(n)==m};function Ha(n){return"string"==typeof n||!Ba(n)&&$a(n)&&hr(n)==y}function Qa(n){return"symbol"==typeof n||$a(n)&&hr(n)==b}var Ja=it?Nt(it):function(n){return $a(n)&&Ua(n.length)&&!!Un[hr(n)]};var Ya=Su(kr),Xa=Su((function(n,t){return n<=t}));function no(n){if(!n)return[];if(Sa(n))return Ha(n)?Zt(n):Du(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:jo)(n)}function to(n){return n?(n=uo(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function eo(n){var t=to(n),e=t%1;return t==t?e?t-e:t:0}function ro(n){return n?He(eo(n),0,4294967295):0}function uo(n){if("number"==typeof n)return n;if(Qa(n))return NaN;if(Pa(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=Pa(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(K,"");var e=an.test(n);return e||cn.test(n)?Vn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function io(n){return _u(n,bo(n))}function ao(n){return null==n?"":Jr(n)}var oo=yu((function(n,t){if(si(t)||Sa(t))_u(t,yo(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),co=yu((function(n,t){_u(t,bo(t),n)})),lo=yu((function(n,t,e,r){_u(t,bo(t),n,r)})),fo=yu((function(n,t,e,r){_u(t,yo(t),n,r)})),so=qu(Ke);var vo=zr((function(n,t){n=gn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&oi(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Gu(n),e),r&&(e=Qe(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Co=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return go(n,e)}))}(n,t)}));function ko(n,t){if(null==n)return{};var e=dt(Gu(n),(function(n){return[n]}));return t=Qu(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var Ao=zu(yo),xo=zu(bo);function jo(n){return null==n?[]:Bt(n,yo(n))}var Oo=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?No(t):t)}));function No(n){return Wo(ao(n).toLowerCase())}function Bo(n){return(n=ao(n))&&n.replace(fn,Tt).replace(Sn,"")}var Io=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),So=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),Lo=wu("toLowerCase");var Ro=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var To=Fu((function(n,t,e){return n+(e?" ":"")+Wo(t)}));var zo=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wo=wu("toUpperCase");function Mo(n,t,e){return n=ao(n),void 0===(t=e?void 0:t)?function(n){return zn.test(n)}(n)?function(n){return n.match(Rn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Uo=zr((function(n,t){try{return at(n,void 0,t)}catch(e){return za(e)?e:new hn(e)}})),Po=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,Da(n[t],n))})),n}));function $o(n){return function(){return n}}var qo=Au(),Vo=Au(!0);function Go(n){return n}function Zo(n){return wr("function"==typeof n?n:Qe(n,1))}var Ko=zr((function(n,t){return function(e){return _r(e,n,t)}})),Ho=zr((function(n,t){return function(e){return _r(n,e,t)}}));function Qo(n,t,e){var r=yo(t),u=fr(t,r);null!=e||Pa(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,yo(t)));var i=!(Pa(e)&&"chain"in e&&!e.chain),a=Wa(n);return ct(u,(function(e){var r=t[e];n[e]=r,a&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=Du(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Jo(){}var Yo=Nu(dt),Xo=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var ac=Ou((function(n,t){return n+t}),0),oc=Ru("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=Ru("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=Ru("round"),hc=Ou((function(n,t){return n-t}),0);return xe.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=eo(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=pa,xe.assign=oo,xe.assignIn=co,xe.assignInWith=lo,xe.assignWith=fo,xe.at=so,xe.before=ga,xe.bind=Da,xe.bindAll=Po,xe.bindKey=_a,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Ba(n)?n:[n]},xe.chain=na,xe.chunk=function(n,t,e){t=(e?oi(n,t,e):void 0===t)?1:ae(eo(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,a=0,o=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:eo(r))<0&&(r+=u),r=e>r?0:ro(r);e>>0)?(n=ao(n))&&("string"==typeof t||null!=t&&!Za(t))&&!(t=Jr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},xe.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:ae(eo(t),0),zr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),at(n,this,u)}))},xe.tail=function(n){var t=null==n?0:n.length;return t?Vr(n,1,t):[]},xe.take=function(n,t,e){return n&&n.length?Vr(n,0,(t=e||void 0===t?1:eo(t))<0?0:t):[]},xe.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Vr(n,(t=r-(t=e||void 0===t?1:eo(t)))<0?0:t,r):[]},xe.takeRightWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return Pa(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),ma(n,t,{leading:r,maxWait:t,trailing:u})},xe.thru=ta,xe.toArray=no,xe.toPairs=Ao,xe.toPairsIn=xo,xe.toPath=function(n){return Ba(n)?dt(n,Ci):Qa(n)?[n]:Du(Fi(ao(n)))},xe.toPlainObject=io,xe.transform=function(n,t,e){var r=Ba(n),u=r||Ra(n)||Ja(n);if(t=Qu(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:Pa(n)&&Wa(i)?je(Gn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},xe.unary=function(n){return pa(n,1)},xe.union=$i,xe.unionBy=qi,xe.unionWith=Vi,xe.uniq=function(n){return n&&n.length?Yr(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Yr(n,Qu(t,2)):[]},xe.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},xe.unset=function(n,t){return null==n||Xr(n,t)},xe.unzip=Gi,xe.unzipWith=Zi,xe.update=function(n,t,e){return null==n?n:nu(n,t,au(e))},xe.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,au(e),r)},xe.values=jo,xe.valuesIn=function(n){return null==n?[]:Bt(n,bo(n))},xe.without=Ki,xe.words=Mo,xe.wrap=function(n,t){return Ca(au(t),n)},xe.xor=Hi,xe.xorBy=Qi,xe.xorWith=Ji,xe.zip=Yi,xe.zipObject=function(n,t){return uu(n||[],t||[],$e)},xe.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},xe.zipWith=Xi,xe.entries=Ao,xe.entriesIn=xo,xe.extend=co,xe.extendWith=lo,Qo(xe,xe),xe.add=ac,xe.attempt=Uo,xe.camelCase=Oo,xe.capitalize=No,xe.ceil=oc,xe.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=uo(e))==e?e:0),void 0!==t&&(t=(t=uo(t))==t?t:0),He(uo(n),t,e)},xe.clone=function(n){return Qe(n,4)},xe.cloneDeep=function(n){return Qe(n,5)},xe.cloneDeepWith=function(n,t){return Qe(n,5,t="function"==typeof t?t:void 0)},xe.cloneWith=function(n,t){return Qe(n,4,t="function"==typeof t?t:void 0)},xe.conformsTo=function(n,t){return null==t||Je(n,t,yo(t))},xe.deburr=Bo,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=cc,xe.endsWith=function(n,t,e){n=ao(n),t=Jr(t);var r=n.length,u=e=void 0===e?r:He(eo(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},xe.eq=xa,xe.escape=function(n){return(n=ao(n))&&W.test(n)?n.replace(T,zt):n},xe.escapeRegExp=function(n){return(n=ao(n))&&Z.test(n)?n.replace(G,"\\$&"):n},xe.every=function(n,t,e){var r=Ba(n)?ft:er;return e&&oi(n,t,e)&&(t=void 0),r(n,Qu(t,3))},xe.find=ua,xe.findIndex=Ni,xe.findKey=function(n,t){return yt(n,Qu(t,3),cr)},xe.findLast=ia,xe.findLastIndex=Bi,xe.findLastKey=function(n,t){return yt(n,Qu(t,3),lr)},xe.floor=lc,xe.forEach=aa,xe.forEachRight=oa,xe.forIn=function(n,t){return null==n?n:ar(n,Qu(t,3),bo)},xe.forInRight=function(n,t){return null==n?n:or(n,Qu(t,3),bo)},xe.forOwn=function(n,t){return n&&cr(n,Qu(t,3))},xe.forOwnRight=function(n,t){return n&&lr(n,Qu(t,3))},xe.get=po,xe.gt=ja,xe.gte=Oa,xe.has=function(n,t){return null!=n&&ri(n,t,pr)},xe.hasIn=go,xe.head=Si,xe.identity=Go,xe.includes=function(n,t,e,r){n=Sa(n)?n:jo(n),e=e&&!r?eo(e):0;var u=n.length;return e<0&&(e=ae(u+e,0)),Ha(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},xe.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:eo(e);return u<0&&(u=ae(r+u,0)),Et(n,t,u)},xe.inRange=function(n,t,e){return t=to(t),void 0===e?(e=t,t=0):e=to(e),function(n,t,e){return n>=oe(t,e)&&n=-9007199254740991&&n<=9007199254740991},xe.isSet=Ka,xe.isString=Ha,xe.isSymbol=Qa,xe.isTypedArray=Ja,xe.isUndefined=function(n){return void 0===n},xe.isWeakMap=function(n){return $a(n)&&ei(n)==E},xe.isWeakSet=function(n){return $a(n)&&"[object WeakSet]"==hr(n)},xe.join=function(n,t){return null==n?"":ue.call(n,t)},xe.kebabCase=Io,xe.last=zi,xe.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=eo(e))<0?ae(r+u,0):oe(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},xe.lowerCase=So,xe.lowerFirst=Lo,xe.lt=Ya,xe.lte=Xa,xe.max=function(n){return n&&n.length?rr(n,Go,dr):void 0},xe.maxBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),dr):void 0},xe.mean=function(n){return Ct(n,Go)},xe.meanBy=function(n,t){return Ct(n,Qu(t,2))},xe.min=function(n){return n&&n.length?rr(n,Go,kr):void 0},xe.minBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),kr):void 0},xe.stubArray=uc,xe.stubFalse=ic,xe.stubObject=function(){return{}},xe.stubString=function(){return""},xe.stubTrue=function(){return!0},xe.multiply=sc,xe.nth=function(n,t){return n&&n.length?Nr(n,eo(t)):void 0},xe.noConflict=function(){return Kn._===this&&(Kn._=On),this},xe.noop=Jo,xe.now=da,xe.pad=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},xe.padEnd=function(n,t,e){n=ao(n);var r=(t=eo(t))?Gt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return oe(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return Rr(n,t)},xe.reduce=function(n,t,e){var r=Ba(n)?gt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,nr)},xe.reduceRight=function(n,t,e){var r=Ba(n)?Dt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,tr)},xe.repeat=function(n,t,e){return t=(e?oi(n,t,e):void 0===t)?1:eo(t),Tr(ao(n),t)},xe.replace=function(){var n=arguments,t=ao(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,t,e){var r=-1,u=(t=ou(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=oe(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Qu(t));++e=i)return n;var o=e-Gt(r);if(o<1)return r;var c=a?lu(a,0,o).join(""):n.slice(0,o);if(void 0===u)return c+r;if(a&&(o+=c.length-o),Za(u)){if(n.slice(o).search(u)){var l,f=c;for(u.global||(u=Dn(u.source,ao(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?o:s)}}else if(n.indexOf(Jr(u),o)!=o){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},xe.unescape=function(n){return(n=ao(n))&&z.test(n)?n.replace(R,Kt):n},xe.uniqueId=function(n){var t=++kn;return ao(n)+t},xe.upperCase=zo,xe.upperFirst=Wo,xe.each=aa,xe.eachRight=oa,xe.first=Si,Qo(xe,(fc={},cr(xe,(function(n,t){Cn.call(xe.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),xe.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){xe[n].placeholder=xe})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:ae(eo(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=oe(e,r.__takeCount__):r.__views__.push({size:oe(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Qu(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Go)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=zr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(wa(Qu(n)))},Be.prototype.slice=function(n,t){n=eo(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=eo(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=xe[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(xe.prototype[t]=function(){var t=this.__wrapped__,a=r?[1]:arguments,o=t instanceof Be,c=a[0],l=o||Ba(t),f=function(n){var t=u.apply(xe,pt([n],a));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(o=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=o&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,a);return p.__actions__.push({func:ta,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,a):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Ba(u)?u:[],n)}return this[e]((function(e){return t.apply(Ba(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=xe[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[xu(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=Du(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Du(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Du(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Ba(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=Ai(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:ta,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,Xn&&(xe.prototype[Xn]=function(){return this}),xe}();Kn._=Ht,void 0===(u=function(){return Ht}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(456)(n))},454:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},455:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(473),e(439),e(78);var r=e(475),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},456:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},465:function(n,t,e){var r=e(30),u=e(54),i=e(27),a=e(26),o=e(466);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||o;return function(t,o,d){for(var p,g,D=i(t),_=u(D),m=r(o,d,3),y=a(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(g=m(p=_[b],b,D),n))if(e)E[b]=g;else if(g)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(n,t,e){var r=e(467);n.exports=function(n,t){return new(r(n))(t)}},467:function(n,t,e){var r=e(13),u=e(468),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},474:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(430),a=e(423),o=e.n(a);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,a=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:o()("badge","badge--rounded","badge--"+a)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},475:function(n,t,e){var r=e(476);n.exports=o;var u=Object.hasOwnProperty,i=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(a,"").replace(r(),"").replace(i,"-"))}o.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=c},476:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},480:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),a=(e(430),e(474)),o=e(423),c=e.n(o),l=e(455),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,o=n.tags,f=n.valuesOnly,v=Object(l.a)(o,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(a.a,Object(r.a)({key:t,valueOnly:f},n))})))}},516:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(428),e(439),e(430)),a=e(440),o=e.n(a),c=e(480),l=e(455),f=e(436),s=e(441);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),a=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),g=(t.last_modified_on,t.title),D=Object(l.a)(d,"guides"),_=D.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=D.find((function(n){return"language"==n.category})),b=y?y.value:null,E=D.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=D.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=D.find((function(n){return"cloud_provider"==n.category})),A=k?k.value:null,x=D.find((function(n){return"provider"==n.category})),j=x?x.value:null,O=D.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=D.find((function(n){return"source"==n.category})),I=B?B.value:null,S=D.find((function(n){return"sink"==n.category})),L=S?S.value:null,R=Object(f.a)().siteConfig.customFields.metadata,T=R.installation,z=R.sources,W=R.sinks,M=R.languages,U=R.frameworks,P=R.technologies,$=R.cloud_providers,q=R.providers,V=T.platforms,G=N&&V[N],Z=I&&z[I],K=L&&W[L],H=b&&M.find((function(n){return n.name===b})),Q=w&&U.find((function(n){return n.name===w})),J=C&&P.find((function(n){return n.name===C})),Y=A&&$.find((function(n){return n.name===A})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(G||Z),tn=null!=K,en=null;Q?en=r?Q.dark_logo_path:Q.logo_path:J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:X?en=r?X.dark_logo_path:X.logo_path:H?en=r?H.dark_logo_path:H.logo_path:G?en=G.logo_path:Z&&(en=Z.logo_path);var rn=null;return K&&(rn=K.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},a[0].name),u.a.createElement("h2",{title:g},h&&h+". ",p||g)),u.a.createElement("footer",null,en&&u.a.createElement(o.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(o.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(450),d=e(451),p=e.n(d),g=e(423),D=e.n(g);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,a=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),o=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(a).map((function(n,t){var e=o[n],l=a[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var a,o=(a=e,p.a.sortBy(a,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:D()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},o.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file diff --git a/004ec9e5.4f0152e2.js.LICENSE.txt b/004ec9e5.29a8450f.js.LICENSE.txt similarity index 100% rename from 004ec9e5.4f0152e2.js.LICENSE.txt rename to 004ec9e5.29a8450f.js.LICENSE.txt diff --git a/03dbc155.57dfe7e9.js b/03dbc155.aa62e49e.js similarity index 99% rename from 03dbc155.57dfe7e9.js rename to 03dbc155.aa62e49e.js index e270c70db6..3030df1479 100644 --- a/03dbc155.57dfe7e9.js +++ b/03dbc155.aa62e49e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{156:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return s})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(425)),l=a(424),i=a(444),c=a(437),b=a(429),u={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","cloud_provider: aws"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"13 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"cloud_provider: aws",permalink:"/guides/tags/cloud-provider-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile or Use Buildpacks",id:"1-create-your-dockerfile-or-use-buildpacks",children:[{value:"Choose your Dockerfile template",id:"choose-your-dockerfile-template",children:[]},{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]},{value:"Limitations",id:"limitations",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you experience any problem while migrating from Heroku to AWS with Qovery.")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/cloud-provider/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile-or-use-buildpacks"}),"Use Buildpacks or Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile-or-use-buildpacks"},"1. Create your Dockerfile or Use Buildpacks"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Buildpacks"),Object(r.b)("li",{parentName:"ol"},"Docker")),Object(r.b)("p",null,"Both options build a container image that is runnable by a container engine (E.g. Docker). Qovery runs containers on Kubernetes."),Object(r.b)("p",null,"Choose the option that better fits you:"),Object(r.b)(c.a,{centered:!0,className:"rounded",defaultValue:"buildpacks",placeholder:"Use Buildpacks or Create your Dockerfile",select:!1,size:null,values:[{group:"Platforms",label:"Use Buildpacks",value:"buildpacks"},{group:"Platforms",label:"Create your Dockerfile",value:"dockerfile"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"dockerfile",mdxType:"TabItem"},Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h3",{id:"choose-your-dockerfile-template"},"Choose your Dockerfile template"),Object(r.b)("p",null,"To get started,"),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them.")),Object(r.b)(i.a,{value:"buildpacks",mdxType:"TabItem"},Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://buildpacks.io/"}),"Buildpacks")," automatically detects the language and the framework your application is using. Buildpacks builds and runs your app. Here is the list of ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#option-1-buildpacks"}),"supported languages and frameworks"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"We do recommend using Docker to keep the full control of what's going on behind the scene. Buildpacks is a great technology but difficult to debug when something goes wrong. You can try deploying your apps on AWS with Qovery with Buildpacks, if you do not succeed, we do recommend switching for Docker.")),Object(r.b)("h3",{id:"limitations"},"Limitations"),Object(r.b)("p",null,"Here are some limitations due to our Buildpacks implementation:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Qovery Buildpacks does not support Procfile with multiple commands at the moment."),Object(r.b)("li",{parentName:"ul"},"Qovery does not support custom Buildpacks.")),Object(r.b)("p",null,"Those limitations will be solved in the coming months."))),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select the Build mode for ",Object(r.b)("inlineCode",{parentName:"li"},"Buildpacks")," or ",Object(r.b)("inlineCode",{parentName:"li"},"Dockerfile")," according to what you want."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"If you use Buildpacks for one of your app AND you have indicated a local listening port of your application, you will need to add an environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"PORT")," with the value of your port to make your application starting properly. Otherwise, Qovery will fail to deploy your app!")),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Yes, with the Qovery CLI and the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell"),". ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"Check out the documentation"),"."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var o=a(0),n=a.n(o),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},428:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var o=a(0),n=a.n(o),r=a(424);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},437:function(e,t,a){"use strict";var o=a(1),n=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(449),i=a(423),c=a.n(i),b=a(433),u=a.n(b),s=a(448),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,u=e.selectedValue,s=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return s.push(e)},onKeyDown:function(e){return l(s,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(s.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var T=g[l];null!=T&&T!==k&&N(T)}var C=function(e){N(e),null!=l&&v(l,e)},D=[],A=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:C,handleKeydown:A,placeholder:c,selectedValue:k,size:y,tabRefs:D},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:C,handleKeydown:A,selectedValue:k,tabRefs:D},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},444:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{156:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return s})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(425)),l=a(424),i=a(443),c=a(437),b=a(429),u={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","cloud_provider: aws"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"13 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"cloud_provider: aws",permalink:"/guides/tags/cloud-provider-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile or Use Buildpacks",id:"1-create-your-dockerfile-or-use-buildpacks",children:[{value:"Choose your Dockerfile template",id:"choose-your-dockerfile-template",children:[]},{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]},{value:"Limitations",id:"limitations",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you experience any problem while migrating from Heroku to AWS with Qovery.")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/cloud-provider/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile-or-use-buildpacks"}),"Use Buildpacks or Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile-or-use-buildpacks"},"1. Create your Dockerfile or Use Buildpacks"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Buildpacks"),Object(r.b)("li",{parentName:"ol"},"Docker")),Object(r.b)("p",null,"Both options build a container image that is runnable by a container engine (E.g. Docker). Qovery runs containers on Kubernetes."),Object(r.b)("p",null,"Choose the option that better fits you:"),Object(r.b)(c.a,{centered:!0,className:"rounded",defaultValue:"buildpacks",placeholder:"Use Buildpacks or Create your Dockerfile",select:!1,size:null,values:[{group:"Platforms",label:"Use Buildpacks",value:"buildpacks"},{group:"Platforms",label:"Create your Dockerfile",value:"dockerfile"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"dockerfile",mdxType:"TabItem"},Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h3",{id:"choose-your-dockerfile-template"},"Choose your Dockerfile template"),Object(r.b)("p",null,"To get started,"),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them.")),Object(r.b)(i.a,{value:"buildpacks",mdxType:"TabItem"},Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://buildpacks.io/"}),"Buildpacks")," automatically detects the language and the framework your application is using. Buildpacks builds and runs your app. Here is the list of ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#option-1-buildpacks"}),"supported languages and frameworks"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"We do recommend using Docker to keep the full control of what's going on behind the scene. Buildpacks is a great technology but difficult to debug when something goes wrong. You can try deploying your apps on AWS with Qovery with Buildpacks, if you do not succeed, we do recommend switching for Docker.")),Object(r.b)("h3",{id:"limitations"},"Limitations"),Object(r.b)("p",null,"Here are some limitations due to our Buildpacks implementation:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Qovery Buildpacks does not support Procfile with multiple commands at the moment."),Object(r.b)("li",{parentName:"ul"},"Qovery does not support custom Buildpacks.")),Object(r.b)("p",null,"Those limitations will be solved in the coming months."))),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select the Build mode for ",Object(r.b)("inlineCode",{parentName:"li"},"Buildpacks")," or ",Object(r.b)("inlineCode",{parentName:"li"},"Dockerfile")," according to what you want."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"If you use Buildpacks for one of your app AND you have indicated a local listening port of your application, you will need to add an environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"PORT")," with the value of your port to make your application starting properly. Otherwise, Qovery will fail to deploy your app!")),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Yes, with the Qovery CLI and the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell"),". ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"Check out the documentation"),"."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var o=a(0),n=a.n(o),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},428:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var o=a(0),n=a.n(o),r=a(424);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},437:function(e,t,a){"use strict";var o=a(1),n=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(447),i=a(423),c=a.n(i),b=a(433),u=a.n(b),s=a(446),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,u=e.selectedValue,s=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return s.push(e)},onKeyDown:function(e){return l(s,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(s.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var T=g[l];null!=T&&T!==k&&N(T)}var C=function(e){N(e),null!=l&&v(l,e)},D=[],A=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:C,handleKeydown:A,placeholder:c,selectedValue:k,size:y,tabRefs:D},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:C,handleKeydown:A,selectedValue:k,tabRefs:D},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},443:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/1.5236ee97.js b/1.b6bd6afb.js similarity index 99% rename from 1.5236ee97.js rename to 1.b6bd6afb.js index 1959723a3a..85eea5d801 100644 --- a/1.5236ee97.js +++ b/1.b6bd6afb.js @@ -1,2 +1,2 @@ -/*! For license information please see 1.5236ee97.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{423:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),c=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a({},t,{},e)),n},p=function(e){var t=c(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(u,".").concat(d)]||p[d]||f[d]||i;return n?o.a.createElement(h,a({ref:t},l,{components:n})):o.a.createElement(h,a({ref:t},l))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,u=new Array(i);u[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,u[1]=a;for(var l=2;l1?arguments[1]:void 0,n),s=u>2?arguments[2]:void 0,l=void 0===s?n:o(s,n);l>a;)t[a++]=e;return t}},433:function(e,t,n){"use strict";var r=n(435),o=n(51);function i(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[i(t,e),"[",r,"]"].join(""):[i(t,e),"[",i(r,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var o=e[r];if(void 0===o)return"";if(null===o)return i(r,t);if(Array.isArray(o)){var u=[];return o.slice().forEach((function(e){void 0!==e&&u.push(n(r,e,u.length))})),u.join("&")}return i(r,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}},439:function(e,t,n){"use strict";var r=n(12),o=n(465)(5),i=!0;"find"in[]&&Array(1).find((function(){i=!1})),r(r.P+r.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(74)("find")},442:function(e,t,n){"use strict";var r=n(8),o=n(486),i=n(55);n(56)("search",1,(function(e,t,n,u){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=u(n,e,this);if(t.done)return t.value;var a=r(e),s=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var c=i(a,s);return o(a.lastIndex,l)||(a.lastIndex=l),null===c?-1:c.index}]}))},448:function(e,t,n){"use strict";var r=n(0),o=n(454);t.a=function(){return Object(r.useContext)(o.a)}},449:function(e,t,n){"use strict";var r=n(0),o=n.n(r);function i(e,t){if(e.length!==t.length)return!1;for(var n=0;nr&&(r=(t=t.trim()).charCodeAt(0)),r){case 38:return t.replace(m,"$1"+e.trim());case 58:return e.trim()+t.replace(m,"$1"+e.trim());default:if(0<1*n&&0s.charCodeAt(8))break;case 115:u=u.replace(s,"-webkit-"+s)+";"+u;break;case 207:case 102:u=u.replace(s,"-webkit-"+(102a.charCodeAt(0)&&(a=a.trim()),a=[a],0d)&&(N=(U=U.replace(" ",":")).length),0=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)},b={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var E=/[A-Z]|^ms/g,y=/_EMO_([^_]+?)_([^]*?)_EMO_/g,C=function(e){return 45===e.charCodeAt(1)},O=function(e){return null!=e&&"boolean"!=typeof e},A=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}((function(e){return C(e)?e:e.replace(E,"-$&").toLowerCase()})),w=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(y,(function(e,t,n){return x={name:t,styles:n,next:x},t}))}return 1===b[e]||C(e)||"number"!=typeof t||0===t?t:t+"px"};function F(e,t,n,r){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return x={name:n.name,styles:n.styles,next:x},n.name;if(void 0!==n.styles){var o=n.next;if(void 0!==o)for(;void 0!==o;)x={name:o.name,styles:o.styles,next:x},o=o.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o-1}function J(e){return K(e)?window.pageYOffset:e.scrollTop}function q(e,t){K(e)?window.scrollTo(0,t):e.scrollTop=t}function Z(e,t,n,r){void 0===n&&(n=200),void 0===r&&(r=G);var o=J(e),i=t-o,u=0;!function t(){var a,s=i*((a=(a=u+=10)/n-1)*a*a+1)+o;q(e,s),u=d)return{placement:"bottom",maxHeight:t};if(A>=d&&!u)return i&&Z(s,w,160),{placement:"bottom",maxHeight:t};if(!u&&A>=r||u&&C>=r)return i&&Z(s,w,160),{placement:"bottom",maxHeight:u?C-b:A-b};if("auto"===o||u){var x=t,S=u?y:O;return S>=r&&(x=Math.min(S-b-a.controlHeight,t)),{placement:"top",maxHeight:x}}if("bottom"===o)return q(s,w),{placement:"bottom",maxHeight:t};break;case"top":if(y>=d)return{placement:"top",maxHeight:t};if(O>=d&&!u)return i&&Z(s,F,160),{placement:"top",maxHeight:t};if(!u&&O>=r||u&&y>=r){var D=t;return(!u&&O>=r||u&&y>=r)&&(D=u?y-E:O-E),i&&Z(s,F,160),{placement:"top",maxHeight:D}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'+o+'".')}return l}var ie=function(e){return"auto"===e?"bottom":e},ue=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=e[n]);return o}(e,["size"]);return B("svg",Ee({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:ye},n))},Oe=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},Ae=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},we=function(e){var t=e.isFocused,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorContainer",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*r,transition:"color 150ms",":hover":{color:t?o.neutral80:o.neutral40}}},Fe=we,xe=we,Se=function(){var e=k.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}(be()),De=function(e){var t=e.delay,n=e.offset;return B("span",{css:k({animation:Se+" 1s ease-in-out "+t+"ms infinite;",backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":null,height:"1em",verticalAlign:"top",width:"1em"},"")})},ke=function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps,i=e.isRtl;return B("div",Ee({},o,{css:r("loadingIndicator",e),className:n({indicator:!0,"loading-indicator":!0},t)}),B(De,{delay:0,offset:i}),B(De,{delay:160,offset:!0}),B(De,{delay:320,offset:!i}))};function Ie(){return(Ie=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","theme","selectProps"]));return B("div",Me({css:r("groupHeading",Me({theme:o},i)),className:n({"group-heading":!0},t)},i))},IndicatorsContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles;return B("div",{css:o("indicatorsContainer",e),className:r({indicators:!0},n)},t)},IndicatorSeparator:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps;return B("span",Ee({},o,{css:r("indicatorSeparator",e),className:n({"indicator-separator":!0},t)}))},Input:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerRef,i=e.isHidden,u=e.isDisabled,a=e.theme,s=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","innerRef","isHidden","isDisabled","theme","selectProps"]));return B("div",{css:r("input",Pe({theme:a},s))},B(te.a,Pe({className:n({input:!0},t),inputRef:o,inputStyle:Le(i),disabled:u},s)))},LoadingIndicator:ke,Menu:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerRef,u=e.innerProps;return B("div",ne({css:o("menu",e),className:r({menu:!0},n)},u,{ref:i}),t)},MenuList:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isMulti,u=e.innerRef;return B("div",{css:o("menuList",e),className:r({"menu-list":!0,"menu-list--is-multi":i},n),ref:u},t)},MenuPortal:fe,LoadingMessage:pe,NoOptionsMessage:ce,MultiValue:Be,MultiValueContainer:Re,MultiValueLabel:je,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return B("div",n,t||B(Oe,{size:14}))},Option:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.isFocused,a=e.isSelected,s=e.innerRef,l=e.innerProps;return B("div",Ne({css:o("option",e),className:r({option:!0,"option--is-disabled":i,"option--is-focused":u,"option--is-selected":a},n),ref:s},l),t)},Placeholder:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps;return B("div",He({css:o("placeholder",e),className:r({placeholder:!0},n)},i),t)},SelectContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps,u=e.isDisabled,a=e.isRtl;return B("div",ge({css:o("container",e),className:r({"--is-disabled":u,"--is-rtl":a},n)},i),t)},SingleValue:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.innerProps;return B("div",_e({css:o("singleValue",e),className:r({"single-value":!0,"single-value--is-disabled":i},n)},u),t)},ValueContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.isMulti,i=e.getStyles,u=e.hasValue;return B("div",{css:i("valueContainer",e),className:r({"value-container":!0,"value-container--is-multi":o,"value-container--has-value":u},n)},t)}},We=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],Ge=function(e){for(var t=0;t=0||(o[n]=e[n]);return o}(e,["in","out","onExited","appear","enter","exit","innerRef","emotion"]));return B("input",Ze({ref:t},n,{css:k({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"")}))}var et=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.props.innerRef(Object(U.findDOMNode)(this))},o.componentWillUnmount=function(){this.props.innerRef(null)},o.render=function(){return this.props.children},r}(r.Component),tt=["boxSizing","height","overflow","paddingRight","position"],nt={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function rt(e){e.preventDefault()}function ot(e){e.stopPropagation()}function it(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function ut(){return"ontouchstart"in window||navigator.maxTouchPoints}var at=!(!window.document||!window.document.createElement),st=0,lt=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o0,h=c-p-l,m=!1;h>n&&t.isBottom&&(i&&i(e),t.isBottom=!1),d&&t.isTop&&(a&&a(e),t.isTop=!1),d&&n>h?(o&&!t.isBottom&&o(e),f.scrollTop=c,m=!0,t.isBottom=!0):!d&&-n>l&&(u&&!t.isTop&&u(e),f.scrollTop=0,m=!0,t.isTop=!0),m&&t.cancelScroll(e)},t.onWheel=function(e){t.handleEventDelta(e,e.deltaY)},t.onTouchStart=function(e){t.touchStart=e.changedTouches[0].clientY},t.onTouchMove=function(e){var n=t.touchStart-e.changedTouches[0].clientY;t.handleEventDelta(e,n)},t.getScrollTarget=function(e){t.scrollTarget=e},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListening(this.scrollTarget)},i.componentWillUnmount=function(){this.stopListening(this.scrollTarget)},i.startListening=function(e){e&&("function"==typeof e.addEventListener&&e.addEventListener("wheel",this.onWheel,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchmove",this.onTouchMove,!1))},i.stopListening=function(e){"function"==typeof e.removeEventListener&&e.removeEventListener("wheel",this.onWheel,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchmove",this.onTouchMove,!1)},i.render=function(){return o.a.createElement(et,{innerRef:this.getScrollTarget},this.props.children)},r}(r.Component);function dt(e){var t=e.isEnabled,n=void 0===t||t,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["isEnabled"]);return n?o.a.createElement(ft,r):r.children}var ht=function(e,t){void 0===t&&(t={});var n=t,r=n.isSearchable,o=n.isMulti,i=n.label,u=n.isDisabled;switch(e){case"menu":return"Use Up and Down to choose options"+(u?"":", press Enter to select the currently focused option")+", press Escape to exit the menu, press Tab to select the option and exit the menu.";case"input":return(i||"Select")+" is focused "+(r?",type to refine list":"")+", press Down to open the menu, "+(o?" press left to focus selected values":"");case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value"}},mt=function(e,t){var n=t.value,r=t.isDisabled;if(n)switch(e){case"deselect-option":case"pop-value":case"remove-value":return"option "+n+", deselected.";case"select-option":return r?"option "+n+" is disabled. Select another option.":"option "+n+", selected."}},vt=function(e){return!!e.isDisabled};var gt={clearIndicator:xe,container:function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":null,pointerEvents:t?"none":null,position:"relative"}},control:function(e){var t=e.isDisabled,n=e.isFocused,r=e.theme,o=r.colors,i=r.borderRadius,u=r.spacing;return{label:"control",alignItems:"center",backgroundColor:t?o.neutral5:o.neutral0,borderColor:t?o.neutral10:n?o.primary:o.neutral20,borderRadius:i,borderStyle:"solid",borderWidth:1,boxShadow:n?"0 0 0 1px "+o.primary:null,cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:u.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms","&:hover":{borderColor:n?o.primary:o.neutral30}}},dropdownIndicator:Fe,group:function(e){var t=e.theme.spacing;return{paddingBottom:2*t.baseUnit,paddingTop:2*t.baseUnit}},groupHeading:function(e){var t=e.theme.spacing;return{label:"group",color:"#999",cursor:"default",display:"block",fontSize:"75%",fontWeight:"500",marginBottom:"0.25em",paddingLeft:3*t.baseUnit,paddingRight:3*t.baseUnit,textTransform:"uppercase"}},indicatorsContainer:function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},indicatorSeparator:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorSeparator",alignSelf:"stretch",backgroundColor:t?o.neutral10:o.neutral20,marginBottom:2*r,marginTop:2*r,width:1}},input:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{margin:r.baseUnit/2,paddingBottom:r.baseUnit/2,paddingTop:r.baseUnit/2,visibility:t?"hidden":"visible",color:o.neutral80}},loadingIndicator:function(e){var t=e.isFocused,n=e.size,r=e.theme,o=r.colors,i=r.spacing.baseUnit;return{label:"loadingIndicator",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*i,transition:"color 150ms",alignSelf:"center",fontSize:n,lineHeight:1,marginRight:n,textAlign:"center",verticalAlign:"middle"}},loadingMessage:le,menu:function(e){var t,n=e.placement,r=e.theme,o=r.borderRadius,i=r.spacing,u=r.colors;return(t={label:"menu"})[function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(n)]="100%",t.backgroundColor=u.neutral0,t.borderRadius=o,t.boxShadow="0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",t.marginBottom=i.menuGutter,t.marginTop=i.menuGutter,t.position="absolute",t.width="100%",t.zIndex=1,t},menuList:function(e){var t=e.maxHeight,n=e.theme.spacing.baseUnit;return{maxHeight:t,overflowY:"auto",paddingBottom:n,paddingTop:n,position:"relative",WebkitOverflowScrolling:"touch"}},menuPortal:function(e){var t=e.rect,n=e.offset,r=e.position;return{left:t.left,position:r,top:n,width:t.width,zIndex:1}},multiValue:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius;return{label:"multiValue",backgroundColor:t.colors.neutral10,borderRadius:r/2,display:"flex",margin:n.baseUnit/2,minWidth:0}},multiValueLabel:function(e){var t=e.theme,n=t.borderRadius,r=t.colors,o=e.cropWithEllipsis;return{borderRadius:n/2,color:r.neutral80,fontSize:"85%",overflow:"hidden",padding:3,paddingLeft:6,textOverflow:o?"ellipsis":null,whiteSpace:"nowrap"}},multiValueRemove:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius,o=t.colors;return{alignItems:"center",borderRadius:r/2,backgroundColor:e.isFocused&&o.dangerLight,display:"flex",paddingLeft:n.baseUnit,paddingRight:n.baseUnit,":hover":{backgroundColor:o.dangerLight,color:o.danger}}},noOptionsMessage:se,option:function(e){var t=e.isDisabled,n=e.isFocused,r=e.isSelected,o=e.theme,i=o.spacing,u=o.colors;return{label:"option",backgroundColor:r?u.primary:n?u.primary25:"transparent",color:t?u.neutral20:r?u.neutral0:"inherit",cursor:"default",display:"block",fontSize:"inherit",padding:2*i.baseUnit+"px "+3*i.baseUnit+"px",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",":active":{backgroundColor:!t&&(r?u.primary:u.primary50)}}},placeholder:function(e){var t=e.theme,n=t.spacing;return{label:"placeholder",color:t.colors.neutral50,marginLeft:n.baseUnit/2,marginRight:n.baseUnit/2,position:"absolute",top:"50%",transform:"translateY(-50%)"}},singleValue:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{label:"singleValue",color:t?o.neutral40:o.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2,maxWidth:"calc(100% - "+2*r.baseUnit+"px)",overflow:"hidden",position:"absolute",textOverflow:"ellipsis",whiteSpace:"nowrap",top:"50%",transform:"translateY(-50%)"}},valueContainer:function(e){var t=e.theme.spacing;return{alignItems:"center",display:"flex",flex:1,flexWrap:"wrap",padding:t.baseUnit/2+"px "+2*t.baseUnit+"px",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"}}};var bt={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}};function Et(){return(Et=Object.assign||function(e){for(var t=1;t-1},formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:vt,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}}(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return t+" result"+(1!==t?"s":"")+" available"},styles:{},tabIndex:"0",tabSelectsValue:!0},At=1,wt=function(e){var t,n;function r(t){var n;(n=e.call(this,t)||this).state={ariaLiveSelection:"",ariaLiveContext:"",focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,menuOptions:{render:[],focusable:[]},selectValue:[]},n.blockOptionHover=!1,n.isComposing=!1,n.clearFocusValueOnUpdate=!1,n.commonProps=void 0,n.components=void 0,n.hasGroups=!1,n.initialTouchX=0,n.initialTouchY=0,n.inputIsHiddenAfterUpdate=void 0,n.instancePrefix="",n.openAfterFocus=!1,n.scrollToFocusedOptionOnUpdate=!1,n.userIsDragging=void 0,n.controlRef=null,n.getControlRef=function(e){n.controlRef=e},n.focusedOptionRef=null,n.getFocusedOptionRef=function(e){n.focusedOptionRef=e},n.menuListRef=null,n.getMenuListRef=function(e){n.menuListRef=e},n.inputRef=null,n.getInputRef=function(e){n.inputRef=e},n.cacheComponents=function(e){n.components=Ue({},ze,{components:e}.components)},n.focus=n.focusInput,n.blur=n.blurInput,n.onChange=function(e,t){var r=n.props;(0,r.onChange)(e,Et({},t,{name:r.name}))},n.setValue=function(e,t,r){void 0===t&&(t="set-value");var o=n.props,i=o.closeMenuOnSelect,u=o.isMulti;n.onInputChange("",{action:"set-value"}),i&&(n.inputIsHiddenAfterUpdate=!u,n.onMenuClose()),n.clearFocusValueOnUpdate=!0,n.onChange(e,{action:t,option:r})},n.selectOption=function(e){var t=n.props,r=t.blurInputOnSelect,o=t.isMulti,i=n.state.selectValue;if(o)if(n.isOptionSelected(e,i)){var u=n.getOptionValue(e);n.setValue(i.filter((function(e){return n.getOptionValue(e)!==u})),"deselect-option",e),n.announceAriaLiveSelection({event:"deselect-option",context:{value:n.getOptionLabel(e)}})}else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue([].concat(i,[e]),"select-option",e),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue(e,"select-option"),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));r&&n.blurInput()},n.removeValue=function(e){var t=n.state.selectValue,r=n.getOptionValue(e),o=t.filter((function(e){return n.getOptionValue(e)!==r}));n.onChange(o.length?o:null,{action:"remove-value",removedValue:e}),n.announceAriaLiveSelection({event:"remove-value",context:{value:e?n.getOptionLabel(e):""}}),n.focusInput()},n.clearValue=function(){var e=n.props.isMulti;n.onChange(e?[]:null,{action:"clear"})},n.popValue=function(){var e=n.state.selectValue,t=e[e.length-1],r=e.slice(0,e.length-1);n.announceAriaLiveSelection({event:"pop-value",context:{value:t?n.getOptionLabel(t):""}}),n.onChange(r.length?r:null,{action:"pop-value",removedValue:t})},n.getOptionLabel=function(e){return n.props.getOptionLabel(e)},n.getOptionValue=function(e){return n.props.getOptionValue(e)},n.getStyles=function(e,t){var r=gt[e](t);r.boxSizing="border-box";var o=n.props.styles[e];return o?o(r,t):r},n.getElementId=function(e){return n.instancePrefix+"-"+e},n.getActiveDescendentId=function(){var e=n.props.menuIsOpen,t=n.state,r=t.menuOptions,o=t.focusedOption;if(o&&e){var i=r.focusable.indexOf(o),u=r.render[i];return u&&u.key}},n.announceAriaLiveSelection=function(e){var t=e.event,r=e.context;n.setState({ariaLiveSelection:mt(t,r)})},n.announceAriaLiveContext=function(e){var t=e.event,r=e.context;n.setState({ariaLiveContext:ht(t,Et({},r,{label:n.props["aria-label"]}))})},n.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),n.focusInput())},n.onMenuMouseMove=function(e){n.blockOptionHover=!1},n.onControlMouseDown=function(e){var t=n.props.openMenuOnClick;n.state.isFocused?n.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&n.onMenuClose():t&&n.openMenu("first"):(t&&(n.openAfterFocus=!0),n.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()},n.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||n.props.isDisabled)){var t=n.props,r=t.isMulti,o=t.menuIsOpen;n.focusInput(),o?(n.inputIsHiddenAfterUpdate=!r,n.onMenuClose()):n.openMenu("first"),e.preventDefault(),e.stopPropagation()}},n.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(n.clearValue(),e.stopPropagation(),n.openAfterFocus=!1,"touchend"===e.type?n.focusInput():setTimeout((function(){return n.focusInput()})))},n.onScroll=function(e){"boolean"==typeof n.props.closeMenuOnScroll?e.target instanceof HTMLElement&&K(e.target)&&n.props.onMenuClose():"function"==typeof n.props.closeMenuOnScroll&&n.props.closeMenuOnScroll(e)&&n.props.onMenuClose()},n.onCompositionStart=function(){n.isComposing=!0},n.onCompositionEnd=function(){n.isComposing=!1},n.onTouchStart=function(e){var t=e.touches.item(0);t&&(n.initialTouchX=t.clientX,n.initialTouchY=t.clientY,n.userIsDragging=!1)},n.onTouchMove=function(e){var t=e.touches.item(0);if(t){var r=Math.abs(t.clientX-n.initialTouchX),o=Math.abs(t.clientY-n.initialTouchY);n.userIsDragging=r>5||o>5}},n.onTouchEnd=function(e){n.userIsDragging||(n.controlRef&&!n.controlRef.contains(e.target)&&n.menuListRef&&!n.menuListRef.contains(e.target)&&n.blurInput(),n.initialTouchX=0,n.initialTouchY=0)},n.onControlTouchEnd=function(e){n.userIsDragging||n.onControlMouseDown(e)},n.onClearIndicatorTouchEnd=function(e){n.userIsDragging||n.onClearIndicatorMouseDown(e)},n.onDropdownIndicatorTouchEnd=function(e){n.userIsDragging||n.onDropdownIndicatorMouseDown(e)},n.handleInputChange=function(e){var t=e.currentTarget.value;n.inputIsHiddenAfterUpdate=!1,n.onInputChange(t,{action:"input-change"}),n.onMenuOpen()},n.onInputFocus=function(e){var t=n.props,r=t.isSearchable,o=t.isMulti;n.props.onFocus&&n.props.onFocus(e),n.inputIsHiddenAfterUpdate=!1,n.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:o}}),n.setState({isFocused:!0}),(n.openAfterFocus||n.props.openMenuOnFocus)&&n.openMenu("first"),n.openAfterFocus=!1},n.onInputBlur=function(e){n.menuListRef&&n.menuListRef.contains(document.activeElement)?n.inputRef.focus():(n.props.onBlur&&n.props.onBlur(e),n.onInputChange("",{action:"input-blur"}),n.onMenuClose(),n.setState({focusedValue:null,isFocused:!1}))},n.onOptionHover=function(e){n.blockOptionHover||n.state.focusedOption===e||n.setState({focusedOption:e})},n.shouldHideSelectedOptions=function(){var e=n.props,t=e.hideSelectedOptions,r=e.isMulti;return void 0===t?r:t},n.onKeyDown=function(e){var t=n.props,r=t.isMulti,o=t.backspaceRemovesValue,i=t.escapeClearsValue,u=t.inputValue,a=t.isClearable,s=t.isDisabled,l=t.menuIsOpen,c=t.onKeyDown,p=t.tabSelectsValue,f=t.openMenuOnFocus,d=n.state,h=d.focusedOption,m=d.focusedValue,v=d.selectValue;if(!(s||"function"==typeof c&&(c(e),e.defaultPrevented))){switch(n.blockOptionHover=!0,e.key){case"ArrowLeft":if(!r||u)return;n.focusValue("previous");break;case"ArrowRight":if(!r||u)return;n.focusValue("next");break;case"Delete":case"Backspace":if(u)return;if(m)n.removeValue(m);else{if(!o)return;r?n.popValue():a&&n.clearValue()}break;case"Tab":if(n.isComposing)return;if(e.shiftKey||!l||!p||!h||f&&n.isOptionSelected(h,v))return;n.selectOption(h);break;case"Enter":if(229===e.keyCode)break;if(l){if(!h)return;if(n.isComposing)return;n.selectOption(h);break}return;case"Escape":l?(n.inputIsHiddenAfterUpdate=!1,n.onInputChange("",{action:"menu-close"}),n.onMenuClose()):a&&i&&n.clearValue();break;case" ":if(u)return;if(!l){n.openMenu("first");break}if(!h)return;n.selectOption(h);break;case"ArrowUp":l?n.focusOption("up"):n.openMenu("last");break;case"ArrowDown":l?n.focusOption("down"):n.openMenu("first");break;case"PageUp":if(!l)return;n.focusOption("pageup");break;case"PageDown":if(!l)return;n.focusOption("pagedown");break;case"Home":if(!l)return;n.focusOption("first");break;case"End":if(!l)return;n.focusOption("last");break;default:return}e.preventDefault()}},n.buildMenuOptions=function(e,t){var r=e.inputValue,o=void 0===r?"":r,i=e.options,u=function(e,r){var i=n.isOptionDisabled(e,t),u=n.isOptionSelected(e,t),a=n.getOptionLabel(e),s=n.getOptionValue(e);if(!(n.shouldHideSelectedOptions()&&u||!n.filterOption({label:a,value:s,data:e},o))){var l=i?void 0:function(){return n.onOptionHover(e)},c=i?void 0:function(){return n.selectOption(e)},p=n.getElementId("option")+"-"+r;return{innerProps:{id:p,onClick:c,onMouseMove:l,onMouseOver:l,tabIndex:-1},data:e,isDisabled:i,isSelected:u,key:p,label:a,type:"option",value:s}}};return i.reduce((function(e,t,r){if(t.options){n.hasGroups||(n.hasGroups=!0);var o=t.options.map((function(t,n){var o=u(t,r+"-"+n);return o&&e.focusable.push(t),o})).filter(Boolean);if(o.length){var i=n.getElementId("group")+"-"+r;e.render.push({type:"group",key:i,data:t,options:o})}}else{var a=u(t,""+r);a&&(e.render.push(a),e.focusable.push(t))}return e}),{render:[],focusable:[]})};var r=t.value;n.cacheComponents=u(n.cacheComponents,ve).bind(yt(yt(n))),n.cacheComponents(t.components),n.instancePrefix="react-select-"+(n.props.instanceId||++At);var o=X(r);n.buildMenuOptions=u(n.buildMenuOptions,(function(e,t){var n=e,r=n[0],o=n[1],i=t,u=i[0];return ve(o,i[1])&&ve(r.inputValue,u.inputValue)&&ve(r.options,u.options)})).bind(yt(yt(n)));var i=t.menuIsOpen?n.buildMenuOptions(t,o):{render:[],focusable:[]};return n.state.menuOptions=i,n.state.selectValue=o,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()},i.UNSAFE_componentWillReceiveProps=function(e){var t=this.props,n=t.options,r=t.value,o=t.menuIsOpen,i=t.inputValue;if(this.cacheComponents(e.components),e.value!==r||e.options!==n||e.menuIsOpen!==o||e.inputValue!==i){var u=X(e.value),a=e.menuIsOpen?this.buildMenuOptions(e,u):{render:[],focusable:[]},s=this.getNextFocusedValue(u),l=this.getNextFocusedOption(a.focusable);this.setState({menuOptions:a,selectValue:u,focusedOption:l,focusedValue:s})}null!=this.inputIsHiddenAfterUpdate&&(this.setState({inputIsHidden:this.inputIsHiddenAfterUpdate}),delete this.inputIsHiddenAfterUpdate)},i.componentDidUpdate=function(e){var t,n,r,o,i,u=this.props,a=u.isDisabled,s=u.menuIsOpen,l=this.state.isFocused;(l&&!a&&e.isDisabled||l&&s&&!e.menuIsOpen)&&this.focusInput(),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(t=this.menuListRef,n=this.focusedOptionRef,r=t.getBoundingClientRect(),o=n.getBoundingClientRect(),i=n.offsetHeight/3,o.bottom+i>r.bottom?q(t,Math.min(n.offsetTop+n.clientHeight-t.offsetHeight+i,t.scrollHeight)):o.top-i-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(o&&this.menuListRef),this.inputIsHiddenAfterUpdate=!1,this.setState({menuOptions:i,focusedValue:null,focusedOption:i.focusable[a]},(function(){t.onMenuOpen(),t.announceAriaLiveContext({event:"menu"})}))},i.focusValue=function(e){var t=this.props,n=t.isMulti,r=t.isSearchable,o=this.state,i=o.selectValue,u=o.focusedValue;if(n){this.setState({focusedOption:null});var a=i.indexOf(u);u||(a=-1,this.announceAriaLiveContext({event:"value"}));var s=i.length-1,l=-1;if(i.length){switch(e){case"previous":l=0===a?0:-1===a?s:a-1;break;case"next":a>-1&&a0?u-1:o.length-1:"down"===e?i=(u+1)%o.length:"pageup"===e?(i=u-t)<0&&(i=0):"pagedown"===e?(i=u+t)>o.length-1&&(i=o.length-1):"last"===e&&(i=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[i],focusedValue:null}),this.announceAriaLiveContext({event:"menu",context:{isDisabled:vt(o[i])}})}},i.getTheme=function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(bt):Et({},bt,this.props.theme):bt},i.getCommonProps=function(){var e=this.clearValue,t=this.getStyles,n=this.setValue,r=this.selectOption,o=this.props,i=o.classNamePrefix,u=o.isMulti,a=o.isRtl,s=o.options,l=this.state.selectValue,c=this.hasValue();return{cx:Y.bind(null,i),clearValue:e,getStyles:t,getValue:function(){return l},hasValue:c,isMulti:u,isRtl:a,options:s,selectOption:r,setValue:n,selectProps:o,theme:this.getTheme()}},i.getNextFocusedValue=function(e){if(this.clearFocusValueOnUpdate)return this.clearFocusValueOnUpdate=!1,null;var t=this.state,n=t.focusedValue,r=t.selectValue.indexOf(n);if(r>-1){if(e.indexOf(n)>-1)return n;if(r-1?t:e[0]},i.hasValue=function(){return this.state.selectValue.length>0},i.hasOptions=function(){return!!this.state.menuOptions.render.length},i.countOptions=function(){return this.state.menuOptions.focusable.length},i.isClearable=function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t},i.isOptionDisabled=function(e,t){return"function"==typeof this.props.isOptionDisabled&&this.props.isOptionDisabled(e,t)},i.isOptionSelected=function(e,t){var n=this;if(t.indexOf(e)>-1)return!0;if("function"==typeof this.props.isOptionSelected)return this.props.isOptionSelected(e,t);var r=this.getOptionValue(e);return t.some((function(e){return n.getOptionValue(e)===r}))},i.filterOption=function(e,t){return!this.props.filterOption||this.props.filterOption(e,t)},i.formatOptionLabel=function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,r=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:r})}return this.getOptionLabel(e)},i.formatGroupLabel=function(e){return this.props.formatGroupLabel(e)},i.startListeningComposition=function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))},i.stopListeningComposition=function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))},i.startListeningToTouch=function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))},i.stopListeningToTouch=function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))},i.constructAriaLiveMessage=function(){var e=this.state,t=e.ariaLiveContext,n=e.selectValue,r=e.focusedValue,o=e.focusedOption,i=this.props,u=i.options,a=i.menuIsOpen,s=i.inputValue,l=i.screenReaderStatus;return(r?function(e){var t=e.focusedValue,n=e.getOptionLabel,r=e.selectValue;return"value "+n(t)+" focused, "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedValue:r,getOptionLabel:this.getOptionLabel,selectValue:n}):"")+" "+(o&&a?function(e){var t=e.focusedOption,n=e.getOptionLabel,r=e.options;return"option "+n(t)+" focused"+(t.isDisabled?" disabled":"")+", "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedOption:o,getOptionLabel:this.getOptionLabel,options:u}):"")+" "+function(e){var t=e.inputValue;return e.screenReaderMessage+(t?" for search term "+t:"")+"."}({inputValue:s,screenReaderMessage:l({count:this.countOptions()})})+" "+t},i.renderInput=function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,r=e.inputId,i=e.inputValue,u=e.tabIndex,a=this.components.Input,s=this.state.inputIsHidden,l=r||this.getElementId("input"),c={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};if(!n)return o.a.createElement(Qe,Et({id:l,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:G,onFocus:this.onInputFocus,readOnly:!0,disabled:t,tabIndex:u,value:""},c));var p=this.commonProps,f=p.cx,d=p.theme,h=p.selectProps;return o.a.createElement(a,Et({autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",cx:f,getStyles:this.getStyles,id:l,innerRef:this.getInputRef,isDisabled:t,isHidden:s,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,selectProps:h,spellCheck:"false",tabIndex:u,theme:d,type:"text",value:i},c))},i.renderPlaceholderOrValue=function(){var e=this,t=this.components,n=t.MultiValue,r=t.MultiValueContainer,i=t.MultiValueLabel,u=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,l=this.commonProps,c=this.props,p=c.controlShouldRenderValue,f=c.isDisabled,d=c.isMulti,h=c.inputValue,m=c.placeholder,v=this.state,g=v.selectValue,b=v.focusedValue,E=v.isFocused;if(!this.hasValue()||!p)return h?null:o.a.createElement(s,Et({},l,{key:"placeholder",isDisabled:f,isFocused:E}),m);if(d)return g.map((function(t,a){var s=t===b;return o.a.createElement(n,Et({},l,{components:{Container:r,Label:i,Remove:u},isFocused:s,isDisabled:f,key:e.getOptionValue(t),index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault(),e.stopPropagation()}},data:t}),e.formatOptionLabel(t,"value"))}));if(h)return null;var y=g[0];return o.a.createElement(a,Et({},l,{data:y,isDisabled:f}),this.formatOptionLabel(y,"value"))},i.renderClearIndicator=function(){var e=this.components.ClearIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!this.isClearable()||!e||r||!this.hasValue()||i)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:a,isFocused:u}))},i.renderLoadingIndicator=function(){var e=this.components.LoadingIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!e||!i)return null;return o.a.createElement(e,Et({},t,{innerProps:{"aria-hidden":"true"},isDisabled:r,isFocused:u}))},i.renderIndicatorSeparator=function(){var e=this.components,t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var r=this.commonProps,i=this.props.isDisabled,u=this.state.isFocused;return o.a.createElement(n,Et({},r,{isDisabled:i,isFocused:u}))},i.renderDropdownIndicator=function(){var e=this.components.DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,r=this.state.isFocused,i={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:i,isDisabled:n,isFocused:r}))},i.renderMenu=function(){var e=this,t=this.components,n=t.Group,r=t.GroupHeading,i=t.Menu,u=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,l=t.NoOptionsMessage,c=t.Option,p=this.commonProps,f=this.state,d=f.focusedOption,h=f.menuOptions,m=this.props,v=m.captureMenuScroll,g=m.inputValue,b=m.isLoading,E=m.loadingMessage,y=m.minMenuHeight,C=m.maxMenuHeight,O=m.menuIsOpen,A=m.menuPlacement,w=m.menuPosition,F=m.menuPortalTarget,x=m.menuShouldBlockScroll,S=m.menuShouldScrollIntoView,D=m.noOptionsMessage,k=m.onMenuScrollToTop,I=m.onMenuScrollToBottom;if(!O)return null;var M,P=function(t){var n=d===t.data;return t.innerRef=n?e.getFocusedOptionRef:void 0,o.a.createElement(c,Et({},p,t,{isFocused:n}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())M=h.render.map((function(t){if("group"===t.type){t.type;var i=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(t,["type"]),u=t.key+"-heading";return o.a.createElement(n,Et({},p,i,{Heading:r,headingProps:{id:u},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return P(e)})))}if("option"===t.type)return P(t)}));else if(b){var L=E({inputValue:g});if(null===L)return null;M=o.a.createElement(s,p,L)}else{var V=D({inputValue:g});if(null===V)return null;M=o.a.createElement(l,p,V)}var T={minMenuHeight:y,maxMenuHeight:C,menuPlacement:A,menuPosition:w,menuShouldScrollIntoView:S},R=o.a.createElement(ue,Et({},p,T),(function(t){var n=t.ref,r=t.placerProps,a=r.placement,s=r.maxHeight;return o.a.createElement(i,Et({},p,T,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:b,placement:a}),o.a.createElement(dt,{isEnabled:v,onTopArrive:k,onBottomArrive:I},o.a.createElement(pt,{isEnabled:x},o.a.createElement(u,Et({},p,{innerRef:e.getMenuListRef,isLoading:b,maxHeight:s}),M))))}));return F||"fixed"===w?o.a.createElement(a,Et({},p,{appendTo:F,controlElement:this.controlRef,menuPlacement:A,menuPosition:w}),R):R},i.renderFormField=function(){var e=this,t=this.props,n=t.delimiter,r=t.isDisabled,i=t.isMulti,u=t.name,a=this.state.selectValue;if(u&&!r){if(i){if(n){var s=a.map((function(t){return e.getOptionValue(t)})).join(n);return o.a.createElement("input",{name:u,type:"hidden",value:s})}var l=a.length>0?a.map((function(t,n){return o.a.createElement("input",{key:"i-"+n,name:u,type:"hidden",value:e.getOptionValue(t)})})):o.a.createElement("input",{name:u,type:"hidden"});return o.a.createElement("div",null,l)}var c=a[0]?this.getOptionValue(a[0]):"";return o.a.createElement("input",{name:u,type:"hidden",value:c})}},i.renderLiveRegion=function(){return this.state.isFocused?o.a.createElement(qe,{"aria-live":"polite"},o.a.createElement("p",{id:"aria-selection-event"},"\xa0",this.state.ariaLiveSelection),o.a.createElement("p",{id:"aria-context"},"\xa0",this.constructAriaLiveMessage())):null},i.render=function(){var e=this.components,t=e.Control,n=e.IndicatorsContainer,r=e.SelectContainer,i=e.ValueContainer,u=this.props,a=u.className,s=u.id,l=u.isDisabled,c=u.menuIsOpen,p=this.state.isFocused,f=this.commonProps=this.getCommonProps();return o.a.createElement(r,Et({},f,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:l,isFocused:p}),this.renderLiveRegion(),o.a.createElement(t,Et({},f,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:l,isFocused:p,menuIsOpen:c}),o.a.createElement(i,Et({},f,{isDisabled:l}),this.renderPlaceholderOrValue(),this.renderInput()),o.a.createElement(n,Et({},f,{isDisabled:l}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())},r}(r.Component);function Ft(){return(Ft=Object.assign||function(e){for(var t=1;t1?n-1:0),o=1;o=0||(o[n]=e[n]);return o}(t,["defaultInputValue","defaultMenuIsOpen","defaultValue"]));return o.a.createElement(St,Ft({},n,{ref:function(t){e.select=t},inputValue:this.getProp("inputValue"),menuIsOpen:this.getProp("menuIsOpen"),onChange:this.onChange,onInputChange:this.onInputChange,onMenuClose:this.onMenuClose,onMenuOpen:this.onMenuOpen,value:this.getProp("value")}))},r}(r.Component),Dt.defaultProps=xt,kt);t.a=It},454:function(e,t,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=o},465:function(e,t,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(466);e.exports=function(e,t){var n=1==e,s=2==e,l=3==e,c=4==e,p=6==e,f=5==e||p,d=t||a;return function(t,a,h){for(var m,v,g=i(t),b=o(g),E=r(a,h,3),y=u(b.length),C=0,O=n?d(t,y):s?d(t,0):void 0;y>C;C++)if((f||C in b)&&(v=E(m=b[C],C,g),e))if(n)O[C]=v;else if(v)switch(e){case 3:return!0;case 5:return m;case 6:return C;case 2:O.push(m)}else if(c)return!1;return p?-1:l||c?c:O}}},466:function(e,t,n){var r=n(467);e.exports=function(e,t){return new(r(e))(t)}},467:function(e,t,n){var r=n(13),o=n(468),i=n(2)("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(e,t,n){var r=n(23);e.exports=Array.isArray||function(e){return"Array"==r(e)}},486:function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},566:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}(i.Component);h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h}}]); \ No newline at end of file +/*! For license information please see 1.b6bd6afb.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{423:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),c=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a({},t,{},e)),n},p=function(e){var t=c(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,h=p["".concat(u,".").concat(d)]||p[d]||f[d]||i;return n?o.a.createElement(h,a({ref:t},l,{components:n})):o.a.createElement(h,a({ref:t},l))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,u=new Array(i);u[0]=d;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,u[1]=a;for(var l=2;l1?arguments[1]:void 0,n),s=u>2?arguments[2]:void 0,l=void 0===s?n:o(s,n);l>a;)t[a++]=e;return t}},433:function(e,t,n){"use strict";var r=n(435),o=n(51);function i(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[i(t,e),"[",r,"]"].join(""):[i(t,e),"[",i(r,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var o=e[r];if(void 0===o)return"";if(null===o)return i(r,t);if(Array.isArray(o)){var u=[];return o.slice().forEach((function(e){void 0!==e&&u.push(n(r,e,u.length))})),u.join("&")}return i(r,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}},439:function(e,t,n){"use strict";var r=n(12),o=n(465)(5),i=!0;"find"in[]&&Array(1).find((function(){i=!1})),r(r.P+r.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(74)("find")},442:function(e,t,n){"use strict";var r=n(8),o=n(486),i=n(55);n(56)("search",1,(function(e,t,n,u){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=u(n,e,this);if(t.done)return t.value;var a=r(e),s=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var c=i(a,s);return o(a.lastIndex,l)||(a.lastIndex=l),null===c?-1:c.index}]}))},446:function(e,t,n){"use strict";var r=n(0),o=n(454);t.a=function(){return Object(r.useContext)(o.a)}},447:function(e,t,n){"use strict";var r=n(0),o=n.n(r);function i(e,t){if(e.length!==t.length)return!1;for(var n=0;nr&&(r=(t=t.trim()).charCodeAt(0)),r){case 38:return t.replace(m,"$1"+e.trim());case 58:return e.trim()+t.replace(m,"$1"+e.trim());default:if(0<1*n&&0s.charCodeAt(8))break;case 115:u=u.replace(s,"-webkit-"+s)+";"+u;break;case 207:case 102:u=u.replace(s,"-webkit-"+(102a.charCodeAt(0)&&(a=a.trim()),a=[a],0d)&&(N=(U=U.replace(" ",":")).length),0=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)},b={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var E=/[A-Z]|^ms/g,y=/_EMO_([^_]+?)_([^]*?)_EMO_/g,C=function(e){return 45===e.charCodeAt(1)},O=function(e){return null!=e&&"boolean"!=typeof e},A=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}((function(e){return C(e)?e:e.replace(E,"-$&").toLowerCase()})),w=function(e,t){switch(e){case"animation":case"animationName":if("string"==typeof t)return t.replace(y,(function(e,t,n){return x={name:t,styles:n,next:x},t}))}return 1===b[e]||C(e)||"number"!=typeof t||0===t?t:t+"px"};function F(e,t,n,r){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return x={name:n.name,styles:n.styles,next:x},n.name;if(void 0!==n.styles){var o=n.next;if(void 0!==o)for(;void 0!==o;)x={name:o.name,styles:o.styles,next:x},o=o.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o-1}function J(e){return K(e)?window.pageYOffset:e.scrollTop}function q(e,t){K(e)?window.scrollTo(0,t):e.scrollTop=t}function Z(e,t,n,r){void 0===n&&(n=200),void 0===r&&(r=G);var o=J(e),i=t-o,u=0;!function t(){var a,s=i*((a=(a=u+=10)/n-1)*a*a+1)+o;q(e,s),u=d)return{placement:"bottom",maxHeight:t};if(A>=d&&!u)return i&&Z(s,w,160),{placement:"bottom",maxHeight:t};if(!u&&A>=r||u&&C>=r)return i&&Z(s,w,160),{placement:"bottom",maxHeight:u?C-b:A-b};if("auto"===o||u){var x=t,S=u?y:O;return S>=r&&(x=Math.min(S-b-a.controlHeight,t)),{placement:"top",maxHeight:x}}if("bottom"===o)return q(s,w),{placement:"bottom",maxHeight:t};break;case"top":if(y>=d)return{placement:"top",maxHeight:t};if(O>=d&&!u)return i&&Z(s,F,160),{placement:"top",maxHeight:t};if(!u&&O>=r||u&&y>=r){var D=t;return(!u&&O>=r||u&&y>=r)&&(D=u?y-E:O-E),i&&Z(s,F,160),{placement:"top",maxHeight:D}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'+o+'".')}return l}var ie=function(e){return"auto"===e?"bottom":e},ue=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o=0||(o[n]=e[n]);return o}(e,["size"]);return B("svg",Ee({height:t,width:t,viewBox:"0 0 20 20","aria-hidden":"true",focusable:"false",css:ye},n))},Oe=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"}))},Ae=function(e){return B(Ce,Ee({size:20},e),B("path",{d:"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"}))},we=function(e){var t=e.isFocused,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorContainer",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*r,transition:"color 150ms",":hover":{color:t?o.neutral80:o.neutral40}}},Fe=we,xe=we,Se=function(){var e=k.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}}(be()),De=function(e){var t=e.delay,n=e.offset;return B("span",{css:k({animation:Se+" 1s ease-in-out "+t+"ms infinite;",backgroundColor:"currentColor",borderRadius:"1em",display:"inline-block",marginLeft:n?"1em":null,height:"1em",verticalAlign:"top",width:"1em"},"")})},ke=function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps,i=e.isRtl;return B("div",Ee({},o,{css:r("loadingIndicator",e),className:n({indicator:!0,"loading-indicator":!0},t)}),B(De,{delay:0,offset:i}),B(De,{delay:160,offset:!0}),B(De,{delay:320,offset:!i}))};function Ie(){return(Ie=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","theme","selectProps"]));return B("div",Me({css:r("groupHeading",Me({theme:o},i)),className:n({"group-heading":!0},t)},i))},IndicatorsContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles;return B("div",{css:o("indicatorsContainer",e),className:r({indicators:!0},n)},t)},IndicatorSeparator:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerProps;return B("span",Ee({},o,{css:r("indicatorSeparator",e),className:n({"indicator-separator":!0},t)}))},Input:function(e){var t=e.className,n=e.cx,r=e.getStyles,o=e.innerRef,i=e.isHidden,u=e.isDisabled,a=e.theme,s=(e.selectProps,function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["className","cx","getStyles","innerRef","isHidden","isDisabled","theme","selectProps"]));return B("div",{css:r("input",Pe({theme:a},s))},B(te.a,Pe({className:n({input:!0},t),inputRef:o,inputStyle:Le(i),disabled:u},s)))},LoadingIndicator:ke,Menu:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerRef,u=e.innerProps;return B("div",ne({css:o("menu",e),className:r({menu:!0},n)},u,{ref:i}),t)},MenuList:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isMulti,u=e.innerRef;return B("div",{css:o("menuList",e),className:r({"menu-list":!0,"menu-list--is-multi":i},n),ref:u},t)},MenuPortal:fe,LoadingMessage:pe,NoOptionsMessage:ce,MultiValue:Be,MultiValueContainer:Re,MultiValueLabel:je,MultiValueRemove:function(e){var t=e.children,n=e.innerProps;return B("div",n,t||B(Oe,{size:14}))},Option:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.isFocused,a=e.isSelected,s=e.innerRef,l=e.innerProps;return B("div",Ne({css:o("option",e),className:r({option:!0,"option--is-disabled":i,"option--is-focused":u,"option--is-selected":a},n),ref:s},l),t)},Placeholder:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps;return B("div",He({css:o("placeholder",e),className:r({placeholder:!0},n)},i),t)},SelectContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.innerProps,u=e.isDisabled,a=e.isRtl;return B("div",ge({css:o("container",e),className:r({"--is-disabled":u,"--is-rtl":a},n)},i),t)},SingleValue:function(e){var t=e.children,n=e.className,r=e.cx,o=e.getStyles,i=e.isDisabled,u=e.innerProps;return B("div",_e({css:o("singleValue",e),className:r({"single-value":!0,"single-value--is-disabled":i},n)},u),t)},ValueContainer:function(e){var t=e.children,n=e.className,r=e.cx,o=e.isMulti,i=e.getStyles,u=e.hasValue;return B("div",{css:i("valueContainer",e),className:r({"value-container":!0,"value-container--is-multi":o,"value-container--has-value":u},n)},t)}},We=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}],Ge=function(e){for(var t=0;t=0||(o[n]=e[n]);return o}(e,["in","out","onExited","appear","enter","exit","innerRef","emotion"]));return B("input",Ze({ref:t},n,{css:k({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"")}))}var et=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var o=r.prototype;return o.componentDidMount=function(){this.props.innerRef(Object(U.findDOMNode)(this))},o.componentWillUnmount=function(){this.props.innerRef(null)},o.render=function(){return this.props.children},r}(r.Component),tt=["boxSizing","height","overflow","paddingRight","position"],nt={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function rt(e){e.preventDefault()}function ot(e){e.stopPropagation()}function it(){var e=this.scrollTop,t=this.scrollHeight,n=e+this.offsetHeight;0===e?this.scrollTop=1:n===t&&(this.scrollTop=e-1)}function ut(){return"ontouchstart"in window||navigator.maxTouchPoints}var at=!(!window.document||!window.document.createElement),st=0,lt=function(e){var t,n;function r(){for(var t,n=arguments.length,r=new Array(n),o=0;o0,h=c-p-l,m=!1;h>n&&t.isBottom&&(i&&i(e),t.isBottom=!1),d&&t.isTop&&(a&&a(e),t.isTop=!1),d&&n>h?(o&&!t.isBottom&&o(e),f.scrollTop=c,m=!0,t.isBottom=!0):!d&&-n>l&&(u&&!t.isTop&&u(e),f.scrollTop=0,m=!0,t.isTop=!0),m&&t.cancelScroll(e)},t.onWheel=function(e){t.handleEventDelta(e,e.deltaY)},t.onTouchStart=function(e){t.touchStart=e.changedTouches[0].clientY},t.onTouchMove=function(e){var n=t.touchStart-e.changedTouches[0].clientY;t.handleEventDelta(e,n)},t.getScrollTarget=function(e){t.scrollTarget=e},t}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListening(this.scrollTarget)},i.componentWillUnmount=function(){this.stopListening(this.scrollTarget)},i.startListening=function(e){e&&("function"==typeof e.addEventListener&&e.addEventListener("wheel",this.onWheel,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.addEventListener&&e.addEventListener("touchmove",this.onTouchMove,!1))},i.stopListening=function(e){"function"==typeof e.removeEventListener&&e.removeEventListener("wheel",this.onWheel,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchstart",this.onTouchStart,!1),"function"==typeof e.removeEventListener&&e.removeEventListener("touchmove",this.onTouchMove,!1)},i.render=function(){return o.a.createElement(et,{innerRef:this.getScrollTarget},this.props.children)},r}(r.Component);function dt(e){var t=e.isEnabled,n=void 0===t||t,r=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,["isEnabled"]);return n?o.a.createElement(ft,r):r.children}var ht=function(e,t){void 0===t&&(t={});var n=t,r=n.isSearchable,o=n.isMulti,i=n.label,u=n.isDisabled;switch(e){case"menu":return"Use Up and Down to choose options"+(u?"":", press Enter to select the currently focused option")+", press Escape to exit the menu, press Tab to select the option and exit the menu.";case"input":return(i||"Select")+" is focused "+(r?",type to refine list":"")+", press Down to open the menu, "+(o?" press left to focus selected values":"");case"value":return"Use left and right to toggle between focused values, press Backspace to remove the currently focused value"}},mt=function(e,t){var n=t.value,r=t.isDisabled;if(n)switch(e){case"deselect-option":case"pop-value":case"remove-value":return"option "+n+", deselected.";case"select-option":return r?"option "+n+" is disabled. Select another option.":"option "+n+", selected."}},vt=function(e){return!!e.isDisabled};var gt={clearIndicator:xe,container:function(e){var t=e.isDisabled;return{label:"container",direction:e.isRtl?"rtl":null,pointerEvents:t?"none":null,position:"relative"}},control:function(e){var t=e.isDisabled,n=e.isFocused,r=e.theme,o=r.colors,i=r.borderRadius,u=r.spacing;return{label:"control",alignItems:"center",backgroundColor:t?o.neutral5:o.neutral0,borderColor:t?o.neutral10:n?o.primary:o.neutral20,borderRadius:i,borderStyle:"solid",borderWidth:1,boxShadow:n?"0 0 0 1px "+o.primary:null,cursor:"default",display:"flex",flexWrap:"wrap",justifyContent:"space-between",minHeight:u.controlHeight,outline:"0 !important",position:"relative",transition:"all 100ms","&:hover":{borderColor:n?o.primary:o.neutral30}}},dropdownIndicator:Fe,group:function(e){var t=e.theme.spacing;return{paddingBottom:2*t.baseUnit,paddingTop:2*t.baseUnit}},groupHeading:function(e){var t=e.theme.spacing;return{label:"group",color:"#999",cursor:"default",display:"block",fontSize:"75%",fontWeight:"500",marginBottom:"0.25em",paddingLeft:3*t.baseUnit,paddingRight:3*t.baseUnit,textTransform:"uppercase"}},indicatorsContainer:function(){return{alignItems:"center",alignSelf:"stretch",display:"flex",flexShrink:0}},indicatorSeparator:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing.baseUnit,o=n.colors;return{label:"indicatorSeparator",alignSelf:"stretch",backgroundColor:t?o.neutral10:o.neutral20,marginBottom:2*r,marginTop:2*r,width:1}},input:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{margin:r.baseUnit/2,paddingBottom:r.baseUnit/2,paddingTop:r.baseUnit/2,visibility:t?"hidden":"visible",color:o.neutral80}},loadingIndicator:function(e){var t=e.isFocused,n=e.size,r=e.theme,o=r.colors,i=r.spacing.baseUnit;return{label:"loadingIndicator",color:t?o.neutral60:o.neutral20,display:"flex",padding:2*i,transition:"color 150ms",alignSelf:"center",fontSize:n,lineHeight:1,marginRight:n,textAlign:"center",verticalAlign:"middle"}},loadingMessage:le,menu:function(e){var t,n=e.placement,r=e.theme,o=r.borderRadius,i=r.spacing,u=r.colors;return(t={label:"menu"})[function(e){return e?{bottom:"top",top:"bottom"}[e]:"bottom"}(n)]="100%",t.backgroundColor=u.neutral0,t.borderRadius=o,t.boxShadow="0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)",t.marginBottom=i.menuGutter,t.marginTop=i.menuGutter,t.position="absolute",t.width="100%",t.zIndex=1,t},menuList:function(e){var t=e.maxHeight,n=e.theme.spacing.baseUnit;return{maxHeight:t,overflowY:"auto",paddingBottom:n,paddingTop:n,position:"relative",WebkitOverflowScrolling:"touch"}},menuPortal:function(e){var t=e.rect,n=e.offset,r=e.position;return{left:t.left,position:r,top:n,width:t.width,zIndex:1}},multiValue:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius;return{label:"multiValue",backgroundColor:t.colors.neutral10,borderRadius:r/2,display:"flex",margin:n.baseUnit/2,minWidth:0}},multiValueLabel:function(e){var t=e.theme,n=t.borderRadius,r=t.colors,o=e.cropWithEllipsis;return{borderRadius:n/2,color:r.neutral80,fontSize:"85%",overflow:"hidden",padding:3,paddingLeft:6,textOverflow:o?"ellipsis":null,whiteSpace:"nowrap"}},multiValueRemove:function(e){var t=e.theme,n=t.spacing,r=t.borderRadius,o=t.colors;return{alignItems:"center",borderRadius:r/2,backgroundColor:e.isFocused&&o.dangerLight,display:"flex",paddingLeft:n.baseUnit,paddingRight:n.baseUnit,":hover":{backgroundColor:o.dangerLight,color:o.danger}}},noOptionsMessage:se,option:function(e){var t=e.isDisabled,n=e.isFocused,r=e.isSelected,o=e.theme,i=o.spacing,u=o.colors;return{label:"option",backgroundColor:r?u.primary:n?u.primary25:"transparent",color:t?u.neutral20:r?u.neutral0:"inherit",cursor:"default",display:"block",fontSize:"inherit",padding:2*i.baseUnit+"px "+3*i.baseUnit+"px",width:"100%",userSelect:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",":active":{backgroundColor:!t&&(r?u.primary:u.primary50)}}},placeholder:function(e){var t=e.theme,n=t.spacing;return{label:"placeholder",color:t.colors.neutral50,marginLeft:n.baseUnit/2,marginRight:n.baseUnit/2,position:"absolute",top:"50%",transform:"translateY(-50%)"}},singleValue:function(e){var t=e.isDisabled,n=e.theme,r=n.spacing,o=n.colors;return{label:"singleValue",color:t?o.neutral40:o.neutral80,marginLeft:r.baseUnit/2,marginRight:r.baseUnit/2,maxWidth:"calc(100% - "+2*r.baseUnit+"px)",overflow:"hidden",position:"absolute",textOverflow:"ellipsis",whiteSpace:"nowrap",top:"50%",transform:"translateY(-50%)"}},valueContainer:function(e){var t=e.theme.spacing;return{alignItems:"center",display:"flex",flex:1,flexWrap:"wrap",padding:t.baseUnit/2+"px "+2*t.baseUnit+"px",WebkitOverflowScrolling:"touch",position:"relative",overflow:"hidden"}}};var bt={borderRadius:4,colors:{primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},spacing:{baseUnit:4,controlHeight:38,menuGutter:8}};function Et(){return(Et=Object.assign||function(e){for(var t=1;t-1},formatGroupLabel:function(e){return e.label},getOptionLabel:function(e){return e.label},getOptionValue:function(e){return e.value},isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:vt,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!function(){try{return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}catch(e){return!1}}(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(e){var t=e.count;return t+" result"+(1!==t?"s":"")+" available"},styles:{},tabIndex:"0",tabSelectsValue:!0},At=1,wt=function(e){var t,n;function r(t){var n;(n=e.call(this,t)||this).state={ariaLiveSelection:"",ariaLiveContext:"",focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,menuOptions:{render:[],focusable:[]},selectValue:[]},n.blockOptionHover=!1,n.isComposing=!1,n.clearFocusValueOnUpdate=!1,n.commonProps=void 0,n.components=void 0,n.hasGroups=!1,n.initialTouchX=0,n.initialTouchY=0,n.inputIsHiddenAfterUpdate=void 0,n.instancePrefix="",n.openAfterFocus=!1,n.scrollToFocusedOptionOnUpdate=!1,n.userIsDragging=void 0,n.controlRef=null,n.getControlRef=function(e){n.controlRef=e},n.focusedOptionRef=null,n.getFocusedOptionRef=function(e){n.focusedOptionRef=e},n.menuListRef=null,n.getMenuListRef=function(e){n.menuListRef=e},n.inputRef=null,n.getInputRef=function(e){n.inputRef=e},n.cacheComponents=function(e){n.components=Ue({},ze,{components:e}.components)},n.focus=n.focusInput,n.blur=n.blurInput,n.onChange=function(e,t){var r=n.props;(0,r.onChange)(e,Et({},t,{name:r.name}))},n.setValue=function(e,t,r){void 0===t&&(t="set-value");var o=n.props,i=o.closeMenuOnSelect,u=o.isMulti;n.onInputChange("",{action:"set-value"}),i&&(n.inputIsHiddenAfterUpdate=!u,n.onMenuClose()),n.clearFocusValueOnUpdate=!0,n.onChange(e,{action:t,option:r})},n.selectOption=function(e){var t=n.props,r=t.blurInputOnSelect,o=t.isMulti,i=n.state.selectValue;if(o)if(n.isOptionSelected(e,i)){var u=n.getOptionValue(e);n.setValue(i.filter((function(e){return n.getOptionValue(e)!==u})),"deselect-option",e),n.announceAriaLiveSelection({event:"deselect-option",context:{value:n.getOptionLabel(e)}})}else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue([].concat(i,[e]),"select-option",e),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));else n.isOptionDisabled(e,i)?n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e),isDisabled:!0}}):(n.setValue(e,"select-option"),n.announceAriaLiveSelection({event:"select-option",context:{value:n.getOptionLabel(e)}}));r&&n.blurInput()},n.removeValue=function(e){var t=n.state.selectValue,r=n.getOptionValue(e),o=t.filter((function(e){return n.getOptionValue(e)!==r}));n.onChange(o.length?o:null,{action:"remove-value",removedValue:e}),n.announceAriaLiveSelection({event:"remove-value",context:{value:e?n.getOptionLabel(e):""}}),n.focusInput()},n.clearValue=function(){var e=n.props.isMulti;n.onChange(e?[]:null,{action:"clear"})},n.popValue=function(){var e=n.state.selectValue,t=e[e.length-1],r=e.slice(0,e.length-1);n.announceAriaLiveSelection({event:"pop-value",context:{value:t?n.getOptionLabel(t):""}}),n.onChange(r.length?r:null,{action:"pop-value",removedValue:t})},n.getOptionLabel=function(e){return n.props.getOptionLabel(e)},n.getOptionValue=function(e){return n.props.getOptionValue(e)},n.getStyles=function(e,t){var r=gt[e](t);r.boxSizing="border-box";var o=n.props.styles[e];return o?o(r,t):r},n.getElementId=function(e){return n.instancePrefix+"-"+e},n.getActiveDescendentId=function(){var e=n.props.menuIsOpen,t=n.state,r=t.menuOptions,o=t.focusedOption;if(o&&e){var i=r.focusable.indexOf(o),u=r.render[i];return u&&u.key}},n.announceAriaLiveSelection=function(e){var t=e.event,r=e.context;n.setState({ariaLiveSelection:mt(t,r)})},n.announceAriaLiveContext=function(e){var t=e.event,r=e.context;n.setState({ariaLiveContext:ht(t,Et({},r,{label:n.props["aria-label"]}))})},n.onMenuMouseDown=function(e){0===e.button&&(e.stopPropagation(),e.preventDefault(),n.focusInput())},n.onMenuMouseMove=function(e){n.blockOptionHover=!1},n.onControlMouseDown=function(e){var t=n.props.openMenuOnClick;n.state.isFocused?n.props.menuIsOpen?"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&n.onMenuClose():t&&n.openMenu("first"):(t&&(n.openAfterFocus=!0),n.focusInput()),"INPUT"!==e.target.tagName&&"TEXTAREA"!==e.target.tagName&&e.preventDefault()},n.onDropdownIndicatorMouseDown=function(e){if(!(e&&"mousedown"===e.type&&0!==e.button||n.props.isDisabled)){var t=n.props,r=t.isMulti,o=t.menuIsOpen;n.focusInput(),o?(n.inputIsHiddenAfterUpdate=!r,n.onMenuClose()):n.openMenu("first"),e.preventDefault(),e.stopPropagation()}},n.onClearIndicatorMouseDown=function(e){e&&"mousedown"===e.type&&0!==e.button||(n.clearValue(),e.stopPropagation(),n.openAfterFocus=!1,"touchend"===e.type?n.focusInput():setTimeout((function(){return n.focusInput()})))},n.onScroll=function(e){"boolean"==typeof n.props.closeMenuOnScroll?e.target instanceof HTMLElement&&K(e.target)&&n.props.onMenuClose():"function"==typeof n.props.closeMenuOnScroll&&n.props.closeMenuOnScroll(e)&&n.props.onMenuClose()},n.onCompositionStart=function(){n.isComposing=!0},n.onCompositionEnd=function(){n.isComposing=!1},n.onTouchStart=function(e){var t=e.touches.item(0);t&&(n.initialTouchX=t.clientX,n.initialTouchY=t.clientY,n.userIsDragging=!1)},n.onTouchMove=function(e){var t=e.touches.item(0);if(t){var r=Math.abs(t.clientX-n.initialTouchX),o=Math.abs(t.clientY-n.initialTouchY);n.userIsDragging=r>5||o>5}},n.onTouchEnd=function(e){n.userIsDragging||(n.controlRef&&!n.controlRef.contains(e.target)&&n.menuListRef&&!n.menuListRef.contains(e.target)&&n.blurInput(),n.initialTouchX=0,n.initialTouchY=0)},n.onControlTouchEnd=function(e){n.userIsDragging||n.onControlMouseDown(e)},n.onClearIndicatorTouchEnd=function(e){n.userIsDragging||n.onClearIndicatorMouseDown(e)},n.onDropdownIndicatorTouchEnd=function(e){n.userIsDragging||n.onDropdownIndicatorMouseDown(e)},n.handleInputChange=function(e){var t=e.currentTarget.value;n.inputIsHiddenAfterUpdate=!1,n.onInputChange(t,{action:"input-change"}),n.onMenuOpen()},n.onInputFocus=function(e){var t=n.props,r=t.isSearchable,o=t.isMulti;n.props.onFocus&&n.props.onFocus(e),n.inputIsHiddenAfterUpdate=!1,n.announceAriaLiveContext({event:"input",context:{isSearchable:r,isMulti:o}}),n.setState({isFocused:!0}),(n.openAfterFocus||n.props.openMenuOnFocus)&&n.openMenu("first"),n.openAfterFocus=!1},n.onInputBlur=function(e){n.menuListRef&&n.menuListRef.contains(document.activeElement)?n.inputRef.focus():(n.props.onBlur&&n.props.onBlur(e),n.onInputChange("",{action:"input-blur"}),n.onMenuClose(),n.setState({focusedValue:null,isFocused:!1}))},n.onOptionHover=function(e){n.blockOptionHover||n.state.focusedOption===e||n.setState({focusedOption:e})},n.shouldHideSelectedOptions=function(){var e=n.props,t=e.hideSelectedOptions,r=e.isMulti;return void 0===t?r:t},n.onKeyDown=function(e){var t=n.props,r=t.isMulti,o=t.backspaceRemovesValue,i=t.escapeClearsValue,u=t.inputValue,a=t.isClearable,s=t.isDisabled,l=t.menuIsOpen,c=t.onKeyDown,p=t.tabSelectsValue,f=t.openMenuOnFocus,d=n.state,h=d.focusedOption,m=d.focusedValue,v=d.selectValue;if(!(s||"function"==typeof c&&(c(e),e.defaultPrevented))){switch(n.blockOptionHover=!0,e.key){case"ArrowLeft":if(!r||u)return;n.focusValue("previous");break;case"ArrowRight":if(!r||u)return;n.focusValue("next");break;case"Delete":case"Backspace":if(u)return;if(m)n.removeValue(m);else{if(!o)return;r?n.popValue():a&&n.clearValue()}break;case"Tab":if(n.isComposing)return;if(e.shiftKey||!l||!p||!h||f&&n.isOptionSelected(h,v))return;n.selectOption(h);break;case"Enter":if(229===e.keyCode)break;if(l){if(!h)return;if(n.isComposing)return;n.selectOption(h);break}return;case"Escape":l?(n.inputIsHiddenAfterUpdate=!1,n.onInputChange("",{action:"menu-close"}),n.onMenuClose()):a&&i&&n.clearValue();break;case" ":if(u)return;if(!l){n.openMenu("first");break}if(!h)return;n.selectOption(h);break;case"ArrowUp":l?n.focusOption("up"):n.openMenu("last");break;case"ArrowDown":l?n.focusOption("down"):n.openMenu("first");break;case"PageUp":if(!l)return;n.focusOption("pageup");break;case"PageDown":if(!l)return;n.focusOption("pagedown");break;case"Home":if(!l)return;n.focusOption("first");break;case"End":if(!l)return;n.focusOption("last");break;default:return}e.preventDefault()}},n.buildMenuOptions=function(e,t){var r=e.inputValue,o=void 0===r?"":r,i=e.options,u=function(e,r){var i=n.isOptionDisabled(e,t),u=n.isOptionSelected(e,t),a=n.getOptionLabel(e),s=n.getOptionValue(e);if(!(n.shouldHideSelectedOptions()&&u||!n.filterOption({label:a,value:s,data:e},o))){var l=i?void 0:function(){return n.onOptionHover(e)},c=i?void 0:function(){return n.selectOption(e)},p=n.getElementId("option")+"-"+r;return{innerProps:{id:p,onClick:c,onMouseMove:l,onMouseOver:l,tabIndex:-1},data:e,isDisabled:i,isSelected:u,key:p,label:a,type:"option",value:s}}};return i.reduce((function(e,t,r){if(t.options){n.hasGroups||(n.hasGroups=!0);var o=t.options.map((function(t,n){var o=u(t,r+"-"+n);return o&&e.focusable.push(t),o})).filter(Boolean);if(o.length){var i=n.getElementId("group")+"-"+r;e.render.push({type:"group",key:i,data:t,options:o})}}else{var a=u(t,""+r);a&&(e.render.push(a),e.focusable.push(t))}return e}),{render:[],focusable:[]})};var r=t.value;n.cacheComponents=u(n.cacheComponents,ve).bind(yt(yt(n))),n.cacheComponents(t.components),n.instancePrefix="react-select-"+(n.props.instanceId||++At);var o=X(r);n.buildMenuOptions=u(n.buildMenuOptions,(function(e,t){var n=e,r=n[0],o=n[1],i=t,u=i[0];return ve(o,i[1])&&ve(r.inputValue,u.inputValue)&&ve(r.options,u.options)})).bind(yt(yt(n)));var i=t.menuIsOpen?n.buildMenuOptions(t,o):{render:[],focusable:[]};return n.state.menuOptions=i,n.state.selectValue=o,n}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var i=r.prototype;return i.componentDidMount=function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()},i.UNSAFE_componentWillReceiveProps=function(e){var t=this.props,n=t.options,r=t.value,o=t.menuIsOpen,i=t.inputValue;if(this.cacheComponents(e.components),e.value!==r||e.options!==n||e.menuIsOpen!==o||e.inputValue!==i){var u=X(e.value),a=e.menuIsOpen?this.buildMenuOptions(e,u):{render:[],focusable:[]},s=this.getNextFocusedValue(u),l=this.getNextFocusedOption(a.focusable);this.setState({menuOptions:a,selectValue:u,focusedOption:l,focusedValue:s})}null!=this.inputIsHiddenAfterUpdate&&(this.setState({inputIsHidden:this.inputIsHiddenAfterUpdate}),delete this.inputIsHiddenAfterUpdate)},i.componentDidUpdate=function(e){var t,n,r,o,i,u=this.props,a=u.isDisabled,s=u.menuIsOpen,l=this.state.isFocused;(l&&!a&&e.isDisabled||l&&s&&!e.menuIsOpen)&&this.focusInput(),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(t=this.menuListRef,n=this.focusedOptionRef,r=t.getBoundingClientRect(),o=n.getBoundingClientRect(),i=n.offsetHeight/3,o.bottom+i>r.bottom?q(t,Math.min(n.offsetTop+n.clientHeight-t.offsetHeight+i,t.scrollHeight)):o.top-i-1&&(a=s)}this.scrollToFocusedOptionOnUpdate=!(o&&this.menuListRef),this.inputIsHiddenAfterUpdate=!1,this.setState({menuOptions:i,focusedValue:null,focusedOption:i.focusable[a]},(function(){t.onMenuOpen(),t.announceAriaLiveContext({event:"menu"})}))},i.focusValue=function(e){var t=this.props,n=t.isMulti,r=t.isSearchable,o=this.state,i=o.selectValue,u=o.focusedValue;if(n){this.setState({focusedOption:null});var a=i.indexOf(u);u||(a=-1,this.announceAriaLiveContext({event:"value"}));var s=i.length-1,l=-1;if(i.length){switch(e){case"previous":l=0===a?0:-1===a?s:a-1;break;case"next":a>-1&&a0?u-1:o.length-1:"down"===e?i=(u+1)%o.length:"pageup"===e?(i=u-t)<0&&(i=0):"pagedown"===e?(i=u+t)>o.length-1&&(i=o.length-1):"last"===e&&(i=o.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:o[i],focusedValue:null}),this.announceAriaLiveContext({event:"menu",context:{isDisabled:vt(o[i])}})}},i.getTheme=function(){return this.props.theme?"function"==typeof this.props.theme?this.props.theme(bt):Et({},bt,this.props.theme):bt},i.getCommonProps=function(){var e=this.clearValue,t=this.getStyles,n=this.setValue,r=this.selectOption,o=this.props,i=o.classNamePrefix,u=o.isMulti,a=o.isRtl,s=o.options,l=this.state.selectValue,c=this.hasValue();return{cx:Y.bind(null,i),clearValue:e,getStyles:t,getValue:function(){return l},hasValue:c,isMulti:u,isRtl:a,options:s,selectOption:r,setValue:n,selectProps:o,theme:this.getTheme()}},i.getNextFocusedValue=function(e){if(this.clearFocusValueOnUpdate)return this.clearFocusValueOnUpdate=!1,null;var t=this.state,n=t.focusedValue,r=t.selectValue.indexOf(n);if(r>-1){if(e.indexOf(n)>-1)return n;if(r-1?t:e[0]},i.hasValue=function(){return this.state.selectValue.length>0},i.hasOptions=function(){return!!this.state.menuOptions.render.length},i.countOptions=function(){return this.state.menuOptions.focusable.length},i.isClearable=function(){var e=this.props,t=e.isClearable,n=e.isMulti;return void 0===t?n:t},i.isOptionDisabled=function(e,t){return"function"==typeof this.props.isOptionDisabled&&this.props.isOptionDisabled(e,t)},i.isOptionSelected=function(e,t){var n=this;if(t.indexOf(e)>-1)return!0;if("function"==typeof this.props.isOptionSelected)return this.props.isOptionSelected(e,t);var r=this.getOptionValue(e);return t.some((function(e){return n.getOptionValue(e)===r}))},i.filterOption=function(e,t){return!this.props.filterOption||this.props.filterOption(e,t)},i.formatOptionLabel=function(e,t){if("function"==typeof this.props.formatOptionLabel){var n=this.props.inputValue,r=this.state.selectValue;return this.props.formatOptionLabel(e,{context:t,inputValue:n,selectValue:r})}return this.getOptionLabel(e)},i.formatGroupLabel=function(e){return this.props.formatGroupLabel(e)},i.startListeningComposition=function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))},i.stopListeningComposition=function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))},i.startListeningToTouch=function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))},i.stopListeningToTouch=function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))},i.constructAriaLiveMessage=function(){var e=this.state,t=e.ariaLiveContext,n=e.selectValue,r=e.focusedValue,o=e.focusedOption,i=this.props,u=i.options,a=i.menuIsOpen,s=i.inputValue,l=i.screenReaderStatus;return(r?function(e){var t=e.focusedValue,n=e.getOptionLabel,r=e.selectValue;return"value "+n(t)+" focused, "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedValue:r,getOptionLabel:this.getOptionLabel,selectValue:n}):"")+" "+(o&&a?function(e){var t=e.focusedOption,n=e.getOptionLabel,r=e.options;return"option "+n(t)+" focused"+(t.isDisabled?" disabled":"")+", "+(r.indexOf(t)+1)+" of "+r.length+"."}({focusedOption:o,getOptionLabel:this.getOptionLabel,options:u}):"")+" "+function(e){var t=e.inputValue;return e.screenReaderMessage+(t?" for search term "+t:"")+"."}({inputValue:s,screenReaderMessage:l({count:this.countOptions()})})+" "+t},i.renderInput=function(){var e=this.props,t=e.isDisabled,n=e.isSearchable,r=e.inputId,i=e.inputValue,u=e.tabIndex,a=this.components.Input,s=this.state.inputIsHidden,l=r||this.getElementId("input"),c={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};if(!n)return o.a.createElement(Qe,Et({id:l,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:G,onFocus:this.onInputFocus,readOnly:!0,disabled:t,tabIndex:u,value:""},c));var p=this.commonProps,f=p.cx,d=p.theme,h=p.selectProps;return o.a.createElement(a,Et({autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",cx:f,getStyles:this.getStyles,id:l,innerRef:this.getInputRef,isDisabled:t,isHidden:s,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,selectProps:h,spellCheck:"false",tabIndex:u,theme:d,type:"text",value:i},c))},i.renderPlaceholderOrValue=function(){var e=this,t=this.components,n=t.MultiValue,r=t.MultiValueContainer,i=t.MultiValueLabel,u=t.MultiValueRemove,a=t.SingleValue,s=t.Placeholder,l=this.commonProps,c=this.props,p=c.controlShouldRenderValue,f=c.isDisabled,d=c.isMulti,h=c.inputValue,m=c.placeholder,v=this.state,g=v.selectValue,b=v.focusedValue,E=v.isFocused;if(!this.hasValue()||!p)return h?null:o.a.createElement(s,Et({},l,{key:"placeholder",isDisabled:f,isFocused:E}),m);if(d)return g.map((function(t,a){var s=t===b;return o.a.createElement(n,Et({},l,{components:{Container:r,Label:i,Remove:u},isFocused:s,isDisabled:f,key:e.getOptionValue(t),index:a,removeProps:{onClick:function(){return e.removeValue(t)},onTouchEnd:function(){return e.removeValue(t)},onMouseDown:function(e){e.preventDefault(),e.stopPropagation()}},data:t}),e.formatOptionLabel(t,"value"))}));if(h)return null;var y=g[0];return o.a.createElement(a,Et({},l,{data:y,isDisabled:f}),this.formatOptionLabel(y,"value"))},i.renderClearIndicator=function(){var e=this.components.ClearIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!this.isClearable()||!e||r||!this.hasValue()||i)return null;var a={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:a,isFocused:u}))},i.renderLoadingIndicator=function(){var e=this.components.LoadingIndicator,t=this.commonProps,n=this.props,r=n.isDisabled,i=n.isLoading,u=this.state.isFocused;if(!e||!i)return null;return o.a.createElement(e,Et({},t,{innerProps:{"aria-hidden":"true"},isDisabled:r,isFocused:u}))},i.renderIndicatorSeparator=function(){var e=this.components,t=e.DropdownIndicator,n=e.IndicatorSeparator;if(!t||!n)return null;var r=this.commonProps,i=this.props.isDisabled,u=this.state.isFocused;return o.a.createElement(n,Et({},r,{isDisabled:i,isFocused:u}))},i.renderDropdownIndicator=function(){var e=this.components.DropdownIndicator;if(!e)return null;var t=this.commonProps,n=this.props.isDisabled,r=this.state.isFocused,i={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return o.a.createElement(e,Et({},t,{innerProps:i,isDisabled:n,isFocused:r}))},i.renderMenu=function(){var e=this,t=this.components,n=t.Group,r=t.GroupHeading,i=t.Menu,u=t.MenuList,a=t.MenuPortal,s=t.LoadingMessage,l=t.NoOptionsMessage,c=t.Option,p=this.commonProps,f=this.state,d=f.focusedOption,h=f.menuOptions,m=this.props,v=m.captureMenuScroll,g=m.inputValue,b=m.isLoading,E=m.loadingMessage,y=m.minMenuHeight,C=m.maxMenuHeight,O=m.menuIsOpen,A=m.menuPlacement,w=m.menuPosition,F=m.menuPortalTarget,x=m.menuShouldBlockScroll,S=m.menuShouldScrollIntoView,D=m.noOptionsMessage,k=m.onMenuScrollToTop,I=m.onMenuScrollToBottom;if(!O)return null;var M,P=function(t){var n=d===t.data;return t.innerRef=n?e.getFocusedOptionRef:void 0,o.a.createElement(c,Et({},p,t,{isFocused:n}),e.formatOptionLabel(t.data,"menu"))};if(this.hasOptions())M=h.render.map((function(t){if("group"===t.type){t.type;var i=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(t,["type"]),u=t.key+"-heading";return o.a.createElement(n,Et({},p,i,{Heading:r,headingProps:{id:u},label:e.formatGroupLabel(t.data)}),t.options.map((function(e){return P(e)})))}if("option"===t.type)return P(t)}));else if(b){var L=E({inputValue:g});if(null===L)return null;M=o.a.createElement(s,p,L)}else{var V=D({inputValue:g});if(null===V)return null;M=o.a.createElement(l,p,V)}var T={minMenuHeight:y,maxMenuHeight:C,menuPlacement:A,menuPosition:w,menuShouldScrollIntoView:S},R=o.a.createElement(ue,Et({},p,T),(function(t){var n=t.ref,r=t.placerProps,a=r.placement,s=r.maxHeight;return o.a.createElement(i,Et({},p,T,{innerRef:n,innerProps:{onMouseDown:e.onMenuMouseDown,onMouseMove:e.onMenuMouseMove},isLoading:b,placement:a}),o.a.createElement(dt,{isEnabled:v,onTopArrive:k,onBottomArrive:I},o.a.createElement(pt,{isEnabled:x},o.a.createElement(u,Et({},p,{innerRef:e.getMenuListRef,isLoading:b,maxHeight:s}),M))))}));return F||"fixed"===w?o.a.createElement(a,Et({},p,{appendTo:F,controlElement:this.controlRef,menuPlacement:A,menuPosition:w}),R):R},i.renderFormField=function(){var e=this,t=this.props,n=t.delimiter,r=t.isDisabled,i=t.isMulti,u=t.name,a=this.state.selectValue;if(u&&!r){if(i){if(n){var s=a.map((function(t){return e.getOptionValue(t)})).join(n);return o.a.createElement("input",{name:u,type:"hidden",value:s})}var l=a.length>0?a.map((function(t,n){return o.a.createElement("input",{key:"i-"+n,name:u,type:"hidden",value:e.getOptionValue(t)})})):o.a.createElement("input",{name:u,type:"hidden"});return o.a.createElement("div",null,l)}var c=a[0]?this.getOptionValue(a[0]):"";return o.a.createElement("input",{name:u,type:"hidden",value:c})}},i.renderLiveRegion=function(){return this.state.isFocused?o.a.createElement(qe,{"aria-live":"polite"},o.a.createElement("p",{id:"aria-selection-event"},"\xa0",this.state.ariaLiveSelection),o.a.createElement("p",{id:"aria-context"},"\xa0",this.constructAriaLiveMessage())):null},i.render=function(){var e=this.components,t=e.Control,n=e.IndicatorsContainer,r=e.SelectContainer,i=e.ValueContainer,u=this.props,a=u.className,s=u.id,l=u.isDisabled,c=u.menuIsOpen,p=this.state.isFocused,f=this.commonProps=this.getCommonProps();return o.a.createElement(r,Et({},f,{className:a,innerProps:{id:s,onKeyDown:this.onKeyDown},isDisabled:l,isFocused:p}),this.renderLiveRegion(),o.a.createElement(t,Et({},f,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:l,isFocused:p,menuIsOpen:c}),o.a.createElement(i,Et({},f,{isDisabled:l}),this.renderPlaceholderOrValue(),this.renderInput()),o.a.createElement(n,Et({},f,{isDisabled:l}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())},r}(r.Component);function Ft(){return(Ft=Object.assign||function(e){for(var t=1;t1?n-1:0),o=1;o=0||(o[n]=e[n]);return o}(t,["defaultInputValue","defaultMenuIsOpen","defaultValue"]));return o.a.createElement(St,Ft({},n,{ref:function(t){e.select=t},inputValue:this.getProp("inputValue"),menuIsOpen:this.getProp("menuIsOpen"),onChange:this.onChange,onInputChange:this.onInputChange,onMenuClose:this.onMenuClose,onMenuOpen:this.onMenuOpen,value:this.getProp("value")}))},r}(r.Component),Dt.defaultProps=xt,kt);t.a=It},454:function(e,t,n){"use strict";var r=n(0),o=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=o},465:function(e,t,n){var r=n(30),o=n(54),i=n(27),u=n(26),a=n(466);e.exports=function(e,t){var n=1==e,s=2==e,l=3==e,c=4==e,p=6==e,f=5==e||p,d=t||a;return function(t,a,h){for(var m,v,g=i(t),b=o(g),E=r(a,h,3),y=u(b.length),C=0,O=n?d(t,y):s?d(t,0):void 0;y>C;C++)if((f||C in b)&&(v=E(m=b[C],C,g),e))if(n)O[C]=v;else if(v)switch(e){case 3:return!0;case 5:return m;case 6:return C;case 2:O.push(m)}else if(c)return!1;return p?-1:l||c?c:O}}},466:function(e,t,n){var r=n(467);e.exports=function(e,t){return new(r(e))(t)}},467:function(e,t,n){var r=n(13),o=n(468),i=n(2)("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(e,t,n){var r=n(23);e.exports=Array.isArray||function(e){return"Array"==r(e)}},486:function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},566:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,u.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),u.default.createElement("input",r({},o,{ref:this.inputRef})),u.default.createElement("div",{ref:this.sizerRef,style:l},e),this.props.placeholder?u.default.createElement("div",{ref:this.placeHolderSizerRef,style:l},this.props.placeholder):null)}}]),t}(i.Component);h.propTypes={className:a.default.string,defaultValue:a.default.any,extraWidth:a.default.oneOfType([a.default.number,a.default.string]),id:a.default.string,injectStyles:a.default.bool,inputClassName:a.default.string,inputRef:a.default.func,inputStyle:a.default.object,minWidth:a.default.oneOfType([a.default.number,a.default.string]),onAutosize:a.default.func,onChange:a.default.func,placeholder:a.default.string,placeholderIsMinWidth:a.default.bool,style:a.default.object,value:a.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h}}]); \ No newline at end of file diff --git a/1.5236ee97.js.LICENSE.txt b/1.b6bd6afb.js.LICENSE.txt similarity index 100% rename from 1.5236ee97.js.LICENSE.txt rename to 1.b6bd6afb.js.LICENSE.txt diff --git a/17896441.5deb0378.js b/17896441.66ca3c52.js similarity index 98% rename from 17896441.5deb0378.js rename to 17896441.66ca3c52.js index 36e9d57e31..86de84336a 100644 --- a/17896441.5deb0378.js +++ b/17896441.66ca3c52.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{175:function(e,t,a){"use strict";a.r(t);a(446),a(447),a(29),a(22),a(21),a(77);var n=a(0),l=a.n(n),s=a(443),r=a(430),c=a(527),i=a(451),o=a.n(i),m=a(423),d=a.n(m),p=a(176),u=a.n(p),E=a(438),g=a(436),v=a(528);function h(e){var t=e.headings,a=e.isChild;if(Object(v.a)("contents__link","contents__link--active",100),!t.length)return null;var n=o.a.uniqBy(t,(function(e){return e.value}));return l.a.createElement("ul",{className:a?"":"contents"},n.map((function(e){var t=e.value.replace("<","<").replace(">",">");return l.a.createElement("li",{key:e.id},l.a.createElement("a",{href:"#"+e.id,className:"contents__link",dangerouslySetInnerHTML:{__html:t}}),l.a.createElement(h,{isChild:!0,headings:e.children}))})))}function _(e){var t=e.values,a=Object(g.a)().siteConfig,n=(void 0===a?{}:a).customFields.metadata.event_types,s=[];return n.forEach((function(e){t.includes(e)?s.push(l.a.createElement("span",{key:e,className:"text--primary"},o.a.capitalize(e))):s.push(l.a.createElement("del",{key:e,className:"text--warning"},o.a.capitalize(e))),s.push(l.a.createElement("span",{key:e+"-comma"},", "))})),s.pop(),s}function f(e){var t=e.operatingSystems,a=e.unsupportedOperatingSystems,n=[];return(t||[]).forEach((function(e){n.push(l.a.createElement("span",{key:e,className:"text--primary"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),(a||[]).forEach((function(e){n.push(l.a.createElement("del",{key:e,className:"text--warning"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),n.pop(),n}function N(e){var t=e.deliveryGuarantee,a=e.eventTypes,n=e.operatingSystems,s=e.status,c=e.unsupportedOperatingSystems;return s||t||n||c?l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Support"),"beta"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#beta",className:"text--warning",title:"This component is in beta and is not recommended for production environments. Click to learn more."},l.a.createElement("i",{className:"feather icon-alert-triangle"})," Beta Status")),"prod-ready"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#prod-ready",className:"text--primary",title:"This component has passed reliability standards that make it production ready. Click to learn more."},l.a.createElement("i",{className:"feather icon-award"})," Prod-Ready Status")),"best_effort"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#best-effort",className:"text--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield-off"})," Best-Effort Delivery")),"at_least_once"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#at-least-once",className:"text--primary",title:"This component offers an at-least-once delivery guarantee. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield"})," At-Least-Once")),a&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/data-model/",title:"This component works on the these event types."},l.a.createElement("i",{className:"feather icon-database"})," ",l.a.createElement(_,{values:a}))),n&&c&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/setup/installation/operating-systems/",title:"This component works on the "+n.join(", ")+" operating systems."},l.a.createElement("i",{className:"feather icon-cpu"})," ",l.a.createElement(f,{operatingSystems:n,unsupportedOperatingSystems:c})))):null}t.default=function(e){var t=Object(g.a)().siteConfig,a=void 0===t?{}:t,n=a.title,i=a.url,o=e.content,m=o.metadata,p=m.description,v=m.editUrl,_=m.image,f=m.keywords,y=m.lastUpdatedAt,k=m.lastUpdatedBy,b=m.permalink,w=m.title,x=m.version,S=o.frontMatter,C=(S.component_title,S.delivery_guarantee),T=S.event_types,O=S.function_category,j=(S.hide_title,S.hide_table_of_contents,S.issues_url),B=S.operating_systems,D=S.posts_path,I=S.source_url,L=S.status,V=S.unsupported_operating_systems,A=i+Object(E.a)(_);return l.a.createElement("div",null,l.a.createElement(s.a,null,w&&l.a.createElement("title",null,w," | Docs | ",n),p&&l.a.createElement("meta",{name:"description",content:p}),p&&l.a.createElement("meta",{property:"og:description",content:p}),f&&f.length&&l.a.createElement("meta",{name:"keywords",content:f.join(",")}),_&&l.a.createElement("meta",{property:"og:image",content:A}),_&&l.a.createElement("meta",{property:"twitter:image",content:A}),_&&l.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+w}),b&&l.a.createElement("meta",{property:"og:url",content:i+b})),l.a.createElement("div",{className:u.a.container},l.a.createElement("div",{className:u.a.leftCol},l.a.createElement("div",{className:"docItemContainer_"},l.a.createElement("article",null,x&&l.a.createElement("span",{style:{verticalAlign:"top"},className:"badge badge--info"},"Version: ",x),!m.hide_title&&l.a.createElement("header",null,l.a.createElement("div",{className:"badges"},O&&l.a.createElement(r.a,{to:"/components?functions[]="+O,className:"badge badge--primary"},O)),l.a.createElement("h1",{className:u.a.docTitle},m.title)),l.a.createElement("div",{className:"markdown"},l.a.createElement(o,null)))),!m.hide_pagination&&(m.next||m.previous)&&l.a.createElement("div",{className:u.a.paginator},l.a.createElement(c.a,{next:m.next,previous:m.previous}))),o.rightToc&&l.a.createElement("div",{className:u.a.rightCol},l.a.createElement("div",{className:d()("table-of-contents",u.a.tableOfContents)},l.a.createElement(N,{deliveryGuarantee:C,eventTypes:T,operatingSystems:B,status:L,unsupportedOperatingSystems:V}),o.rightToc.length>0&&l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Contents"),l.a.createElement(h,{headings:o.rightToc})),l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Resources"),l.a.createElement("ul",{className:"contents"},v&&l.a.createElement("li",null,l.a.createElement("a",{href:v,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-edit-1"})," Edit this page")),D&&l.a.createElement("li",null,l.a.createElement(r.a,{to:D,className:"contents__link"},l.a.createElement("i",{className:"feather icon-book-open"})," View Blog Posts")),j&&l.a.createElement("li",null,l.a.createElement("a",{href:j,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-message-circle"})," View Issues")),I&&l.a.createElement("li",null,l.a.createElement("a",{href:I,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-github"})," View Source")))),(y||k)&&l.a.createElement("div",{className:"section"},"Last updated"," ",y&&l.a.createElement(l.a.Fragment,null,"on"," ",l.a.createElement("strong",null,new Date(1e3*y).toLocaleDateString()),k&&" "),k&&l.a.createElement(l.a.Fragment,null,"by ",l.a.createElement("strong",null,k)))))))}},527:function(e,t,a){"use strict";var n=a(0),l=a.n(n),s=a(430),r=a(423),c=a.n(r);a(147);t.a=function(e){var t=e.className,a=e.previous,n=e.next;return l.a.createElement("nav",{className:c()("pagination-nav",t)},l.a.createElement("div",{className:"pagination-nav__item"},a&&l.a.createElement(s.a,{className:"pagination-nav__link",to:a.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),l.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",a.title))),l.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},n&&l.a.createElement(s.a,{className:"pagination-nav__link",to:n.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),l.a.createElement("h4",{className:"pagination-nav__link--label"},n.title," \xbb"))))}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{175:function(e,t,a){"use strict";a.r(t);a(448),a(449),a(29),a(22),a(21),a(77);var n=a(0),l=a.n(n),s=a(444),r=a(430),c=a(527),i=a(451),o=a.n(i),m=a(423),d=a.n(m),p=a(176),u=a.n(p),E=a(438),g=a(436),v=a(528);function h(e){var t=e.headings,a=e.isChild;if(Object(v.a)("contents__link","contents__link--active",100),!t.length)return null;var n=o.a.uniqBy(t,(function(e){return e.value}));return l.a.createElement("ul",{className:a?"":"contents"},n.map((function(e){var t=e.value.replace("<","<").replace(">",">");return l.a.createElement("li",{key:e.id},l.a.createElement("a",{href:"#"+e.id,className:"contents__link",dangerouslySetInnerHTML:{__html:t}}),l.a.createElement(h,{isChild:!0,headings:e.children}))})))}function _(e){var t=e.values,a=Object(g.a)().siteConfig,n=(void 0===a?{}:a).customFields.metadata.event_types,s=[];return n.forEach((function(e){t.includes(e)?s.push(l.a.createElement("span",{key:e,className:"text--primary"},o.a.capitalize(e))):s.push(l.a.createElement("del",{key:e,className:"text--warning"},o.a.capitalize(e))),s.push(l.a.createElement("span",{key:e+"-comma"},", "))})),s.pop(),s}function f(e){var t=e.operatingSystems,a=e.unsupportedOperatingSystems,n=[];return(t||[]).forEach((function(e){n.push(l.a.createElement("span",{key:e,className:"text--primary"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),(a||[]).forEach((function(e){n.push(l.a.createElement("del",{key:e,className:"text--warning"},e)),n.push(l.a.createElement("span",{key:e+"-comma"},", "))})),n.pop(),n}function N(e){var t=e.deliveryGuarantee,a=e.eventTypes,n=e.operatingSystems,s=e.status,c=e.unsupportedOperatingSystems;return s||t||n||c?l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Support"),"beta"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#beta",className:"text--warning",title:"This component is in beta and is not recommended for production environments. Click to learn more."},l.a.createElement("i",{className:"feather icon-alert-triangle"})," Beta Status")),"prod-ready"==s&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#prod-ready",className:"text--primary",title:"This component has passed reliability standards that make it production ready. Click to learn more."},l.a.createElement("i",{className:"feather icon-award"})," Prod-Ready Status")),"best_effort"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#best-effort",className:"text--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield-off"})," Best-Effort Delivery")),"at_least_once"==t&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/whats-next/#at-least-once",className:"text--primary",title:"This component offers an at-least-once delivery guarantee. Click to learn more."},l.a.createElement("i",{className:"feather icon-shield"})," At-Least-Once")),a&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/getting-started/data-model/",title:"This component works on the these event types."},l.a.createElement("i",{className:"feather icon-database"})," ",l.a.createElement(_,{values:a}))),n&&c&&l.a.createElement("div",null,l.a.createElement(r.a,{to:"/docs/setup/installation/operating-systems/",title:"This component works on the "+n.join(", ")+" operating systems."},l.a.createElement("i",{className:"feather icon-cpu"})," ",l.a.createElement(f,{operatingSystems:n,unsupportedOperatingSystems:c})))):null}t.default=function(e){var t=Object(g.a)().siteConfig,a=void 0===t?{}:t,n=a.title,i=a.url,o=e.content,m=o.metadata,p=m.description,v=m.editUrl,_=m.image,f=m.keywords,y=m.lastUpdatedAt,k=m.lastUpdatedBy,b=m.permalink,w=m.title,x=m.version,S=o.frontMatter,C=(S.component_title,S.delivery_guarantee),T=S.event_types,O=S.function_category,j=(S.hide_title,S.hide_table_of_contents,S.issues_url),B=S.operating_systems,D=S.posts_path,I=S.source_url,L=S.status,V=S.unsupported_operating_systems,A=i+Object(E.a)(_);return l.a.createElement("div",null,l.a.createElement(s.a,null,w&&l.a.createElement("title",null,w," | Docs | ",n),p&&l.a.createElement("meta",{name:"description",content:p}),p&&l.a.createElement("meta",{property:"og:description",content:p}),f&&f.length&&l.a.createElement("meta",{name:"keywords",content:f.join(",")}),_&&l.a.createElement("meta",{property:"og:image",content:A}),_&&l.a.createElement("meta",{property:"twitter:image",content:A}),_&&l.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+w}),b&&l.a.createElement("meta",{property:"og:url",content:i+b})),l.a.createElement("div",{className:u.a.container},l.a.createElement("div",{className:u.a.leftCol},l.a.createElement("div",{className:"docItemContainer_"},l.a.createElement("article",null,x&&l.a.createElement("span",{style:{verticalAlign:"top"},className:"badge badge--info"},"Version: ",x),!m.hide_title&&l.a.createElement("header",null,l.a.createElement("div",{className:"badges"},O&&l.a.createElement(r.a,{to:"/components?functions[]="+O,className:"badge badge--primary"},O)),l.a.createElement("h1",{className:u.a.docTitle},m.title)),l.a.createElement("div",{className:"markdown"},l.a.createElement(o,null)))),!m.hide_pagination&&(m.next||m.previous)&&l.a.createElement("div",{className:u.a.paginator},l.a.createElement(c.a,{next:m.next,previous:m.previous}))),o.rightToc&&l.a.createElement("div",{className:u.a.rightCol},l.a.createElement("div",{className:d()("table-of-contents",u.a.tableOfContents)},l.a.createElement(N,{deliveryGuarantee:C,eventTypes:T,operatingSystems:B,status:L,unsupportedOperatingSystems:V}),o.rightToc.length>0&&l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Contents"),l.a.createElement(h,{headings:o.rightToc})),l.a.createElement("div",{className:"section"},l.a.createElement("div",{className:"title"},"Resources"),l.a.createElement("ul",{className:"contents"},v&&l.a.createElement("li",null,l.a.createElement("a",{href:v,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-edit-1"})," Edit this page")),D&&l.a.createElement("li",null,l.a.createElement(r.a,{to:D,className:"contents__link"},l.a.createElement("i",{className:"feather icon-book-open"})," View Blog Posts")),j&&l.a.createElement("li",null,l.a.createElement("a",{href:j,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-message-circle"})," View Issues")),I&&l.a.createElement("li",null,l.a.createElement("a",{href:I,className:"contents__link",target:"_blank"},l.a.createElement("i",{className:"feather icon-github"})," View Source")))),(y||k)&&l.a.createElement("div",{className:"section"},"Last updated"," ",y&&l.a.createElement(l.a.Fragment,null,"on"," ",l.a.createElement("strong",null,new Date(1e3*y).toLocaleDateString()),k&&" "),k&&l.a.createElement(l.a.Fragment,null,"by ",l.a.createElement("strong",null,k)))))))}},527:function(e,t,a){"use strict";var n=a(0),l=a.n(n),s=a(430),r=a(423),c=a.n(r);a(147);t.a=function(e){var t=e.className,a=e.previous,n=e.next;return l.a.createElement("nav",{className:c()("pagination-nav",t)},l.a.createElement("div",{className:"pagination-nav__item"},a&&l.a.createElement(s.a,{className:"pagination-nav__link",to:a.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),l.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",a.title))),l.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},n&&l.a.createElement(s.a,{className:"pagination-nav__link",to:n.permalink},l.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),l.a.createElement("h4",{className:"pagination-nav__link--label"},n.title," \xbb"))))}}}]); \ No newline at end of file diff --git a/1a3e0044.410046e9.js b/1a3e0044.5e90d335.js similarity index 99% rename from 1a3e0044.410046e9.js rename to 1a3e0044.5e90d335.js index 7124f4dca6..a6279fb6b9 100644 --- a/1a3e0044.410046e9.js +++ b/1a3e0044.5e90d335.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{180:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(425)),o=n(424),l=(n(437),n(429)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Deploy Temporal on Kubernetes",permalink:"/guides/tutorial/deploy-temporal-on-kubernetes"},nextItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),i=n(423),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),i=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(449),l=n(423),c=n.n(l),b=n(433),s=n.n(b),u=n(448),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{180:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(425)),o=n(424),l=(n(437),n(429)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Deploy Temporal on Kubernetes",permalink:"/guides/tutorial/deploy-temporal-on-kubernetes"},nextItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),i=n(423),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),i=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(447),l=n(423),c=n.n(l),b=n(433),s=n.n(b),u=n(446),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/1a6d3985.2998ed19.js b/1a6d3985.d3f4b70d.js similarity index 99% rename from 1a6d3985.2998ed19.js rename to 1a6d3985.d3f4b70d.js index b49bf5ea0a..9a559f3240 100644 --- a/1a6d3985.2998ed19.js +++ b/1a6d3985.d3f4b70d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{181:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(449),l=n(423),c=n.n(l),s=n(433),u=n.n(s),b=n(448),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{181:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(447),l=n(423),c=n.n(l),s=n(433),u=n.n(s),b=n(446),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file diff --git a/1be78505.9c8c9847.js b/1be78505.03ed5509.js similarity index 99% rename from 1be78505.9c8c9847.js rename to 1be78505.03ed5509.js index 253dd930d3..8c089760c5 100644 --- a/1be78505.9c8c9847.js +++ b/1be78505.03ed5509.js @@ -1,2 +1,2 @@ -/*! For license information please see 1be78505.9c8c9847.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35,270],{420:function(e,t,n){"use strict";n.r(t);n(29),n(22),n(21),n(52),n(439);var a=n(0),r=n.n(a),i=n(425),o=n(423),l=n.n(o),s=n(436),c=n(67),u=n(445),d=n(1),p=(n(78),n(446),n(447),n(430)),m=n(440),f=n.n(m);n(438);var b=n(452),g=n(453),h=n(184),y=n.n(h);n(185);function v(e){var t=e.item,n=e.level,i=e.onItemClick,o=e.collapsible,s=t.items,c=t.href,u=t.label,m=t.type,f=Object(a.useState)(t.collapsed),b=f[0],g=f[1],h=Object(a.useState)(null),y=h[0],k=h[1];switch(t.collapsed!==y&&(k(t.collapsed),g(t.collapsed)),m){case"category":if(0==s.length)return!1;if(1==n)return r.a.createElement("li",{className:l()("menu__list-item"),key:u},r.a.createElement("div",{className:"title"},u),r.a.createElement("ul",{className:"menu__list"},s.map((function(e){return r.a.createElement(v,{key:e.label,item:e,level:n+1,onItemClick:i,collapsible:o})}))));var w=s[0].href;return r.a.createElement("li",{className:l()("menu__list-item",{"menu__list-item--collapsed":b}),key:u},r.a.createElement(p.a,{activeClassName:"menu__link--active",className:l()("menu__link",{"menu__link--sublist":o}),to:w+"/",onClick:o&&"#!"==w?function(){return g(!b)}:void 0},u),r.a.createElement("ul",{className:"menu__list"},s.map((function(e){return r.a.createElement(v,{key:e.label,item:e,level:n+1,onItemClick:i,collapsible:o})}))));case"link":default:var E=[],_=u;if(u.includes("|")){var x=u.split("|",2);_=x[0],E=JSON.parse(x[1])}var O="hidden"==_;return r.a.createElement("li",{className:l()("menu__list-item",O&&"menu__list-item-hidden"),key:u},r.a.createElement(p.a,Object(d.a)({className:"menu__link",to:c+"/"},/^\/(?!\/)/.test(c)?{activeClassName:"menu__link--active",exact:!0,onClick:i}:{target:"_blank",rel:"noreferrer noopener"}),_,E.length>0&&r.a.createElement("span",{className:"badges"},E.includes("log")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with log events."},"L"),E.includes("metric")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with metric events."},"M"))))}}var k=function(e){var t=Object(a.useState)(!1),n=t[0],i=t[1],o=Object(s.a)(),c=o.siteConfig,u=(c=void 0===c?{}:c).themeConfig.navbar,m=(u=void 0===u?{}:u).title,h=o.isClient,k=Object(g.a)(),w=k.logoLink,E=k.logoLinkProps,_=k.logoImageUrl,x=k.logoAlt,O=e.docsSidebars,j=e.path,S=e.sidebar,N=e.sidebarCollapsible;if(Object(b.a)(n),!S)return null;var T=O[S];if(!T)throw new Error('Cannot find the sidebar "'+S+'" in the sidebar config!');return N&&T.forEach((function(e){return function e(t,n){var a=t.items,r=t.href;switch(t.type){case"category":var i=a.map((function(t){return e(t,n)})).filter((function(e){return e})).length>0;return t.collapsed=!i,i;case"link":default:return r===n}}(e,j)})),r.a.createElement("div",{className:l()("docs-sidebar",y.a.sidebar)},r.a.createElement(p.a,Object(d.a)({className:y.a.sidebarLogo,style:{maxWidth:"130px"},to:w},E),null!=_&&r.a.createElement(f.a,{key:h,src:_,alt:x}),null!=m&&r.a.createElement("strong",null,m)),r.a.createElement("div",{className:l()("menu","menu--responsive",y.a.menu,{"menu--show":n})},r.a.createElement("button",{"aria-label":n?"Close Menu":"Open Menu",className:"button button--secondary button--sm menu__button",type:"button",onClick:function(){i(!n)}},n?r.a.createElement("span",{className:l()(y.a.sidebarMenuIcon,y.a.sidebarMenuCloseIcon)},"\xd7"):r.a.createElement("svg",{className:y.a.sidebarMenuIcon,xmlns:"http://www.w3.org/2000/svg",height:24,width:24,viewBox:"0 0 32 32",role:"img",focusable:"false"},r.a.createElement("title",null,"Menu"),r.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))),r.a.createElement("ul",{className:"menu__list"},T.map((function(e){return e.items.length>0&&r.a.createElement(v,{key:e.label,item:e,level:1,onItemClick:function(){i(!1)},collapsible:N})})))))},w=n(529),E=n(564),_=n(472),x=n(186),O=n.n(x);t.default=function(e){var t=e.route,n=e.docsMetadata,a=e.location,o=t.routes.find((function(e){return Object(_.b)(a.pathname,e)}))||{},d=n.permalinkToSidebar,p=n.docsSidebars,m=n.version,f=d[o.path],b=Object(s.a)(),g=b.siteConfig,h=(g=void 0===g?{}:g).themeConfig,y=void 0===h?{}:h,v=b.isClient,x=y.sidebarCollapsible,j=void 0===x||x;return 0===Object.keys(o).length?r.a.createElement(E.default,e):r.a.createElement(u.a,{version:m,key:v},r.a.createElement("div",{className:l()(O.a.container,"container","container--l")},f&&r.a.createElement("div",{className:l()(O.a.sidebar)},r.a.createElement(k,{docsSidebars:p,path:o.path,sidebar:f,sidebarCollapsible:j})),r.a.createElement("main",{className:O.a.main},r.a.createElement(i.a,{components:w.a},Object(c.a)(t.routes)))))}},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(o,".").concat(m)]||d[m]||p[m]||i;return n?r.a.createElement(f,l({ref:t},c,{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c1?arguments[1]:void 0)}}),n(74)("find")},445:function(e,t,n){"use strict";n(457);var a=n(0),r=n.n(a),i=n(458),o=n(443),l=n(1),s=(n(446),n(447),n(459),n(430)),c=n(460),u=n(440),d=n.n(u),p=n(461),m=n.n(p),f=n(436),b=n(423),g=n.n(b),h=n(135),y=n.n(h),v=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.moon)})},k=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.sun)})},w=function(e){var t=Object(f.a)().isClient;return r.a.createElement(m.a,Object(l.a)({disabled:!t,icons:{checked:r.a.createElement(v,null),unchecked:r.a.createElement(k,null)}},e))};function E(){var e=Object(f.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),a=new Date,r=Math.abs(a-n),i=Math.ceil(r/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:m,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),s.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(R,e))}))):null)}))),(u||o)&&r.a.createElement("div",{className:"text--center"},u&&u.src&&r.a.createElement("div",{className:"margin-bottom--sm"},u.href?r.a.createElement("a",{href:u.href,target:"_blank",rel:"noopener noreferrer",className:I.a.footerLogoLink},r.a.createElement(D,{alt:u.alt,url:p})):r.a.createElement(D,{alt:u.alt,url:p})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},M=n(462),F=n(463),q=n(3);n(138);t.a=function(e){var t=Object(f.a)().siteConfig,n=void 0===t?{}:t,a=n.favicon,l=(n.tagline,n.title),s=n.themeConfig.image,c=n.url,u=e.children,d=e.title,p=e.noFooter,m=e.description,b=e.image,g=e.keywords,h=(e.permalink,e.version),y=d?d+" | "+l:l,v=b||s,k=c+Object(x.a)(v),w=Object(x.a)(a),E=Object(q.h)(),_=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return r.a.createElement(F.a,null,r.a.createElement(M.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),y&&r.a.createElement("title",null,y),y&&r.a.createElement("meta",{property:"og:title",content:y}),a&&r.a.createElement("link",{rel:"shortcut icon",href:w}),m&&r.a.createElement("meta",{name:"description",content:m}),m&&r.a.createElement("meta",{property:"og:description",content:m}),h&&r.a.createElement("meta",{name:"docsearch:version",content:h}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),v&&r.a.createElement("meta",{property:"og:image",content:k}),v&&r.a.createElement("meta",{property:"twitter:image",content:k}),v&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+y}),_&&r.a.createElement("meta",{property:"og:url",content:_}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),_&&r.a.createElement("link",{rel:"canonical",href:_})),r.a.createElement(i.a,null),r.a.createElement(A,null),r.a.createElement("div",{className:"main-wrapper"},u),!p&&r.a.createElement($,null)))}},450:function(e,t,n){"use strict";var a=n(9),r=n(0),i=n.n(r),o=n(423),l=n.n(o),s=n(436),c=(n(139),n(140)),u=n.n(c);t.a=function(e){return function(t){var n,r=t.id,o=Object(a.a)(t,["id"]),c=Object(s.a)().siteConfig,d=(c=void 0===c?{}:c).themeConfig,p=(d=void 0===d?{}:d).navbar,m=(p=void 0===p?{}:p).hideOnScroll,f=void 0!==m&&m;return r?i.a.createElement(e,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:l()("anchor",(n={},n[u.a.enhancedAnchor]=!f,n)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),o.children):i.a.createElement(e,o)}}},454:function(e,t,n){"use strict";var a=n(0),r=Object(a.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},465:function(e,t,n){var a=n(30),r=n(54),i=n(27),o=n(26),l=n(466);e.exports=function(e,t){var n=1==e,s=2==e,c=3==e,u=4==e,d=6==e,p=5==e||d,m=t||l;return function(t,l,f){for(var b,g,h=i(t),y=r(h),v=a(l,f,3),k=o(y.length),w=0,E=n?m(t,k):s?m(t,0):void 0;k>w;w++)if((p||w in y)&&(g=v(b=y[w],w,h),e))if(n)E[w]=g;else if(g)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:E.push(b)}else if(u)return!1;return d?-1:c||u?u:E}}},466:function(e,t,n){var a=n(467);e.exports=function(e,t){return new(a(e))(t)}},467:function(e,t,n){var a=n(13),r=n(468),i=n(2)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)||(t=void 0),a(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(e,t,n){var a=n(23);e.exports=Array.isArray||function(e){return"Array"==a(e)}},487:function(e,t,n){"use strict";(function(e){var a=n(1),r=(n(446),n(447),n(78),n(77),n(530),n(0)),i=n.n(r),o=n(531),l=n.n(o),s=n(563),c=n(53),u=n(423),d=n.n(u),p=n(543),m=n.n(p),f=n(532),b=n.n(f),g=n(436),h=n(441),y=n(148),v=n.n(y);(void 0!==e?e:window).Prism=c.a,n(533),n(534),n(535),n(536),n(90),n(537),n(538),n(539),n(540),n(541),n(542);var k=/{([\d,-]+)}/,w=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,o=e.metastring,c=Object(g.a)().siteConfig.themeConfig.prism,u=void 0===c?{}:c,p=Object(r.useState)(!1),f=p[0],y=p[1],E=Object(r.useState)(!1),_=E[0],x=E[1];Object(r.useEffect)((function(){x(!0)}),[]);var O=Object(r.useRef)(null),j=Object(r.useRef)(null),S=[],N="",T=Object(h.a)().isDarkTheme,C=u.theme||m.a,P=u.darkTheme||C,A=T?P:C;if(o&&k.test(o)){var z=o.match(k)[1];S=b.a.parse(z).filter((function(e){return e>0}))}o&&w.test(o)&&(N=o.match(w)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return j.current&&(e=new l.a(j.current,{target:function(){return O.current}})),function(){e&&e.destroy()}}),[j.current,O.current]);var L=n&&n.replace(/language-/,"");!L&&u.defaultLanguage&&(L=u.defaultLanguage);var I=function(){window.getSelection().empty(),y(!0),setTimeout((function(){return y(!1)}),2e3)};return i.a.createElement(s.a,Object(a.a)({},s.b,{key:_,theme:A,code:t.trim(),language:L}),(function(e){var t,n,r=e.className,o=e.style,l=e.tokens,s=e.getLineProps,c=e.getTokenProps;return i.a.createElement(i.a.Fragment,null,N&&i.a.createElement("div",{style:o,className:v.a.codeBlockTitle},N),i.a.createElement("div",{className:v.a.codeBlockContent},i.a.createElement("button",{ref:j,type:"button","aria-label":"Copy code to clipboard",className:d()(v.a.copyButton,(t={},t[v.a.copyButtonWithTitle]=N,t)),onClick:I},f?"Copied":"Copy"),i.a.createElement("pre",{className:d()(r,v.a.codeBlock,(n={},n[v.a.codeBlockWithTitle]=N,n))},i.a.createElement("div",{ref:O,className:v.a.codeBlockLines,style:o},l.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=s({line:e,key:t});return S.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),i.a.createElement("div",Object(a.a)({key:t},n),e.map((function(e,t){return i.a.createElement("span",Object(a.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},529:function(e,t,n){"use strict";var a=n(1),r=n(0),i=n.n(r),o=n(430),l=n(487),s=n(450),c=n(149),u=n.n(c);t.a={code:function(e){var t=e.children;return"string"==typeof t?i.a.createElement(l.a,e):t},a:function(e){return/\.[^./]+$/.test(e.href)?i.a.createElement("a",e):i.a.createElement(o.a,e)},pre:function(e){return i.a.createElement("div",Object(a.a)({className:u.a.mdxCodeBlock},e))},h1:Object(s.a)("h1"),h2:Object(s.a)("h2"),h3:Object(s.a)("h3"),h4:Object(s.a)("h4"),h5:Object(s.a)("h5"),h6:Object(s.a)("h6")}},530:function(e,t,n){"use strict";var a=n(8),r=n(26),i=n(60),o=n(55);n(56)("match",1,(function(e,t,n,l){return[function(n){var a=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,a):new RegExp(n)[t](String(a))},function(e){var t=l(n,e,this);if(t.done)return t.value;var s=a(e),c=String(this);if(!s.global)return o(s,c);var u=s.unicode;s.lastIndex=0;for(var d,p=[],m=0;null!==(d=o(s,c));){var f=String(d[0]);p[m]=f,""===f&&(s.lastIndex=i(c,r(s.lastIndex),u)),m++}return 0===m?null:p}]}))},531:function(e,t,n){var a;a=function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var a=window.getSelection(),r=document.createRange();r.selectNodeContents(e),a.removeAllRanges(),a.addRange(r),t=a.toString()}return t}},function(e,t){function n(){}n.prototype={on:function(e,t,n){var a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var a=this;function r(){a.off(e,r),t.apply(n,arguments)}return r._=t,this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),a=0,r=n.length;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),s=n(1),c=n.n(s),u=n(2),d=n.n(u),p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=d()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return b("action",e)}},{key:"defaultTarget",value:function(e){var t=b("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return b("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function b(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=f}]).default},e.exports=a()},532:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],a=t[2],r=t[3];if(n&&r){var i=[],o=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=a&&".."!=a&&"\u2025"!=a||(r+=o);for(var l=n;l!=r;l+=o)i.push(l);return i}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},533:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,a=e.languages,r={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function o(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var l in r)if(r[l]){n=n||{};var s=i[l]?o(l):l;n[l.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+s+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[l]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},534:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},535:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},536:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},537:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},538:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},539:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},540:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},541:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var o={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:o}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:o}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},542:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),i=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(i),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},543:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},563:function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var a=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},i=n(0),o={Prism:a.a,theme:r};function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return(s=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},p=function(e,t){var n=e.plain,a=Object.create(null),r=e.styles.reduce((function(e,n){var a=n.languages,r=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=s({},e[t],r);e[t]=n})),e}),a);return r.root=n,r.plain=s({},n,{backgroundColor:null}),r};function m(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var f=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),l(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?p(e.theme,e.language):void 0;return t.themeDict=n})),l(this,"getLineProps",(function(e){var n=e.key,a=e.className,r=e.style,i=s({},m(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),o=t.getThemeDict(t.props);return void 0!==o&&(i.style=o.plain),void 0!==r&&(i.style=void 0!==i.style?s({},i.style,r):r),void 0!==n&&(i.key=n),a&&(i.className+=" "+a),i})),l(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,r=n.length,i=t.getThemeDict(t.props);if(void 0!==i){if(1===r&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===r&&!a)return i[n[0]];var o=a?{display:"inline-block"}:{},l=n.map((function(e){return i[e]}));return Object.assign.apply(Object,[o].concat(l))}})),l(this,"getTokenProps",(function(e){var n=e.key,a=e.className,r=e.style,i=e.token,o=s({},m(e,["key","className","style","token"]),{className:"token "+i.types.join(" "),children:i.content,style:t.getStyleForToken(i),key:void 0});return void 0!==r&&(o.style=void 0!==o.style?s({},o.style,r):r),void 0!==n&&(o.key=n),a&&(o.className+=" "+a),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,r=e.children,i=this.getThemeDict(this.props),o=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],a=[0],r=[e.length],i=0,o=0,l=[],s=[l];o>-1;){for(;(i=a[o]++)0?m:["plain"],p=f):(m=d(m,f.type),f.alias&&(m=d(m,f.alias)),p=f.content),"string"==typeof p){var b=p.split(c),g=b.length;l.push({types:m,content:b[0]});for(var h=1;h0&&r.a.createElement("span",{className:"badges"},E.includes("log")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with log events."},"L"),E.includes("metric")&&r.a.createElement("span",{className:"badge badge--secondary",title:"This component works with metric events."},"M"))))}}var k=function(e){var t=Object(a.useState)(!1),n=t[0],i=t[1],o=Object(s.a)(),c=o.siteConfig,u=(c=void 0===c?{}:c).themeConfig.navbar,m=(u=void 0===u?{}:u).title,h=o.isClient,k=Object(g.a)(),w=k.logoLink,E=k.logoLinkProps,_=k.logoImageUrl,x=k.logoAlt,O=e.docsSidebars,j=e.path,S=e.sidebar,N=e.sidebarCollapsible;if(Object(b.a)(n),!S)return null;var T=O[S];if(!T)throw new Error('Cannot find the sidebar "'+S+'" in the sidebar config!');return N&&T.forEach((function(e){return function e(t,n){var a=t.items,r=t.href;switch(t.type){case"category":var i=a.map((function(t){return e(t,n)})).filter((function(e){return e})).length>0;return t.collapsed=!i,i;case"link":default:return r===n}}(e,j)})),r.a.createElement("div",{className:l()("docs-sidebar",y.a.sidebar)},r.a.createElement(p.a,Object(d.a)({className:y.a.sidebarLogo,style:{maxWidth:"130px"},to:w},E),null!=_&&r.a.createElement(f.a,{key:h,src:_,alt:x}),null!=m&&r.a.createElement("strong",null,m)),r.a.createElement("div",{className:l()("menu","menu--responsive",y.a.menu,{"menu--show":n})},r.a.createElement("button",{"aria-label":n?"Close Menu":"Open Menu",className:"button button--secondary button--sm menu__button",type:"button",onClick:function(){i(!n)}},n?r.a.createElement("span",{className:l()(y.a.sidebarMenuIcon,y.a.sidebarMenuCloseIcon)},"\xd7"):r.a.createElement("svg",{className:y.a.sidebarMenuIcon,xmlns:"http://www.w3.org/2000/svg",height:24,width:24,viewBox:"0 0 32 32",role:"img",focusable:"false"},r.a.createElement("title",null,"Menu"),r.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))),r.a.createElement("ul",{className:"menu__list"},T.map((function(e){return e.items.length>0&&r.a.createElement(v,{key:e.label,item:e,level:1,onItemClick:function(){i(!1)},collapsible:N})})))))},w=n(529),E=n(564),_=n(472),x=n(186),O=n.n(x);t.default=function(e){var t=e.route,n=e.docsMetadata,a=e.location,o=t.routes.find((function(e){return Object(_.b)(a.pathname,e)}))||{},d=n.permalinkToSidebar,p=n.docsSidebars,m=n.version,f=d[o.path],b=Object(s.a)(),g=b.siteConfig,h=(g=void 0===g?{}:g).themeConfig,y=void 0===h?{}:h,v=b.isClient,x=y.sidebarCollapsible,j=void 0===x||x;return 0===Object.keys(o).length?r.a.createElement(E.default,e):r.a.createElement(u.a,{version:m,key:v},r.a.createElement("div",{className:l()(O.a.container,"container","container--l")},f&&r.a.createElement("div",{className:l()(O.a.sidebar)},r.a.createElement(k,{docsSidebars:p,path:o.path,sidebar:f,sidebarCollapsible:j})),r.a.createElement("main",{className:O.a.main},r.a.createElement(i.a,{components:w.a},Object(c.a)(t.routes)))))}},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l({},t,{},e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,o=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=a,f=d["".concat(o,".").concat(m)]||d[m]||p[m]||i;return n?r.a.createElement(f,l({ref:t},c,{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c1?arguments[1]:void 0)}}),n(74)("find")},445:function(e,t,n){"use strict";n(457);var a=n(0),r=n.n(a),i=n(458),o=n(444),l=n(1),s=(n(448),n(449),n(459),n(430)),c=n(460),u=n(440),d=n.n(u),p=n(461),m=n.n(p),f=n(436),b=n(423),g=n.n(b),h=n(135),y=n.n(h),v=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.moon)})},k=function(){return r.a.createElement("span",{className:g()(y.a.toggle,y.a.sun)})},w=function(e){var t=Object(f.a)().isClient;return r.a.createElement(m.a,Object(l.a)({disabled:!t,icons:{checked:r.a.createElement(v,null),unchecked:r.a.createElement(k,null)}},e))};function E(){var e=Object(f.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),a=new Date,r=Math.abs(a-n),i=Math.ceil(r/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:m,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),s.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(R,e))}))):null)}))),(u||o)&&r.a.createElement("div",{className:"text--center"},u&&u.src&&r.a.createElement("div",{className:"margin-bottom--sm"},u.href?r.a.createElement("a",{href:u.href,target:"_blank",rel:"noopener noreferrer",className:I.a.footerLogoLink},r.a.createElement(D,{alt:u.alt,url:p})):r.a.createElement(D,{alt:u.alt,url:p})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},M=n(462),F=n(463),q=n(3);n(138);t.a=function(e){var t=Object(f.a)().siteConfig,n=void 0===t?{}:t,a=n.favicon,l=(n.tagline,n.title),s=n.themeConfig.image,c=n.url,u=e.children,d=e.title,p=e.noFooter,m=e.description,b=e.image,g=e.keywords,h=(e.permalink,e.version),y=d?d+" | "+l:l,v=b||s,k=c+Object(x.a)(v),w=Object(x.a)(a),E=Object(q.h)(),_=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return r.a.createElement(F.a,null,r.a.createElement(M.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),y&&r.a.createElement("title",null,y),y&&r.a.createElement("meta",{property:"og:title",content:y}),a&&r.a.createElement("link",{rel:"shortcut icon",href:w}),m&&r.a.createElement("meta",{name:"description",content:m}),m&&r.a.createElement("meta",{property:"og:description",content:m}),h&&r.a.createElement("meta",{name:"docsearch:version",content:h}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),v&&r.a.createElement("meta",{property:"og:image",content:k}),v&&r.a.createElement("meta",{property:"twitter:image",content:k}),v&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+y}),_&&r.a.createElement("meta",{property:"og:url",content:_}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),_&&r.a.createElement("link",{rel:"canonical",href:_})),r.a.createElement(i.a,null),r.a.createElement(A,null),r.a.createElement("div",{className:"main-wrapper"},u),!p&&r.a.createElement($,null)))}},450:function(e,t,n){"use strict";var a=n(9),r=n(0),i=n.n(r),o=n(423),l=n.n(o),s=n(436),c=(n(139),n(140)),u=n.n(c);t.a=function(e){return function(t){var n,r=t.id,o=Object(a.a)(t,["id"]),c=Object(s.a)().siteConfig,d=(c=void 0===c?{}:c).themeConfig,p=(d=void 0===d?{}:d).navbar,m=(p=void 0===p?{}:p).hideOnScroll,f=void 0!==m&&m;return r?i.a.createElement(e,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:l()("anchor",(n={},n[u.a.enhancedAnchor]=!f,n)),id:r}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),o.children):i.a.createElement(e,o)}}},454:function(e,t,n){"use strict";var a=n(0),r=Object(a.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},465:function(e,t,n){var a=n(30),r=n(54),i=n(27),o=n(26),l=n(466);e.exports=function(e,t){var n=1==e,s=2==e,c=3==e,u=4==e,d=6==e,p=5==e||d,m=t||l;return function(t,l,f){for(var b,g,h=i(t),y=r(h),v=a(l,f,3),k=o(y.length),w=0,E=n?m(t,k):s?m(t,0):void 0;k>w;w++)if((p||w in y)&&(g=v(b=y[w],w,h),e))if(n)E[w]=g;else if(g)switch(e){case 3:return!0;case 5:return b;case 6:return w;case 2:E.push(b)}else if(u)return!1;return d?-1:c||u?u:E}}},466:function(e,t,n){var a=n(467);e.exports=function(e,t){return new(a(e))(t)}},467:function(e,t,n){var a=n(13),r=n(468),i=n(2)("species");e.exports=function(e){var t;return r(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!r(t.prototype)||(t=void 0),a(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(e,t,n){var a=n(23);e.exports=Array.isArray||function(e){return"Array"==a(e)}},487:function(e,t,n){"use strict";(function(e){var a=n(1),r=(n(448),n(449),n(78),n(77),n(530),n(0)),i=n.n(r),o=n(531),l=n.n(o),s=n(563),c=n(53),u=n(423),d=n.n(u),p=n(543),m=n.n(p),f=n(532),b=n.n(f),g=n(436),h=n(441),y=n(148),v=n.n(y);(void 0!==e?e:window).Prism=c.a,n(533),n(534),n(535),n(536),n(90),n(537),n(538),n(539),n(540),n(541),n(542);var k=/{([\d,-]+)}/,w=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,o=e.metastring,c=Object(g.a)().siteConfig.themeConfig.prism,u=void 0===c?{}:c,p=Object(r.useState)(!1),f=p[0],y=p[1],E=Object(r.useState)(!1),_=E[0],x=E[1];Object(r.useEffect)((function(){x(!0)}),[]);var O=Object(r.useRef)(null),j=Object(r.useRef)(null),S=[],N="",T=Object(h.a)().isDarkTheme,C=u.theme||m.a,P=u.darkTheme||C,A=T?P:C;if(o&&k.test(o)){var z=o.match(k)[1];S=b.a.parse(z).filter((function(e){return e>0}))}o&&w.test(o)&&(N=o.match(w)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return j.current&&(e=new l.a(j.current,{target:function(){return O.current}})),function(){e&&e.destroy()}}),[j.current,O.current]);var L=n&&n.replace(/language-/,"");!L&&u.defaultLanguage&&(L=u.defaultLanguage);var I=function(){window.getSelection().empty(),y(!0),setTimeout((function(){return y(!1)}),2e3)};return i.a.createElement(s.a,Object(a.a)({},s.b,{key:_,theme:A,code:t.trim(),language:L}),(function(e){var t,n,r=e.className,o=e.style,l=e.tokens,s=e.getLineProps,c=e.getTokenProps;return i.a.createElement(i.a.Fragment,null,N&&i.a.createElement("div",{style:o,className:v.a.codeBlockTitle},N),i.a.createElement("div",{className:v.a.codeBlockContent},i.a.createElement("button",{ref:j,type:"button","aria-label":"Copy code to clipboard",className:d()(v.a.copyButton,(t={},t[v.a.copyButtonWithTitle]=N,t)),onClick:I},f?"Copied":"Copy"),i.a.createElement("pre",{className:d()(r,v.a.codeBlock,(n={},n[v.a.codeBlockWithTitle]=N,n))},i.a.createElement("div",{ref:O,className:v.a.codeBlockLines,style:o},l.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=s({line:e,key:t});return S.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),i.a.createElement("div",Object(a.a)({key:t},n),e.map((function(e,t){return i.a.createElement("span",Object(a.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},529:function(e,t,n){"use strict";var a=n(1),r=n(0),i=n.n(r),o=n(430),l=n(487),s=n(450),c=n(149),u=n.n(c);t.a={code:function(e){var t=e.children;return"string"==typeof t?i.a.createElement(l.a,e):t},a:function(e){return/\.[^./]+$/.test(e.href)?i.a.createElement("a",e):i.a.createElement(o.a,e)},pre:function(e){return i.a.createElement("div",Object(a.a)({className:u.a.mdxCodeBlock},e))},h1:Object(s.a)("h1"),h2:Object(s.a)("h2"),h3:Object(s.a)("h3"),h4:Object(s.a)("h4"),h5:Object(s.a)("h5"),h6:Object(s.a)("h6")}},530:function(e,t,n){"use strict";var a=n(8),r=n(26),i=n(60),o=n(55);n(56)("match",1,(function(e,t,n,l){return[function(n){var a=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,a):new RegExp(n)[t](String(a))},function(e){var t=l(n,e,this);if(t.done)return t.value;var s=a(e),c=String(this);if(!s.global)return o(s,c);var u=s.unicode;s.lastIndex=0;for(var d,p=[],m=0;null!==(d=o(s,c));){var f=String(d[0]);p[m]=f,""===f&&(s.lastIndex=i(c,r(s.lastIndex),u)),m++}return 0===m?null:p}]}))},531:function(e,t,n){var a;a=function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var a=window.getSelection(),r=document.createRange();r.selectNodeContents(e),a.removeAllRanges(),a.addRange(r),t=a.toString()}return t}},function(e,t){function n(){}n.prototype={on:function(e,t,n){var a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var a=this;function r(){a.off(e,r),t.apply(n,arguments)}return r._=t,this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),a=0,r=n.length;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),s=n(1),c=n.n(s),u=n(2),d=n.n(u),p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},m=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=d()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return b("action",e)}},{key:"defaultTarget",value:function(e){var t=b("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return b("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function b(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=f}]).default},e.exports=a()},532:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],a=t[2],r=t[3];if(n&&r){var i=[],o=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=a&&".."!=a&&"\u2025"!=a||(r+=o);for(var l=n;l!=r;l+=o)i.push(l);return i}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},533:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,a=e.languages,r={"application/javascript":a.javascript,"application/json":a.json||a.javascript,"application/xml":a.xml,"text/xml":a.xml,"text/html":a.html,"text/css":a.css,"text/plain":a.plain},i={"application/json":!0,"application/xml":!0};function o(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var l in r)if(r[l]){n=n||{};var s=i[l]?o(l):l;n[l.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+s+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[l]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},534:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},535:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},536:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},537:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},538:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},539:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},540:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},541:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,i=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:i};var o={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},l=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:o}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:o}}];e.languages.insertBefore("php","variable",{string:l,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:l,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:r,punctuation:i}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},542:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,a="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),i=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return a}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return a})).replace(/<>/g,(function(){return"(?:"+r+"|"+i+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(i),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},543:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},563:function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));var a=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},i=n(0),o={Prism:a.a,theme:r};function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return(s=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},p=function(e,t){var n=e.plain,a=Object.create(null),r=e.styles.reduce((function(e,n){var a=n.languages,r=n.style;return a&&!a.includes(t)||n.types.forEach((function(t){var n=s({},e[t],r);e[t]=n})),e}),a);return r.root=n,r.plain=s({},n,{backgroundColor:null}),r};function m(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&-1===t.indexOf(a)&&(n[a]=e[a]);return n}var f=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),l(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?p(e.theme,e.language):void 0;return t.themeDict=n})),l(this,"getLineProps",(function(e){var n=e.key,a=e.className,r=e.style,i=s({},m(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),o=t.getThemeDict(t.props);return void 0!==o&&(i.style=o.plain),void 0!==r&&(i.style=void 0!==i.style?s({},i.style,r):r),void 0!==n&&(i.key=n),a&&(i.className+=" "+a),i})),l(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,r=n.length,i=t.getThemeDict(t.props);if(void 0!==i){if(1===r&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===r&&!a)return i[n[0]];var o=a?{display:"inline-block"}:{},l=n.map((function(e){return i[e]}));return Object.assign.apply(Object,[o].concat(l))}})),l(this,"getTokenProps",(function(e){var n=e.key,a=e.className,r=e.style,i=e.token,o=s({},m(e,["key","className","style","token"]),{className:"token "+i.types.join(" "),children:i.content,style:t.getStyleForToken(i),key:void 0});return void 0!==r&&(o.style=void 0!==o.style?s({},o.style,r):r),void 0!==n&&(o.key=n),a&&(o.className+=" "+a),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,a=e.code,r=e.children,i=this.getThemeDict(this.props),o=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],a=[0],r=[e.length],i=0,o=0,l=[],s=[l];o>-1;){for(;(i=a[o]++)0?m:["plain"],p=f):(m=d(m,f.type),f.alias&&(m=d(m,f.alias)),p=f.content),"string"==typeof p){var b=p.split(c),g=b.length;l.push({types:m,content:b[0]});for(var h=1;h/":G?V="/guides/integrate/sources/"+G.name+"//":H&&(V="/guides/integrate/sinks//");var K=H?"/guides/integrate/sources//"+H.name+"/":"/guides/integrate/sources//",Z=Object(u.useState)(!1),J=Z[0],Y=Z[1],Q=Object(u.useState)(!1),X=Q[0],ee=Q[1];return Object(O.a)("contents__link","contents__link--active",100),r.a.createElement(l.a,{title:v,description:v+", in minutes, for free"},J&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return Y(!1)},overlayClassName:"modal-overlay",isOpen:null!==J,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you receive your data from?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[G&&G.name,"docker","qovery"],eventTypes:H&&H.event_types,pathTemplate:K,titles:!1,sources:!0,transforms:!1,sinks:!1})),X&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return ee(!1)},overlayClassName:"modal-overlay",isOpen:null!==X,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you want to send your data?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[H&&H.name,"qovery"],eventTypes:G&&G.event_types,pathTemplate:V,titles:!1,sources:!1,transforms:!1,sinks:!0})),r.a.createElement("header",{className:"hero domain-bg domain-bg--"+M},r.a.createElement("div",{className:"container"},(z||G||H)&&r.a.createElement("div",{className:"component-icons"},z&&r.a.createElement("div",{className:"icon panel"},z.logo_path?r.a.createElement(g.a,{src:z.logo_path,alt:z.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Change your source",onClick:function(e){return Y(!0)}},G.logo_path?r.a.createElement(g.a,{src:G.logo_path,alt:G.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),!G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Select a source",onClick:function(e){return Y(!0)}},r.a.createElement("i",{className:"feather icon-plus"})),H&&r.a.createElement("div",{className:"icon panel link",title:"Change your destination",onClick:function(e){return ee(!0)}},H.logo_path?r.a.createElement(g.a,{src:H.logo_path,alt:H.title+" Logo"}):r.a.createElement("i",{className:"feather icon-database"})),!H&&r.a.createElement("div",{className:"icon panel link",title:"Select a destination",onClick:function(e){return ee(!0)}},r.a.createElement("i",{className:"feather icon-plus"}))),!z&&!G&&!H&&r.a.createElement("div",{className:"hero--category"},r.a.createElement(f.a,{to:E[0].permalink+"/"},E[0].name)),r.a.createElement("h1",{className:C.a.header},v),r.a.createElement("div",{className:"hero--subtitle"},n.description),r.a.createElement(y.a,{colorProfile:"guides",tags:D}))),r.a.createElement("main",{className:d()("container","container--l",C.a.container)},r.a.createElement("aside",{className:C.a.sidebar},r.a.createElement("section",{className:C.a.avatar},r.a.createElement(i,{bio:!0,github:c,size:"lg",rel:"author",subTitle:!1,vertical:!0})),r.a.createElement("section",{className:d()("table-of-contents",C.a.tableOfContents)},r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Stats"),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-book"})," ",w),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-clock"})," Updated ",r.a.createElement("time",{pubdate:"pubdate",dateTime:s},k()(R,"mmm dS, yyyy")))),t.rightToc.length>0&&r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Contents"),r.a.createElement(I,{headings:t.rightToc})))),r.a.createElement("div",{className:C.a.article},r.a.createElement("article",null,r.a.createElement("div",{className:"markdown"},r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"anchor",id:"overview"}),r.a.createElement(h.a,{components:m.a},r.a.createElement(t,null)))),!n.hide_pagination&&r.a.createElement(b.a,{previous:a.prevItem,next:a.nextItem,className:C.a.paginator}))))}},424:function(e,t,n){"use strict";n(426);var u=n(0),r=n.n(u),a=n(423),d=n.n(a);n(132);t.a=function(e){var t=e.children,n=e.classNames,u=e.fill,a=e.icon,o=e.type,i=null;switch(o){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:d()(n,"alert","alert--"+o,{"alert--fill":u,"alert--icon":!1!==a}),role:"alert"},!1!==a&&r.a.createElement("i",{className:d()("feather","icon-"+(a||i))}),t)}},428:function(e,t,n){var u=n(28).f,r=Function.prototype,a=/^\s*function ([^ (]*)/;"name"in r||n(10)&&u(r,"name",{configurable:!0,get:function(){try{return(""+this).match(a)[1]}catch(e){return""}}})},431:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);n(133);t.a=function(e){var t=e.children,n=e.className,u=e.badge,d=e.leftIcon,i=e.rightIcon,c=e.size,l=e.target,f=e.to,s=o()("jump-to","jump-to--"+c,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},d&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+d})),r.a.createElement("div",{className:"jump-to--main"},u?r.a.createElement("span",{className:"badge badge--primary badge--right"},u):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return l?r.a.createElement("a",{href:f,target:l,className:s},p):r.a.createElement(a.a,{to:f,className:s},p)}},437:function(e,t,n){"use strict";var u=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),a=n.n(r),d=n(449),o=n(423),i=n.n(o),c=n(433),l=n.n(c),f=n(448),s=37,p=39;function m(e){var t=e.block,n=e.centered,u=e.changeSelectedValue,r=e.className,d=e.handleKeydown,o=e.style,c=e.values,l=e.selectedValue,f=e.tabRefs;return a.a.createElement("div",{className:n?"tabs--centered":null},a.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,n=e.label;return a.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":l===t,className:i()("tab-item",{"tab-item--active":l===t}),key:t,ref:function(e){return f.push(e)},onKeyDown:function(e){return d(f,e.target,e)},onFocus:function(){return u(t)},onClick:function(){return u(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,u=e.changeSelectedValue,r=e.size,o=e.values,i=o;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return a.a.createElement(d.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:o.find((function(e){return e.value==n})),onChange:function(e){return u(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,d=e.groupId,o=e.label,i=e.placeholder,c=e.select,b=e.size,v=(e.style,e.values),g=e.urlKey,y=Object(f.a)(),_=y.tabGroupChoices,E=y.setTabGroupChoices,w=Object(r.useState)(n),D=w[0],k=w[1];if(null!=d){var x=_[d];null!=x&&x!==D&&k(x)}var S=function(e){k(e),null!=d&&E(d,e)},C=[],O=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case s:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=l.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:"margin-bottom--"+(b||"md")},o&&a.a.createElement("div",{className:"margin-vert--sm"},o),v.length>1&&(c?a.a.createElement(h,Object(u.a)({changeSelectedValue:S,handleKeydown:O,placeholder:i,selectedValue:D,size:b,tabRefs:C},e)):a.a.createElement(m,Object(u.a)({changeSelectedValue:S,handleKeydown:O,selectedValue:D,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===D}))[0])}},441:function(e,t,n){"use strict";var u=n(0),r=n(485);t.a=function(){return Object(u.useContext)(r.a)}},444:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}},445:function(e,t,n){"use strict";n(457);var u=n(0),r=n.n(u),a=n(458),d=n(443),o=n(1),i=(n(446),n(447),n(459),n(430)),c=n(460),l=n(440),f=n.n(l),s=n(461),p=n.n(s),m=n(436),h=n(423),b=n.n(h),v=n(135),g=n.n(v),y=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.moon)})},_=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.sun)})},E=function(e){var t=Object(m.a)().isClient;return r.a.createElement(p.a,Object(o.a)({disabled:!t,icons:{checked:r.a.createElement(y,null),unchecked:r.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),u=new Date,r=Math.abs(u-n),a=Math.ceil(r/864e5),d=null;return"undefined"!=typeof window&&(d=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),a<30&&(!d||d0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(f.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(M,e))}))):null)}))),(l||d)&&r.a.createElement("div",{className:"text--center"},l&&l.src&&r.a.createElement("div",{className:"margin-bottom--sm"},l.href?r.a.createElement("a",{href:l.href,target:"_blank",rel:"noopener noreferrer",className:P.a.footerLogoLink},r.a.createElement(R,{alt:l.alt,url:s})):r.a.createElement(R,{alt:l.alt,url:s})),r.a.createElement("small",null,d),r.a.createElement("br",null))))},B=n(462),z=n(463),U=n(3);n(138);t.a=function(e){var t=Object(m.a)().siteConfig,n=void 0===t?{}:t,u=n.favicon,o=(n.tagline,n.title),i=n.themeConfig.image,c=n.url,l=e.children,f=e.title,s=e.noFooter,p=e.description,h=e.image,b=e.keywords,v=(e.permalink,e.version),g=f?f+" | "+o:o,y=h||i,_=c+Object(k.a)(y),E=Object(k.a)(u),w=Object(U.h)(),D=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(B.a,null,r.a.createElement(d.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&r.a.createElement("title",null,g),g&&r.a.createElement("meta",{property:"og:title",content:g}),u&&r.a.createElement("link",{rel:"shortcut icon",href:E}),p&&r.a.createElement("meta",{name:"description",content:p}),p&&r.a.createElement("meta",{property:"og:description",content:p}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),b&&b.length&&r.a.createElement("meta",{name:"keywords",content:b.join(",")}),y&&r.a.createElement("meta",{property:"og:image",content:_}),y&&r.a.createElement("meta",{property:"twitter:image",content:_}),y&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),D&&r.a.createElement("meta",{property:"og:url",content:D}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),D&&r.a.createElement("link",{rel:"canonical",href:D})),r.a.createElement(a.a,null),r.a.createElement(N,null),r.a.createElement("div",{className:"main-wrapper"},l),!s&&r.a.createElement(L,null)))}},450:function(e,t,n){"use strict";var u=n(9),r=n(0),a=n.n(r),d=n(423),o=n.n(d),i=n(436),c=(n(139),n(140)),l=n.n(c);t.a=function(e){return function(t){var n,r=t.id,d=Object(u.a)(t,["id"]),c=Object(i.a)().siteConfig,f=(c=void 0===c?{}:c).themeConfig,s=(f=void 0===f?{}:f).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return r?a.a.createElement(e,d,a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(n={},n[l.a.enhancedAnchor]=!m,n)),id:r}),a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),d.children):a.a.createElement(e,d)}}},451:function(e,t,n){(function(e,u){var r;(function(){var a="Expected a function",d="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],i="[object Arguments]",c="[object Array]",l="[object Boolean]",f="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",g="[object RegExp]",y="[object Set]",_="[object String]",E="[object Symbol]",w="[object WeakMap]",D="[object ArrayBuffer]",k="[object DataView]",x="[object Float32Array]",S="[object Float64Array]",C="[object Int8Array]",O="[object Int16Array]",I="[object Int32Array]",A="[object Uint8Array]",j="[object Uint16Array]",N="[object Uint32Array]",F=/\b__p \+= '';/g,T=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,M=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,L=RegExp(M.source),B=RegExp(R.source),z=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,V=RegExp(G.source),K=/^\s+|\s+$/g,Z=/^\s+/,J=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ue=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,ae=/^0b[01]+$/i,de=/^\[object .+?Constructor\]$/,oe=/^0o[0-7]+$/i,ie=/^(?:0|[1-9]\d*)$/,ce=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,le=/($^)/,fe=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",be="["+se+"]",ve="\\d+",ge="[\\u2700-\\u27bf]",ye="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",Ee="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",De="(?:\\ud83c[\\udde6-\\uddff]){2}",ke="[\\ud800-\\udbff][\\udc00-\\udfff]",xe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Se="(?:"+ye+"|"+_e+")",Ce="(?:"+xe+"|"+_e+")",Oe="(?:"+be+"|"+Ee+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,De,ke].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ae="(?:"+[ge,De,ke].join("|")+")"+Ie,je="(?:"+[we+be+"?",be,De,ke,me].join("|")+")",Ne=RegExp("['\u2019]","g"),Fe=RegExp(be,"g"),Te=RegExp(Ee+"(?="+Ee+")|"+je+Ie,"g"),Pe=RegExp([xe+"?"+ye+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,xe,"$"].join("|")+")",Ce+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,xe+Se,"$"].join("|")+")",xe+"?"+Se+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",xe+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Ae].join("|"),"g"),Me=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Re=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Le=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Be=-1,ze={};ze[x]=ze[S]=ze[C]=ze[O]=ze[I]=ze[A]=ze["[object Uint8ClampedArray]"]=ze[j]=ze[N]=!0,ze[i]=ze[c]=ze[D]=ze[l]=ze[k]=ze[f]=ze[s]=ze[p]=ze[h]=ze[b]=ze[v]=ze[g]=ze[y]=ze[_]=ze[w]=!1;var Ue={};Ue[i]=Ue[c]=Ue[D]=Ue[k]=Ue[l]=Ue[f]=Ue[x]=Ue[S]=Ue[C]=Ue[O]=Ue[I]=Ue[h]=Ue[b]=Ue[v]=Ue[g]=Ue[y]=Ue[_]=Ue[E]=Ue[A]=Ue["[object Uint8ClampedArray]"]=Ue[j]=Ue[N]=!0,Ue[s]=Ue[p]=Ue[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,$e=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,Ge="object"==typeof self&&self&&self.Object===Object&&self,Ve=qe||Ge||Function("return this")(),Ke=t&&!t.nodeType&&t,Ze=Ke&&"object"==typeof u&&u&&!u.nodeType&&u,Je=Ze&&Ze.exports===Ke,Ye=Je&&qe.process,Qe=function(){try{var e=Ze&&Ze.require&&Ze.require("util").types;return e||Ye&&Ye.binding&&Ye.binding("util")}catch(t){}}(),Xe=Qe&&Qe.isArrayBuffer,et=Qe&&Qe.isDate,tt=Qe&&Qe.isMap,nt=Qe&&Qe.isRegExp,ut=Qe&&Qe.isSet,rt=Qe&&Qe.isTypedArray;function at(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function dt(e,t,n,u){for(var r=-1,a=null==e?0:e.length;++r-1}function st(e,t,n){for(var u=-1,r=null==e?0:e.length;++u-1;);return n}function Tt(e,t){for(var n=e.length;n--&&Et(t,e[n],0)>-1;);return n}function Pt(e,t){for(var n=e.length,u=0;n--;)e[n]===t&&++u;return u}var Mt=St({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Rt=St({"&":"&","<":"<",">":">",'"':""","'":"'"});function Lt(e){return"\\"+We[e]}function Bt(e){return Me.test(e)}function zt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,u){n[++t]=[u,e]})),n}function Ut(e,t){return function(n){return e(t(n))}}function Wt(e,t){for(var n=-1,u=e.length,r=0,a=[];++n",""":'"',"'":"'"});var Kt=function e(t){var n,u=(t=null==t?Ve:Kt.defaults(Ve.Object(),t,Kt.pick(Ve,Le))).Array,r=t.Date,se=t.Error,pe=t.Function,me=t.Math,he=t.Object,be=t.RegExp,ve=t.String,ge=t.TypeError,ye=u.prototype,_e=pe.prototype,Ee=he.prototype,we=t["__core-js_shared__"],De=_e.toString,ke=Ee.hasOwnProperty,xe=0,Se=(n=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ce=Ee.toString,Oe=De.call(he),Ie=Ve._,Ae=be("^"+De.call(ke).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),je=Je?t.Buffer:void 0,Te=t.Symbol,Me=t.Uint8Array,We=je?je.allocUnsafe:void 0,qe=Ut(he.getPrototypeOf,he),Ge=he.create,Ke=Ee.propertyIsEnumerable,Ze=ye.splice,Ye=Te?Te.isConcatSpreadable:void 0,Qe=Te?Te.iterator:void 0,gt=Te?Te.toStringTag:void 0,St=function(){try{var e=Xr(he,"defineProperty");return e({},"",{}),e}catch(t){}}(),Zt=t.clearTimeout!==Ve.clearTimeout&&t.clearTimeout,Jt=r&&r.now!==Ve.Date.now&&r.now,Yt=t.setTimeout!==Ve.setTimeout&&t.setTimeout,Qt=me.ceil,Xt=me.floor,en=he.getOwnPropertySymbols,tn=je?je.isBuffer:void 0,nn=t.isFinite,un=ye.join,rn=Ut(he.keys,he),an=me.max,dn=me.min,on=r.now,cn=t.parseInt,ln=me.random,fn=ye.reverse,sn=Xr(t,"DataView"),pn=Xr(t,"Map"),mn=Xr(t,"Promise"),hn=Xr(t,"Set"),bn=Xr(t,"WeakMap"),vn=Xr(he,"create"),gn=bn&&new bn,yn={},_n=Sa(sn),En=Sa(pn),wn=Sa(mn),Dn=Sa(hn),kn=Sa(bn),xn=Te?Te.prototype:void 0,Sn=xn?xn.valueOf:void 0,Cn=xn?xn.toString:void 0;function On(e){if(Hd(e)&&!Nd(e)&&!(e instanceof Nn)){if(e instanceof jn)return e;if(ke.call(e,"__wrapped__"))return Ca(e)}return new jn(e)}var In=function(){function e(){}return function(t){if(!Wd(t))return{};if(Ge)return Ge(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function An(){}function jn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Nn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Fn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Jn(e,t,n,u,r,a){var d,o=1&t,c=2&t,s=4&t;if(n&&(d=r?n(e,u,r,a):n(e)),void 0!==d)return d;if(!Wd(e))return e;var w=Nd(e);if(w){if(d=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&ke.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!o)return vr(e,d)}else{var F=na(e),T=F==p||F==m;if(Md(e))return fr(e,o);if(F==v||F==i||T&&!r){if(d=c||T?{}:ra(e),!o)return c?function(e,t){return gr(e,ta(e),t)}(e,function(e,t){return e&&gr(t,Eo(t),e)}(d,e)):function(e,t){return gr(e,ea(e),t)}(e,Gn(d,e))}else{if(!Ue[F])return r?e:{};d=function(e,t,n){var u=e.constructor;switch(t){case D:return sr(e);case l:case f:return new u(+e);case k:return function(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case x:case S:case C:case O:case I:case A:case"[object Uint8ClampedArray]":case j:case N:return pr(e,n);case h:return new u;case b:case _:return new u(e);case g:return function(e){var t=new e.constructor(e.source,ue.exec(e));return t.lastIndex=e.lastIndex,t}(e);case y:return new u;case E:return r=e,Sn?he(Sn.call(r)):{}}var r}(e,F,o)}}a||(a=new Rn);var P=a.get(e);if(P)return P;a.set(e,d),Kd(e)?e.forEach((function(u){d.add(Jn(u,t,n,u,e,a))})):$d(e)&&e.forEach((function(u,r){d.set(r,Jn(u,t,n,r,e,a))}));var M=w?void 0:(s?c?Gr:qr:c?Eo:_o)(e);return ot(M||e,(function(u,r){M&&(u=e[r=u]),Hn(d,r,Jn(u,t,n,r,e,a))})),d}function Yn(e,t,n){var u=n.length;if(null==e)return!u;for(e=he(e);u--;){var r=n[u],a=t[r],d=e[r];if(void 0===d&&!(r in e)||!a(d))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ge(a);return ya((function(){e.apply(void 0,n)}),t)}function Xn(e,t,n,u){var r=-1,a=ft,d=!0,o=e.length,i=[],c=t.length;if(!o)return i;n&&(t=pt(t,At(n))),u?(a=st,d=!1):t.length>=200&&(a=Nt,d=!1,t=new Mn(t));e:for(;++r-1},Tn.prototype.set=function(e,t){var n=this.__data__,u=$n(n,e);return u<0?(++this.size,n.push([e,t])):n[u][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Fn,map:new(pn||Tn),string:new Fn}},Pn.prototype.delete=function(e){var t=Yr(this,e).delete(e);return this.size-=t?1:0,t},Pn.prototype.get=function(e){return Yr(this,e).get(e)},Pn.prototype.has=function(e){return Yr(this,e).has(e)},Pn.prototype.set=function(e,t){var n=Yr(this,e),u=n.size;return n.set(e,t),this.size+=n.size==u?0:1,this},Mn.prototype.add=Mn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Mn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Rn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Rn.prototype.get=function(e){return this.__data__.get(e)},Rn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Tn){var u=n.__data__;if(!pn||u.length<199)return u.push([e,t]),this.size=++n.size,this;n=this.__data__=new Pn(u)}return n.set(e,t),this.size=n.size,this};var eu=Er(iu),tu=Er(cu,!0);function nu(e,t){var n=!0;return eu(e,(function(e,u,r){return n=!!t(e,u,r)})),n}function uu(e,t,n){for(var u=-1,r=e.length;++u0&&n(o)?t>1?au(o,t-1,n,u,r):mt(r,o):u||(r[r.length]=o)}return r}var du=wr(),ou=wr(!0);function iu(e,t){return e&&du(e,t,_o)}function cu(e,t){return e&&ou(e,t,_o)}function lu(e,t){return lt(t,(function(t){return Bd(e[t])}))}function fu(e,t){for(var n=0,u=(t=or(t,e)).length;null!=e&&nt}function hu(e,t){return null!=e&&ke.call(e,t)}function bu(e,t){return null!=e&&t in he(e)}function vu(e,t,n){for(var r=n?st:ft,a=e[0].length,d=e.length,o=d,i=u(d),c=1/0,l=[];o--;){var f=e[o];o&&t&&(f=pt(f,At(t))),c=dn(f.length,c),i[o]=!n&&(t||a>=120&&f.length>=120)?new Mn(o&&f):void 0}f=e[0];var s=-1,p=i[0];e:for(;++s=o)return i;var c=n[u];return i*("desc"==c?-1:1)}}return e.index-t.index}(e,t,n)}))}function Fu(e,t,n){for(var u=-1,r=t.length,a={};++u-1;)o!==e&&Ze.call(o,i,1),Ze.call(e,i,1);return e}function Pu(e,t){for(var n=e?t.length:0,u=n-1;n--;){var r=t[n];if(n==u||r!==a){var a=r;da(r)?Ze.call(e,r,1):Xu(e,r)}}return e}function Mu(e,t){return e+Xt(ln()*(t-e+1))}function Ru(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=Xt(t/2))&&(e+=e)}while(t);return n}function Lu(e,t){return _a(ma(e,t,Go),e+"")}function Bu(e){return Bn(Io(e))}function zu(e,t){var n=Io(e);return Da(n,Zn(t,0,n.length))}function Uu(e,t,n,u){if(!Wd(e))return e;for(var r=-1,a=(t=or(t,e)).length,d=a-1,o=e;null!=o&&++ra?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var d=u(a);++r>>1,d=e[a];null!==d&&!Jd(d)&&(n?d<=t:d=200){var c=t?null:Rr(e);if(c)return Ht(c);d=!1,r=Nt,i=new Mn}else i=t?[]:o;e:for(;++u=u?e:qu(e,t,n)}var lr=Zt||function(e){return Ve.clearTimeout(e)};function fr(e,t){if(t)return e.slice();var n=e.length,u=We?We(n):new e.constructor(n);return e.copy(u),u}function sr(e){var t=new e.constructor(e.byteLength);return new Me(t).set(new Me(e)),t}function pr(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function mr(e,t){if(e!==t){var n=void 0!==e,u=null===e,r=e==e,a=Jd(e),d=void 0!==t,o=null===t,i=t==t,c=Jd(t);if(!o&&!c&&!a&&e>t||a&&d&&i&&!o&&!c||u&&d&&i||!n&&i||!r)return 1;if(!u&&!a&&!c&&e1?n[r-1]:void 0,d=r>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(r--,a):void 0,d&&oa(n[0],n[1],d)&&(a=r<3?void 0:a,r=1),t=he(t);++u-1?r[a?t[d]:d]:void 0}}function Cr(e){return $r((function(t){var n=t.length,u=n,r=jn.prototype.thru;for(e&&t.reverse();u--;){var d=t[u];if("function"!=typeof d)throw new ge(a);if(r&&!o&&"wrapper"==Kr(d))var o=new jn([],!0)}for(u=o?u:n;++u1&&y.reverse(),f&&co))return!1;var c=a.get(e);if(c&&a.get(t))return c==t;var l=-1,f=!0,s=2&n?new Mn:void 0;for(a.set(e,t),a.set(t,e);++l-1&&e%1==0&&e1?"& ":"")+t[u],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(u,function(e,t){return ot(o,(function(n){var u="_."+n[0];t&n[1]&&!ft(e,u)&&e.push(u)})),e.sort()}(function(e){var t=e.match(Q);return t?t[1].split(X):[]}(u),n)))}function wa(e){var t=0,n=0;return function(){var u=on(),r=16-(u-n);if(n=u,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Da(e,t){var n=-1,u=e.length,r=u-1;for(t=void 0===t?u:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Va(e,n)}));function ed(e){var t=On(e);return t.__chain__=!0,t}function td(e,t){return t(e)}var nd=$r((function(e){var t=e.length,n=t?e[0]:0,u=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&u instanceof Nn&&da(n)?((u=u.slice(n,+n+(t?1:0))).__actions__.push({func:td,args:[r],thisArg:void 0}),new jn(u,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ud=yr((function(e,t,n){ke.call(e,n)?++e[n]:Vn(e,n,1)}));var rd=Sr(ja),ad=Sr(Na);function dd(e,t){return(Nd(e)?ot:eu)(e,Jr(t,3))}function od(e,t){return(Nd(e)?it:tu)(e,Jr(t,3))}var id=yr((function(e,t,n){ke.call(e,n)?e[n].push(t):Vn(e,n,[t])}));var cd=Lu((function(e,t,n){var r=-1,a="function"==typeof t,d=Td(e)?u(e.length):[];return eu(e,(function(e){d[++r]=a?at(t,e,n):gu(e,t,n)})),d})),ld=yr((function(e,t,n){Vn(e,n,t)}));function fd(e,t){return(Nd(e)?pt:Cu)(e,Jr(t,3))}var sd=yr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var pd=Lu((function(e,t){if(null==e)return[];var n=t.length;return n>1&&oa(e,t[0],t[1])?t=[]:n>2&&oa(t[0],t[1],t[2])&&(t=[t[0]]),Nu(e,au(t,1),[])})),md=Jt||function(){return Ve.Date.now()};function hd(e,t,n){return t=n?void 0:t,Br(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function bd(e,t){var n;if("function"!=typeof t)throw new ge(a);return e=no(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var vd=Lu((function(e,t,n){var u=1;if(n.length){var r=Wt(n,Zr(vd));u|=32}return Br(e,u,t,n,r)})),gd=Lu((function(e,t,n){var u=3;if(n.length){var r=Wt(n,Zr(gd));u|=32}return Br(t,u,e,n,r)}));function yd(e,t,n){var u,r,d,o,i,c,l=0,f=!1,s=!1,p=!0;if("function"!=typeof e)throw new ge(a);function m(t){var n=u,a=r;return u=r=void 0,l=t,o=e.apply(a,n)}function h(e){return l=e,i=ya(v,t),f?m(e):o}function b(e){var n=e-c;return void 0===c||n>=t||n<0||s&&e-l>=d}function v(){var e=md();if(b(e))return g(e);i=ya(v,function(e){var n=t-(e-c);return s?dn(n,d-(e-l)):n}(e))}function g(e){return i=void 0,p&&u?m(e):(u=r=void 0,o)}function y(){var e=md(),n=b(e);if(u=arguments,r=this,c=e,n){if(void 0===i)return h(c);if(s)return lr(i),i=ya(v,t),m(c)}return void 0===i&&(i=ya(v,t)),o}return t=ro(t)||0,Wd(n)&&(f=!!n.leading,d=(s="maxWait"in n)?an(ro(n.maxWait)||0,t):d,p="trailing"in n?!!n.trailing:p),y.cancel=function(){void 0!==i&&lr(i),l=0,u=c=r=i=void 0},y.flush=function(){return void 0===i?o:g(md())},y}var _d=Lu((function(e,t){return Qn(e,1,t)})),Ed=Lu((function(e,t,n){return Qn(e,ro(t)||0,n)}));function wd(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ge(a);var n=function(){var u=arguments,r=t?t.apply(this,u):u[0],a=n.cache;if(a.has(r))return a.get(r);var d=e.apply(this,u);return n.cache=a.set(r,d)||a,d};return n.cache=new(wd.Cache||Pn),n}function Dd(e){if("function"!=typeof e)throw new ge(a);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}wd.Cache=Pn;var kd=ir((function(e,t){var n=(t=1==t.length&&Nd(t[0])?pt(t[0],At(Jr())):pt(au(t,1),At(Jr()))).length;return Lu((function(u){for(var r=-1,a=dn(u.length,n);++r=t})),jd=yu(function(){return arguments}())?yu:function(e){return Hd(e)&&ke.call(e,"callee")&&!Ke.call(e,"callee")},Nd=u.isArray,Fd=Xe?At(Xe):function(e){return Hd(e)&&pu(e)==D};function Td(e){return null!=e&&Ud(e.length)&&!Bd(e)}function Pd(e){return Hd(e)&&Td(e)}var Md=tn||ai,Rd=et?At(et):function(e){return Hd(e)&&pu(e)==f};function Ld(e){if(!Hd(e))return!1;var t=pu(e);return t==s||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Gd(e)}function Bd(e){if(!Wd(e))return!1;var t=pu(e);return t==p||t==m||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zd(e){return"number"==typeof e&&e==no(e)}function Ud(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wd(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Hd(e){return null!=e&&"object"==typeof e}var $d=tt?At(tt):function(e){return Hd(e)&&na(e)==h};function qd(e){return"number"==typeof e||Hd(e)&&pu(e)==b}function Gd(e){if(!Hd(e)||pu(e)!=v)return!1;var t=qe(e);if(null===t)return!0;var n=ke.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&De.call(n)==Oe}var Vd=nt?At(nt):function(e){return Hd(e)&&pu(e)==g};var Kd=ut?At(ut):function(e){return Hd(e)&&na(e)==y};function Zd(e){return"string"==typeof e||!Nd(e)&&Hd(e)&&pu(e)==_}function Jd(e){return"symbol"==typeof e||Hd(e)&&pu(e)==E}var Yd=rt?At(rt):function(e){return Hd(e)&&Ud(e.length)&&!!ze[pu(e)]};var Qd=Tr(Su),Xd=Tr((function(e,t){return e<=t}));function eo(e){if(!e)return[];if(Td(e))return Zd(e)?Gt(e):vr(e);if(Qe&&e[Qe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Qe]());var t=na(e);return(t==h?zt:t==y?Ht:Io)(e)}function to(e){return e?(e=ro(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function no(e){var t=to(e),n=t%1;return t==t?n?t-n:t:0}function uo(e){return e?Zn(no(e),0,4294967295):0}function ro(e){if("number"==typeof e)return e;if(Jd(e))return NaN;if(Wd(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Wd(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(K,"");var n=ae.test(e);return n||oe.test(e)?$e(e.slice(2),n?2:8):re.test(e)?NaN:+e}function ao(e){return gr(e,Eo(e))}function oo(e){return null==e?"":Yu(e)}var io=_r((function(e,t){if(fa(t)||Td(t))gr(t,_o(t),e);else for(var n in t)ke.call(t,n)&&Hn(e,n,t[n])})),co=_r((function(e,t){gr(t,Eo(t),e)})),lo=_r((function(e,t,n,u){gr(t,Eo(t),e,u)})),fo=_r((function(e,t,n,u){gr(t,_o(t),e,u)})),so=$r(Kn);var po=Lu((function(e,t){e=he(e);var n=-1,u=t.length,r=u>2?t[2]:void 0;for(r&&oa(t[0],t[1],r)&&(u=1);++n1),t})),gr(e,Gr(e),n),u&&(n=Jn(n,7,Wr));for(var r=t.length;r--;)Xu(n,t[r]);return n}));var xo=$r((function(e,t){return null==e?{}:function(e,t){return Fu(e,t,(function(t,n){return bo(e,n)}))}(e,t)}));function So(e,t){if(null==e)return{};var n=pt(Gr(e),(function(e){return[e]}));return t=Jr(t),Fu(e,n,(function(e,n){return t(e,n[0])}))}var Co=Lr(_o),Oo=Lr(Eo);function Io(e){return null==e?[]:jt(e,_o(e))}var Ao=kr((function(e,t,n){return t=t.toLowerCase(),e+(n?jo(t):t)}));function jo(e){return Bo(oo(e).toLowerCase())}function No(e){return(e=oo(e))&&e.replace(ce,Mt).replace(Fe,"")}var Fo=kr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),To=kr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Po=Dr("toLowerCase");var Mo=kr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Ro=kr((function(e,t,n){return e+(n?" ":"")+Bo(t)}));var Lo=kr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Bo=Dr("toUpperCase");function zo(e,t,n){return e=oo(e),void 0===(t=n?void 0:t)?function(e){return Re.test(e)}(e)?function(e){return e.match(Pe)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(t)||[]}var Uo=Lu((function(e,t){try{return at(e,void 0,t)}catch(n){return Ld(n)?n:new se(n)}})),Wo=$r((function(e,t){return ot(t,(function(t){t=xa(t),Vn(e,t,vd(e[t],e))})),e}));function Ho(e){return function(){return e}}var $o=Cr(),qo=Cr(!0);function Go(e){return e}function Vo(e){return Du("function"==typeof e?e:Jn(e,1))}var Ko=Lu((function(e,t){return function(n){return gu(n,e,t)}})),Zo=Lu((function(e,t){return function(n){return gu(e,n,t)}}));function Jo(e,t,n){var u=_o(t),r=lu(t,u);null!=n||Wd(t)&&(r.length||!u.length)||(n=t,t=e,e=this,r=lu(t,_o(t)));var a=!(Wd(n)&&"chain"in n&&!n.chain),d=Bd(e);return ot(r,(function(n){var u=t[n];e[n]=u,d&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__),r=n.__actions__=vr(this.__actions__);return r.push({func:u,args:arguments,thisArg:e}),n.__chain__=t,n}return u.apply(e,mt([this.value()],arguments))})})),e}function Yo(){}var Qo=jr(pt),Xo=jr(ct),ei=jr(vt);function ti(e){return ia(e)?xt(xa(e)):function(e){return function(t){return fu(t,e)}}(e)}var ni=Fr(),ui=Fr(!0);function ri(){return[]}function ai(){return!1}var di=Ar((function(e,t){return e+t}),0),oi=Mr("ceil"),ii=Ar((function(e,t){return e/t}),1),ci=Mr("floor");var li,fi=Ar((function(e,t){return e*t}),1),si=Mr("round"),pi=Ar((function(e,t){return e-t}),0);return On.after=function(e,t){if("function"!=typeof t)throw new ge(a);return e=no(e),function(){if(--e<1)return t.apply(this,arguments)}},On.ary=hd,On.assign=io,On.assignIn=co,On.assignInWith=lo,On.assignWith=fo,On.at=so,On.before=bd,On.bind=vd,On.bindAll=Wo,On.bindKey=gd,On.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Nd(e)?e:[e]},On.chain=ed,On.chunk=function(e,t,n){t=(n?oa(e,t,n):void 0===t)?1:an(no(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var a=0,d=0,o=u(Qt(r/t));ar?0:r+n),(u=void 0===u||u>r?r:no(u))<0&&(u+=r),u=n>u?0:uo(u);n>>0)?(e=oo(e))&&("string"==typeof t||null!=t&&!Vd(t))&&!(t=Yu(t))&&Bt(e)?cr(Gt(e),0,n):e.split(t,n):[]},On.spread=function(e,t){if("function"!=typeof e)throw new ge(a);return t=null==t?0:an(no(t),0),Lu((function(n){var u=n[t],r=cr(n,0,t);return u&&mt(r,u),at(e,this,r)}))},On.tail=function(e){var t=null==e?0:e.length;return t?qu(e,1,t):[]},On.take=function(e,t,n){return e&&e.length?qu(e,0,(t=n||void 0===t?1:no(t))<0?0:t):[]},On.takeRight=function(e,t,n){var u=null==e?0:e.length;return u?qu(e,(t=u-(t=n||void 0===t?1:no(t)))<0?0:t,u):[]},On.takeRightWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3),!1,!0):[]},On.takeWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3)):[]},On.tap=function(e,t){return t(e),e},On.throttle=function(e,t,n){var u=!0,r=!0;if("function"!=typeof e)throw new ge(a);return Wd(n)&&(u="leading"in n?!!n.leading:u,r="trailing"in n?!!n.trailing:r),yd(e,t,{leading:u,maxWait:t,trailing:r})},On.thru=td,On.toArray=eo,On.toPairs=Co,On.toPairsIn=Oo,On.toPath=function(e){return Nd(e)?pt(e,xa):Jd(e)?[e]:vr(ka(oo(e)))},On.toPlainObject=ao,On.transform=function(e,t,n){var u=Nd(e),r=u||Md(e)||Yd(e);if(t=Jr(t,4),null==n){var a=e&&e.constructor;n=r?u?new a:[]:Wd(e)&&Bd(a)?In(qe(e)):{}}return(r?ot:iu)(e,(function(e,u,r){return t(n,e,u,r)})),n},On.unary=function(e){return hd(e,1)},On.union=Ha,On.unionBy=$a,On.unionWith=qa,On.uniq=function(e){return e&&e.length?Qu(e):[]},On.uniqBy=function(e,t){return e&&e.length?Qu(e,Jr(t,2)):[]},On.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Qu(e,void 0,t):[]},On.unset=function(e,t){return null==e||Xu(e,t)},On.unzip=Ga,On.unzipWith=Va,On.update=function(e,t,n){return null==e?e:er(e,t,dr(n))},On.updateWith=function(e,t,n,u){return u="function"==typeof u?u:void 0,null==e?e:er(e,t,dr(n),u)},On.values=Io,On.valuesIn=function(e){return null==e?[]:jt(e,Eo(e))},On.without=Ka,On.words=zo,On.wrap=function(e,t){return xd(dr(t),e)},On.xor=Za,On.xorBy=Ja,On.xorWith=Ya,On.zip=Qa,On.zipObject=function(e,t){return rr(e||[],t||[],Hn)},On.zipObjectDeep=function(e,t){return rr(e||[],t||[],Uu)},On.zipWith=Xa,On.entries=Co,On.entriesIn=Oo,On.extend=co,On.extendWith=lo,Jo(On,On),On.add=di,On.attempt=Uo,On.camelCase=Ao,On.capitalize=jo,On.ceil=oi,On.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=ro(n))==n?n:0),void 0!==t&&(t=(t=ro(t))==t?t:0),Zn(ro(e),t,n)},On.clone=function(e){return Jn(e,4)},On.cloneDeep=function(e){return Jn(e,5)},On.cloneDeepWith=function(e,t){return Jn(e,5,t="function"==typeof t?t:void 0)},On.cloneWith=function(e,t){return Jn(e,4,t="function"==typeof t?t:void 0)},On.conformsTo=function(e,t){return null==t||Yn(e,t,_o(t))},On.deburr=No,On.defaultTo=function(e,t){return null==e||e!=e?t:e},On.divide=ii,On.endsWith=function(e,t,n){e=oo(e),t=Yu(t);var u=e.length,r=n=void 0===n?u:Zn(no(n),0,u);return(n-=t.length)>=0&&e.slice(n,r)==t},On.eq=Od,On.escape=function(e){return(e=oo(e))&&B.test(e)?e.replace(R,Rt):e},On.escapeRegExp=function(e){return(e=oo(e))&&V.test(e)?e.replace(G,"\\$&"):e},On.every=function(e,t,n){var u=Nd(e)?ct:nu;return n&&oa(e,t,n)&&(t=void 0),u(e,Jr(t,3))},On.find=rd,On.findIndex=ja,On.findKey=function(e,t){return yt(e,Jr(t,3),iu)},On.findLast=ad,On.findLastIndex=Na,On.findLastKey=function(e,t){return yt(e,Jr(t,3),cu)},On.floor=ci,On.forEach=dd,On.forEachRight=od,On.forIn=function(e,t){return null==e?e:du(e,Jr(t,3),Eo)},On.forInRight=function(e,t){return null==e?e:ou(e,Jr(t,3),Eo)},On.forOwn=function(e,t){return e&&iu(e,Jr(t,3))},On.forOwnRight=function(e,t){return e&&cu(e,Jr(t,3))},On.get=ho,On.gt=Id,On.gte=Ad,On.has=function(e,t){return null!=e&&ua(e,t,hu)},On.hasIn=bo,On.head=Ta,On.identity=Go,On.includes=function(e,t,n,u){e=Td(e)?e:Io(e),n=n&&!u?no(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Zd(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&Et(e,t,n)>-1},On.indexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=null==n?0:no(n);return r<0&&(r=an(u+r,0)),Et(e,t,r)},On.inRange=function(e,t,n){return t=to(t),void 0===n?(n=t,t=0):n=to(n),function(e,t,n){return e>=dn(t,n)&&e=-9007199254740991&&e<=9007199254740991},On.isSet=Kd,On.isString=Zd,On.isSymbol=Jd,On.isTypedArray=Yd,On.isUndefined=function(e){return void 0===e},On.isWeakMap=function(e){return Hd(e)&&na(e)==w},On.isWeakSet=function(e){return Hd(e)&&"[object WeakSet]"==pu(e)},On.join=function(e,t){return null==e?"":un.call(e,t)},On.kebabCase=Fo,On.last=La,On.lastIndexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=u;return void 0!==n&&(r=(r=no(n))<0?an(u+r,0):dn(r,u-1)),t==t?function(e,t,n){for(var u=n+1;u--;)if(e[u]===t)return u;return u}(e,t,r):_t(e,Dt,r,!0)},On.lowerCase=To,On.lowerFirst=Po,On.lt=Qd,On.lte=Xd,On.max=function(e){return e&&e.length?uu(e,Go,mu):void 0},On.maxBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),mu):void 0},On.mean=function(e){return kt(e,Go)},On.meanBy=function(e,t){return kt(e,Jr(t,2))},On.min=function(e){return e&&e.length?uu(e,Go,Su):void 0},On.minBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),Su):void 0},On.stubArray=ri,On.stubFalse=ai,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=fi,On.nth=function(e,t){return e&&e.length?ju(e,no(t)):void 0},On.noConflict=function(){return Ve._===this&&(Ve._=Ie),this},On.noop=Yo,On.now=md,On.pad=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;if(!t||u>=t)return e;var r=(t-u)/2;return Nr(Xt(r),n)+e+Nr(Qt(r),n)},On.padEnd=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;return t&&ut){var u=e;e=t,t=u}if(n||e%1||t%1){var r=ln();return dn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Mu(e,t)},On.reduce=function(e,t,n){var u=Nd(e)?ht:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,eu)},On.reduceRight=function(e,t,n){var u=Nd(e)?bt:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,tu)},On.repeat=function(e,t,n){return t=(n?oa(e,t,n):void 0===t)?1:no(t),Ru(oo(e),t)},On.replace=function(){var e=arguments,t=oo(e[0]);return e.length<3?t:t.replace(e[1],e[2])},On.result=function(e,t,n){var u=-1,r=(t=or(t,e)).length;for(r||(r=1,e=void 0);++u9007199254740991)return[];var n=4294967295,u=dn(e,4294967295);e-=4294967295;for(var r=It(u,t=Jr(t));++n=a)return e;var o=n-qt(u);if(o<1)return u;var i=d?cr(d,0,o).join(""):e.slice(0,o);if(void 0===r)return i+u;if(d&&(o+=i.length-o),Vd(r)){if(e.slice(o).search(r)){var c,l=i;for(r.global||(r=be(r.source,oo(ue.exec(r))+"g")),r.lastIndex=0;c=r.exec(l);)var f=c.index;i=i.slice(0,void 0===f?o:f)}}else if(e.indexOf(Yu(r),o)!=o){var s=i.lastIndexOf(r);s>-1&&(i=i.slice(0,s))}return i+u},On.unescape=function(e){return(e=oo(e))&&L.test(e)?e.replace(M,Vt):e},On.uniqueId=function(e){var t=++xe;return oo(e)+t},On.upperCase=Lo,On.upperFirst=Bo,On.each=dd,On.eachRight=od,On.first=Ta,Jo(On,(li={},iu(On,(function(e,t){ke.call(On.prototype,t)||(li[t]=e)})),li),{chain:!1}),On.VERSION="4.17.15",ot(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){On[e].placeholder=On})),ot(["drop","take"],(function(e,t){Nn.prototype[e]=function(n){n=void 0===n?1:an(no(n),0);var u=this.__filtered__&&!t?new Nn(this):this.clone();return u.__filtered__?u.__takeCount__=dn(n,u.__takeCount__):u.__views__.push({size:dn(n,4294967295),type:e+(u.__dir__<0?"Right":"")}),u},Nn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),ot(["filter","map","takeWhile"],(function(e,t){var n=t+1,u=1==n||3==n;Nn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Jr(e,3),type:n}),t.__filtered__=t.__filtered__||u,t}})),ot(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Nn.prototype[e]=function(){return this[n](1).value()[0]}})),ot(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Nn.prototype[e]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Go)},Nn.prototype.find=function(e){return this.filter(e).head()},Nn.prototype.findLast=function(e){return this.reverse().find(e)},Nn.prototype.invokeMap=Lu((function(e,t){return"function"==typeof e?new Nn(this):this.map((function(n){return gu(n,e,t)}))})),Nn.prototype.reject=function(e){return this.filter(Dd(Jr(e)))},Nn.prototype.slice=function(e,t){e=no(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Nn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=no(t))<0?n.dropRight(-t):n.take(t-e)),n)},Nn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},iu(Nn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),r=On[u?"take"+("last"==t?"Right":""):t],a=u||/^find/.test(t);r&&(On.prototype[t]=function(){var t=this.__wrapped__,d=u?[1]:arguments,o=t instanceof Nn,i=d[0],c=o||Nd(t),l=function(e){var t=r.apply(On,mt([e],d));return u&&f?t[0]:t};c&&n&&"function"==typeof i&&1!=i.length&&(o=c=!1);var f=this.__chain__,s=!!this.__actions__.length,p=a&&!f,m=o&&!s;if(!a&&c){t=m?t:new Nn(this);var h=e.apply(t,d);return h.__actions__.push({func:td,args:[l],thisArg:void 0}),new jn(h,f)}return p&&m?e.apply(this,d):(h=this.thru(l),p?u?h.value()[0]:h.value():h)})})),ot(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",u=/^(?:pop|shift)$/.test(e);On.prototype[e]=function(){var e=arguments;if(u&&!this.__chain__){var r=this.value();return t.apply(Nd(r)?r:[],e)}return this[n]((function(n){return t.apply(Nd(n)?n:[],e)}))}})),iu(Nn.prototype,(function(e,t){var n=On[t];if(n){var u=n.name+"";ke.call(yn,u)||(yn[u]=[]),yn[u].push({name:t,func:n})}})),yn[Or(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var e=new Nn(this.__wrapped__);return e.__actions__=vr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=vr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=vr(this.__views__),e},Nn.prototype.reverse=function(){if(this.__filtered__){var e=new Nn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Nn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Nd(e),u=t<0,r=n?e.length:0,a=function(e,t,n){var u=-1,r=n.length;for(;++u=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(e){for(var t,n=this;n instanceof An;){var u=Ca(n);u.__index__=0,u.__values__=void 0,t?r.__wrapped__=u:t=u;var r=u;n=n.__wrapped__}return r.__wrapped__=e,t},On.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Nn){var t=e;return this.__actions__.length&&(t=new Nn(this)),(t=t.reverse()).__actions__.push({func:td,args:[Wa],thisArg:void 0}),new jn(t,this.__chain__)}return this.thru(Wa)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return nr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Qe&&(On.prototype[Qe]=function(){return this}),On}();Ve._=Kt,void 0===(r=function(){return Kt}.call(t,n,t,u))||(u.exports=r)}).call(this)}).call(this,n(76),n(456)(e))},452:function(e,t,n){"use strict";var u=n(0);t.a=function(e){void 0===e&&(e=!0),Object(u.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},453:function(e,t,n){"use strict";var u=n(436),r=n(441),a=n(438),d=n(432);t.a=function(){var e=Object(u.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,o=(n=void 0===n?{}:n).logo,i=void 0===o?{}:o,c=Object(r.a)().isDarkTheme,l=i.href||t,f={};i.target?f={target:i.target}:Object(d.a)(l)||(f={rel:"noopener noreferrer",target:"_blank"});var s=i.srcDark&&c?i.srcDark:i.src;return{logoLink:l,logoLinkProps:f,logoImageUrl:Object(a.a)(s),logoAlt:i.alt}}},455:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(77),n(473),n(439),n(78);var u=n(475),r=n.n(u);function a(e,t){var n=new r.a;return e.map((function(e){var u=e;return"string"==typeof e&&(u={label:e,permalink:"/blog/tags/"+n.slug(e)}),function(e,t){var n=e.label.split(": ",2),u=n[0],r=n[1],a="primary";switch(t){case"blog":case"guides":a=function(e){switch(e){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(u)}return{category:u,count:e.count,label:e.label,permalink:e.permalink,style:a,value:r}}(u,t)}))}},456:function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},457:function(e,t,n){"use strict";var u=n(12),r=n(26),a=n(517),d="".endsWith;u(u.P+u.F*n(518)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,u=r(t.length),o=void 0===n?u:Math.min(r(n),u),i=String(e);return d?d.call(t,i,o):t.slice(o-i.length,o)===i}})},458:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(436),d=n(145),o=n.n(d);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,d=n.id,i=n.content,c=n.backgroundColor,l=n.textColor,f=Object(u.useState)(!0),s=f[0],p=f[1];return Object(u.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=d!==e;localStorage.setItem("docusaurus.announcement.id",d),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&p(!1)}),[]),!i||s?null:r.a.createElement("div",{className:o.a.announcementBar,style:{backgroundColor:c,color:l},role:"banner"},r.a.createElement("div",{className:o.a.announcementBarContent,dangerouslySetInnerHTML:{__html:i}}),r.a.createElement("button",{type:"button",className:o.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),p(!0)},"aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},459:function(e,t,n){"use strict";var u=n(0);u.PureComponent},460:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var u=n(0),r=n.n(u),a=n(423),d=n.n(a),o=n(436),i=n(472);n(146);t.a=function(e){var t=Object(u.useState)(!1),a=t[0],c=t[1],l=Object(u.useRef)(null),f=Object(o.a)().siteConfig,s=(void 0===f?{}:f).themeConfig.algolia,p=Object(i.c)();var m=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(269).then(n.t.bind(null,570,7)),n.e(176).then(n.t.bind(null,583,7))]).then((function(t){var n=t[0].default;c(!0),window.docsearch=n,function(e){window.docsearch({appId:s.appId,apiKey:s.apiKey,indexName:s.indexName,inputSelector:"#search_input_react",algoliaOptions:s.algoliaOptions,handleSelected:function(e,t,n){var u=document.createElement("a");u.href=n.url;var r="#__docusaurus"===u.hash?""+u.pathname:""+u.pathname+u.hash;p.push(r)}}),e&&l.current.focus()}(e)}))},h=Object(u.useCallback)((function(){m(),a&&l.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(u.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(u.useCallback)((function(e){var t="mouseover"!==e.type;m(t)}));return r.a.createElement("div",{className:"navbar__search",key:"search-box"},r.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:d()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:h,onKeyDown:h,tabIndex:0}),r.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:d()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:v,onFocus:v,onBlur:b,ref:l}))}},461:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,u)&&(n[u]=e[u]);return n}(t,["className","icons"])),a=(0,o.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return d.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},d.default.createElement("div",{className:"react-toggle-track"},d.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),d.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),d.default.createElement("div",{className:"react-toggle-thumb"}),d.default.createElement("input",u({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=p,p.displayName="Toggle",p.defaultProps={icons:{checked:d.default.createElement(c.default,null),unchecked:d.default.createElement(l.default,null)}},p.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},462:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=(n(84),n(473),function(){var e=Object(u.useState)({}),t=e[0],n=e[1],r=Object(u.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(u.useEffect)((function(){try{for(var e={},t=0;t=f?d(!1):e+n1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new u("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=x(e),r=n.length>0?n[0]:"",d=S("%"+r+"%",t),i=d.name,c=d.value,l=!1,f=d.alias;f&&(r=f[0],y(n,g([0,1],f)));for(var s=1,p=!0;s=n.length){var D=o(c,h);c=(p=!!D)&&"get"in D&&!("originalValue"in D.get)?D.get:c[h]}else p=v(c,h),c=c[h];p&&!l&&(m[i]=c)}}return c}},470:function(e,t,n){"use strict";var u=n(509);e.exports=Function.prototype.bind||u},471:function(e,t,n){"use strict";var u=String.prototype.replace,r=/%20/g,a="RFC1738",d="RFC3986";e.exports={default:d,formatters:{RFC1738:function(e){return u.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:d}},472:function(e,t,n){"use strict";var u=n(39);n.d(t,"a",(function(){return u.c})),n.d(t,"b",(function(){return u.d})),n.d(t,"c",(function(){return u.e})),n.d(t,"d",(function(){return u.f}))},474:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);t.a=function(e){var t=e.count,n=e.label,u=e.permalink,d=e.style,i=e.value,c=e.valueOnly;return r.a.createElement(a.a,{to:u+"/",className:o()("badge","badge--rounded","badge--"+d)},c?i:n,t&&r.a.createElement(r.a.Fragment,null," (",t,")"))}},475:function(e,t,n){var u=n(476);e.exports=o;var r=Object.hasOwnProperty,a=/\s/g,d=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function i(e,t){return"string"!=typeof e?"":(t||(e=e.toLowerCase()),e.trim().replace(d,"").replace(u(),"").replace(a,"-"))}o.prototype.slug=function(e,t){for(var n=i(e,!0===t),u=n;r.call(this.occurrences,n);)this.occurrences[u]++,n=u+"-"+this.occurrences[u];return this.occurrences[n]=0,n},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=i},476:function(e,t){e.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},478:function(e,t,n){"use strict";var u=n(471),r=Object.prototype.hasOwnProperty,a=Array.isArray,d=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),o=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},u=0;u1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var u=[],r=0;r=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===u.RFC1738&&(40===l||41===l)?i+=o.charAt(c):l<128?i+=d[l]:l<2048?i+=d[192|l>>6]+d[128|63&l]:l<55296||l>=57344?i+=d[224|l>>12]+d[128|l>>6&63]+d[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&o.charCodeAt(c)),i+=d[240|l>>18]+d[128|l>>12&63]+d[128|l>>6&63]+d[128|63&l])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],u=0;u{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=u(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=r,e.exports.default=r},485:function(e,t,n){"use strict";var u=n(0),r=n.n(u).a.createContext({isDarkTheme:!1,setLightTheme:function(){},setDarkTheme:function(){}});t.a=r},487:function(e,t,n){"use strict";(function(e){var u=n(1),r=(n(446),n(447),n(78),n(77),n(530),n(0)),a=n.n(r),d=n(531),o=n.n(d),i=n(563),c=n(53),l=n(423),f=n.n(l),s=n(543),p=n.n(s),m=n(532),h=n.n(m),b=n(436),v=n(441),g=n(148),y=n.n(g);(void 0!==e?e:window).Prism=c.a,n(533),n(534),n(535),n(536),n(90),n(537),n(538),n(539),n(540),n(541),n(542);var _=/{([\d,-]+)}/,E=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,d=e.metastring,c=Object(b.a)().siteConfig.themeConfig.prism,l=void 0===c?{}:c,s=Object(r.useState)(!1),m=s[0],g=s[1],w=Object(r.useState)(!1),D=w[0],k=w[1];Object(r.useEffect)((function(){k(!0)}),[]);var x=Object(r.useRef)(null),S=Object(r.useRef)(null),C=[],O="",I=Object(v.a)().isDarkTheme,A=l.theme||p.a,j=l.darkTheme||A,N=I?j:A;if(d&&_.test(d)){var F=d.match(_)[1];C=h.a.parse(F).filter((function(e){return e>0}))}d&&E.test(d)&&(O=d.match(E)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return S.current&&(e=new o.a(S.current,{target:function(){return x.current}})),function(){e&&e.destroy()}}),[S.current,x.current]);var T=n&&n.replace(/language-/,"");!T&&l.defaultLanguage&&(T=l.defaultLanguage);var P=function(){window.getSelection().empty(),g(!0),setTimeout((function(){return g(!1)}),2e3)};return a.a.createElement(i.a,Object(u.a)({},i.b,{key:D,theme:N,code:t.trim(),language:T}),(function(e){var t,n,r=e.className,d=e.style,o=e.tokens,i=e.getLineProps,c=e.getTokenProps;return a.a.createElement(a.a.Fragment,null,O&&a.a.createElement("div",{style:d,className:y.a.codeBlockTitle},O),a.a.createElement("div",{className:y.a.codeBlockContent},a.a.createElement("button",{ref:S,type:"button","aria-label":"Copy code to clipboard",className:f()(y.a.copyButton,(t={},t[y.a.copyButtonWithTitle]=O,t)),onClick:P},m?"Copied":"Copy"),a.a.createElement("pre",{className:f()(r,y.a.codeBlock,(n={},n[y.a.codeBlockWithTitle]=O,n))},a.a.createElement("div",{ref:x,className:y.a.codeBlockLines,style:d},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=i({line:e,key:t});return C.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),a.a.createElement("div",Object(u.a)({key:t},n),e.map((function(e,t){return a.a.createElement("span",Object(u.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},488:function(e,t,n){"use strict";var u=n(0),r=n.n(u);n(424),n(144);t.a=function(e){var t=e.children,n=Object(u.useState)(!1),a=n[0],d=n[1];return a?r.a.createElement("div",{className:"code-explanation code-explanation--expanded"},t,r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-arrow-up-circle"})," hide")):r.a.createElement("div",{className:"code-explanation code-explanation--collapsed"},r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-info"})," explain this command"))}},489:function(e,t,n){"use strict";var u=n(30),r=n(12),a=n(27),d=n(91),o=n(92),i=n(26),c=n(545),l=n(93);r(r.S+r.F*!n(83)((function(e){Array.from(e)})),"Array",{from:function(e){var t,n,r,f,s=a(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,b=void 0!==h,v=0,g=l(s);if(b&&(h=u(h,m>2?arguments[2]:void 0,2)),null==g||p==Array&&o(g))for(n=new p(t=i(s.length));t>v;v++)c(n,v,b?h(s[v],v):s[v]);else for(f=g.call(s),n=new p;!(r=f.next()).done;v++)c(n,v,b?d(f,h,[r.value,v],!0):r.value);return n.length=v,n}})},490:function(e,t,n){"use strict";var u=n(546),r=n(492);e.exports=n(547)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return u.def(r(this,"Set"),e=0===e?0:e,e)}},u)},491:function(e,t,n){var u=n(40)("meta"),r=n(13),a=n(31),d=n(28).f,o=0,i=Object.isExtensible||function(){return!0},c=!n(14)((function(){return i(Object.preventExtensions({}))})),l=function(e){d(e,u,{value:{i:"O"+ ++o,w:{}}})},f=e.exports={KEY:u,NEED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,u)){if(!i(e))return"F";if(!t)return"E";l(e)}return e[u].i},getWeak:function(e,t){if(!a(e,u)){if(!i(e))return!0;if(!t)return!1;l(e)}return e[u].w},onFreeze:function(e){return c&&f.NEED&&i(e)&&!a(e,u)&&l(e),e}}},492:function(e,t,n){var u=n(13);e.exports=function(e,t){if(!u(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},493:function(e,t,n){"use strict";const u=n(494);e.exports=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");t=void 0===t?"_":t;const n=u("([\\p{Ll}\\d])(\\p{Lu})","g"),r=u("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(n,`$1${t}$2`).replace(r,`$1${t}$2`).toLowerCase()}},494:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=f(n(495)),r=f(n(496)),a=f(n(497)),d=f(n(498)),o=f(n(499)),i=f(n(500)),c=f(n(501)),l=f(n(502));function f(e){return e&&e.__esModule?e:{default:e}}(0,r.default)(u.default),(0,a.default)(u.default),(0,d.default)(u.default),(0,o.default)(u.default),(0,i.default)(u.default),(0,c.default)(u.default),(0,l.default)(u.default),t.default=u.default,e.exports=t.default},495:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u={astral:!1},r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},a={},d={},o={},i=[],c={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},l=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,f=void 0===r.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var t=!0;try{new RegExp("",e)}catch(n){t=!1}return t}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function g(e,t,n,u,r){var a=void 0;if(e.xregexp={captureNames:t},r)return e;if(e.__proto__)e.__proto__=j.prototype;else for(a in j.prototype)e[a]=j.prototype[a];return e.xregexp.source=n,e.xregexp.flags=u?u.split("").sort().join(""):u,e}function y(e){return r.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,t){if(!j.isRegExp(e))throw new TypeError("Type RegExp expected");var n=e.xregexp||{},u=function(e){return s?e.flags:r.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),a="",d="",o=null,i=null;return(t=t||{}).removeG&&(d+="g"),t.removeY&&(d+="y"),d&&(u=r.replace.call(u,new RegExp("["+d+"]+","g"),"")),t.addG&&(a+="g"),t.addY&&(a+="y"),a&&(u=y(u+a)),t.isInternalOnly||(void 0!==n.source&&(o=n.source),null!=n.flags&&(i=a?y(n.flags+a):n.flags)),e=g(new RegExp(t.source||e.source,u),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?n.captureNames.slice(0):null,o,i,t.isInternalOnly)}function E(e){return parseInt(e,16)}function w(e,t,n){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,t,n){return r.test.call(-1!==n.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(t))}(e.input,e.index+e[0].length,n)?"":"(?:)"}function D(e){return parseInt(e,10).toString(16)}function k(e,t){return p.call(e)==="[object "+t+"]"}function x(e){for(;e.length<4;)e="0"+e;return e}function S(e){var t={};return k(e,"String")?(j.forEach(e,/[^\s,]+/,(function(e){t[e]=!0})),t):e}function C(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");v[e]=!0}function O(e,t,n,u,r){for(var a=i.length,d=e[n],o=null,c=void 0,l=void 0;a--;)if(!((l=i[a]).leadChar&&l.leadChar!==d||l.scope!==u&&"all"!==l.scope||l.flag&&-1===t.indexOf(l.flag))&&(c=j.exec(e,l.regex,n,"sticky"))){o={matchLength:c[0].length,output:l.handler.call(r,c,u,t),reparse:l.reparse};break}return o}function I(e){u.astral=e}function A(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function j(e,t){if(j.isRegExp(e)){if(void 0!==t)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),t=void 0===t?"":String(t),j.isInstalled("astral")&&-1===t.indexOf("A")&&(t+="A"),o[e]||(o[e]={}),!o[e][t]){for(var n={hasNamedCapture:!1,captureNames:[]},u="default",a="",d=0,i=void 0,l=function(e,t){var n=void 0;if(y(t)!==t)throw new SyntaxError("Invalid duplicate regex flag "+t);for(e=r.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,n){if(r.test.call(/[gy]/,n))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return t=y(t+n),""})),n=0;n"}else if(n)return"\\"+(+n+d);return e}if(!k(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var c=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,l=[],f=void 0,s=0;s1&&-1!==n.indexOf("")){var u=_(this,{removeG:!0,isInternalOnly:!0});r.replace.call(String(e).slice(n.index),u,(function(){for(var e=arguments.length,t=Array(e),u=0;un.index&&(this.lastIndex=n.index)}return this.global||(this.lastIndex=t),n},a.test=function(e){return!!a.exec.call(this,e)},a.match=function(e){if(j.isRegExp(e)){if(e.global){var t=r.match.apply(this,arguments);return e.lastIndex=0,t}}else e=new RegExp(e);return a.exec.call(e,A(this))},a.replace=function(e,t){var n=j.isRegExp(e),u=void 0,a=void 0,d=void 0;return n?(e.xregexp&&(a=e.xregexp.captureNames),u=e.lastIndex):e+="",d=k(t,"Function")?r.replace.call(String(this),e,(function(){for(var u=arguments.length,r=Array(u),d=0;dn.length-3)throw new SyntaxError("Backreference to undefined group "+e);return n[r]||""}throw new SyntaxError("Invalid token "+e)}})),n&&(e.global?e.lastIndex=0:e.lastIndex=u),d},a.split=function(e,t){if(!j.isRegExp(e))return r.split.apply(this,arguments);var n=String(this),u=[],a=e.lastIndex,d=0,o=void 0;return t=(void 0===t?-1:t)>>>0,j.forEach(n,e,(function(e){e.index+e[0].length>d&&(u.push(n.slice(d,e.index)),e.length>1&&e.indext?u.slice(0,t):u},j.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,t){if("B"===e[1]&&"default"===t)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),j.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,t,n){var u=E(e[1]);if(u>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(u<=65535)return"\\u"+x(D(u));if(h&&-1!==n.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),j.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),j.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),j.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),j.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),j.addToken(/\\k<([\w$]+)>/,(function(e){var t=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],n=e.index+e[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+t+(n===e.input.length||isNaN(e.input[n])?"":"(?:)")}),{leadChar:"\\"}),j.addToken(/\\(\d+)/,(function(e,t){if(!("default"===t&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),j.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),j.addToken(/\((?!\?)/,(function(e,t,n){return-1!==n.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),t.default=j,e.exports=t.default},496:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,n=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,t],"g",{conjunction:"or"});function u(e){var t=/^(?:\(\?:\))*\^/,n=/\$(?:\(\?:\))*$/;return t.test(e)&&n.test(e)&&n.test(e.replace(/\\[\s\S]/g,""))?e.replace(t,"").replace(n,""):e}function r(t,n){var u=n?"x":"";return e.isRegExp(t)?t.xregexp&&t.xregexp.captureNames?t:e(t.source,u):e(t,u)}function a(t){return t instanceof RegExp?t:e.escape(t)}function d(e,t,n){return e["subpattern"+n]=t,e}function o(e,t,n){return e+(t1?u-1:0),i=1;i"):i="(?:",h=m,""+i+l[d].pattern.replace(t,(function(e,t,n){if(t){if(o=l[d].names[m-h],++m,o)return"(?<"+o+">"}else if(n)return c=+n-1,l[d].names[c]?"\\k<"+l[d].names[c]+">":"\\"+(+n+h);return e}))+")"}if(r){if(o=g[b],v[++b]=++m,o)return"(?<"+o+">"}else if(a)return g[c=+a-1]?"\\k<"+g[c]+">":"\\"+v[+a];return e}));return e(y,o)}},e.exports=t.default},497:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(e,t,n,u){return{name:e,value:t,start:n,end:u}}e.matchRecursive=function(n,u,r,a,d){d=d||{};var o=-1!==(a=a||"").indexOf("g"),i=-1!==a.indexOf("y"),c=a.replace(/y/g,""),l=d.escapeChar,f=d.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,g=void 0,y=void 0,_=void 0,E=void 0;if(u=e(u,c),r=e(r,c),l){if(l.length>1)throw new Error("Cannot use more than one escape character");l=e.escape(l),E=new RegExp("(?:"+l+"[\\S\\s]|(?:(?!"+e.union([u,r],"",{conjunction:"or"}).source+")[^"+l+"])+)+",a.replace(/[^imu]+/g,""))}for(;;){if(l&&(h+=(e.exec(n,E,h,"sticky")||[""])[0].length),y=e.exec(n,u,h),_=e.exec(n,r,h),y&&_&&(y.index<=_.index?_=null:y=null),y||_)h=(m=(y||_).index)+(y||_)[0].length;else if(!p)break;if(i&&!p&&m>b)break;if(y)p||(v=m,g=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(f?(f[0]&&v>b&&s.push(t(f[0],n.slice(b,v),b,v)),f[1]&&s.push(t(f[1],n.slice(v,g),v,g)),f[2]&&s.push(t(f[2],n.slice(g,m),g,m)),f[3]&&s.push(t(f[3],n.slice(m,h),m,h))):s.push(n.slice(g,m)),b=h,!o))break}m===h&&++h}return o&&!i&&f&&f[0]&&n.length>b&&s.push(t(f[0],n.slice(b),b,n.length)),s}},e.exports=t.default},498:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t={},n=e._dec,u=e._hex,r=e._pad4;function a(e){return e.replace(/[- _]+/g,"").toLowerCase()}function d(e){var t=/^\\[xu](.+)/.exec(e);return t?n(t[1]):e.charCodeAt("\\"===e[0]?1:0)}function o(n){var a,o,i;return t[n]["b!"]||(t[n]["b!"]=(a=t[n].bmp,o="",i=-1,e.forEach(a,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var t=d(e[1]);t>i+1&&(o+="\\u"+r(u(i+1)),t>i+2&&(o+="-\\u"+r(u(t-1)))),i=d(e[2]||e[1])})),i<65535&&(o+="\\u"+r(u(i+1)),i<65534&&(o+="-\\uFFFF")),o))}function i(e,n){var u=n?"a!":"a=";return t[e][u]||(t[e][u]=function(e,n){var u=t[e],r="";return u.bmp&&!u.isBmpLast&&(r="["+u.bmp+"]"+(u.astral?"|":"")),u.astral&&(r+=u.astral),u.isBmpLast&&u.bmp&&(r+=(u.astral?"|":"")+"["+u.bmp+"]"),n?"(?:(?!"+r+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+r+")"}(e,n))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,n,u){var r="P"===e[1]||!!e[2],d=-1!==u.indexOf("A"),c=a(e[4]||e[3]),l=t[c];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!t.hasOwnProperty(c))throw new SyntaxError("Unknown Unicode token "+e[0]);if(l.inverseOf){if(c=a(l.inverseOf),!t.hasOwnProperty(c))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+l.inverseOf);l=t[c],r=!r}if(!l.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(d){if("class"===n)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return i(c,r)}return"class"===n?r?o(c):l.bmp:(r?"[^":"[")+l.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(n){for(var u=void 0,r=0;r\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=t.default},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var t=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];t.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(t)},e.exports=t.default},502:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=t.default},503:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){var t=e.text;return r.a.createElement("section",{className:"empty"},r.a.createElement("div",{className:"icon"},r.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),r.a.createElement("div",{className:"text"},t))}},504:function(e,t,n){"use strict";var u=n(505),r=n(515),a=n(471);e.exports={formats:a,parse:r,stringify:u}},505:function(e,t,n){"use strict";var u=n(506),r=n(478),a=n(471),d=Object.prototype.hasOwnProperty,o={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},i=Array.isArray,c=String.prototype.split,l=Array.prototype.push,f=function(e,t){l.apply(e,i(t)?t:[t])},s=Date.prototype.toISOString,p=a.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:r.encode,encodeValuesOnly:!1,format:p,formatter:a.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},b=function e(t,n,a,d,o,l,s,p,b,v,g,y,_,E,w,D){for(var k,x=t,S=D,C=0,O=!1;void 0!==(S=S.get(h))&&!O;){var I=S.get(t);if(C+=1,void 0!==I){if(I===C)throw new RangeError("Cyclic object value");O=!0}void 0===S.get(h)&&(C=0)}if("function"==typeof p?x=p(n,x):x instanceof Date?x=g(x):"comma"===a&&i(x)&&(x=r.maybeMap(x,(function(e){return e instanceof Date?g(e):e}))),null===x){if(o)return s&&!E?s(n,m.encoder,w,"key",y):n;x=""}if("string"==typeof(k=x)||"number"==typeof k||"boolean"==typeof k||"symbol"==typeof k||"bigint"==typeof k||r.isBuffer(x)){if(s){var A=E?n:s(n,m.encoder,w,"key",y);if("comma"===a&&E){for(var j=c.call(String(x),","),N="",F=0;F0?x.join(",")||null:void 0}];else if(i(p))T=p;else{var M=Object.keys(x);T=b?M.sort(b):M}for(var R=d&&i(x)&&1===x.length?n+"[]":n,L=0;L0?E+_:""}},506:function(e,t,n){"use strict";var u=n(469),r=n(511),a=n(513),d=u("%TypeError%"),o=u("%WeakMap%",!0),i=u("%Map%",!0),c=r("WeakMap.prototype.get",!0),l=r("WeakMap.prototype.set",!0),f=r("WeakMap.prototype.has",!0),s=r("Map.prototype.get",!0),p=r("Map.prototype.set",!0),m=r("Map.prototype.has",!0),h=function(e,t){for(var n,u=e;null!==(n=u.next);u=n)if(n.key===t)return u.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,u={assert:function(e){if(!u.has(e))throw new d("Side channel does not contain "+a(e))},get:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return c(e,u)}else if(i){if(t)return s(t,u)}else if(n)return function(e,t){var n=h(e,t);return n&&n.value}(n,u)},has:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return f(e,u)}else if(i){if(t)return m(t,u)}else if(n)return function(e,t){return!!h(e,t)}(n,u);return!1},set:function(u,r){o&&u&&("object"==typeof u||"function"==typeof u)?(e||(e=new o),l(e,u,r)):i?(t||(t=new i),p(t,u,r)):(n||(n={key:{},next:null}),function(e,t,n){var u=h(e,t);u?u.value=n:e.next={key:t,next:e.next,value:n}}(n,u,r))}};return u}},507:function(e,t,n){"use strict";var u="undefined"!=typeof Symbol&&Symbol,r=n(508);e.exports=function(){return"function"==typeof u&&("function"==typeof Symbol&&("symbol"==typeof u("foo")&&("symbol"==typeof Symbol("bar")&&r())))}},508:function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var u=Object.getOwnPropertySymbols(e);if(1!==u.length||u[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var r=Object.getOwnPropertyDescriptor(e,t);if(42!==r.value||!0!==r.enumerable)return!1}return!0}},509:function(e,t,n){"use strict";var u="Function.prototype.bind called on incompatible ",r=Array.prototype.slice,a=Object.prototype.toString;e.exports=function(e){var t=this;if("function"!=typeof t||"[object Function]"!==a.call(t))throw new TypeError(u+t);for(var n,d=r.call(arguments,1),o=function(){if(this instanceof n){var u=t.apply(this,d.concat(r.call(arguments)));return Object(u)===u?u:this}return t.apply(e,d.concat(r.call(arguments)))},i=Math.max(0,t.length-d.length),c=[],l=0;l-1?r(n):n}},512:function(e,t,n){"use strict";var u=n(470),r=n(469),a=r("%Function.prototype.apply%"),d=r("%Function.prototype.call%"),o=r("%Reflect.apply%",!0)||u.call(d,a),i=r("%Object.getOwnPropertyDescriptor%",!0),c=r("%Object.defineProperty%",!0),l=r("%Math.max%");if(c)try{c({},"a",{value:1})}catch(s){c=null}e.exports=function(e){var t=o(u,d,arguments);if(i&&c){var n=i(t,"length");n.configurable&&c(t,"length",{value:1+l(0,e.length-(arguments.length-1))})}return t};var f=function(){return o(u,a,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},513:function(e,t,n){var u="function"==typeof Map&&Map.prototype,r=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,a=u&&r&&"function"==typeof r.get?r.get:null,d=u&&Map.prototype.forEach,o="function"==typeof Set&&Set.prototype,i=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=o&&i&&"function"==typeof i.get?i.get:null,l=o&&Set.prototype.forEach,f="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,b=Function.prototype.toString,v=String.prototype.match,g=String.prototype.slice,y=String.prototype.replace,_=String.prototype.toUpperCase,E=String.prototype.toLowerCase,w=RegExp.prototype.test,D=Array.prototype.concat,k=Array.prototype.join,x=Array.prototype.slice,S=Math.floor,C="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,A="function"==typeof Symbol&&"object"==typeof Symbol.iterator,j="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===A||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,F=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function T(e,t){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var u=e<0?-S(-e):S(e);if(u!==e){var r=String(u),a=g.call(t,r.length+1);return y.call(r,n,"$&_")+"."+y.call(y.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}}return y.call(t,n,"$&_")}var P=n(514),M=P.custom,R=W(M)?M:null;function L(e,t,n){var u="double"===(n.quoteStyle||t)?'"':"'";return u+e+u}function B(e){return y.call(String(e),/"/g,""")}function z(e){return!("[object Array]"!==q(e)||j&&"object"==typeof e&&j in e)}function U(e){return!("[object RegExp]"!==q(e)||j&&"object"==typeof e&&j in e)}function W(e){if(A)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!I)return!1;try{return I.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,u,r){var o=n||{};if($(o,"quoteStyle")&&"single"!==o.quoteStyle&&"double"!==o.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if($(o,"maxStringLength")&&("number"==typeof o.maxStringLength?o.maxStringLength<0&&o.maxStringLength!==1/0:null!==o.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var i=!$(o,"customInspect")||o.customInspect;if("boolean"!=typeof i&&"symbol"!==i)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if($(o,"indent")&&null!==o.indent&&"\t"!==o.indent&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if($(o,"numericSeparator")&&"boolean"!=typeof o.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=o.numericSeparator;if(void 0===t)return"undefined";if(null===t)return"null";if("boolean"==typeof t)return t?"true":"false";if("string"==typeof t)return function e(t,n){if(t.length>n.maxStringLength){var u=t.length-n.maxStringLength,r="... "+u+" more character"+(u>1?"s":"");return e(g.call(t,0,n.maxStringLength),n)+r}return L(y.call(y.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,V),"single",n)}(t,o);if("number"==typeof t){if(0===t)return 1/0/t>0?"0":"-0";var _=String(t);return h?T(t,_):_}if("bigint"==typeof t){var w=String(t)+"n";return h?T(t,w):w}var S=void 0===o.depth?5:o.depth;if(void 0===u&&(u=0),u>=S&&S>0&&"object"==typeof t)return z(t)?"[Array]":"[Object]";var O=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(o,u);if(void 0===r)r=[];else if(G(r,t)>=0)return"[Circular]";function M(t,n,a){if(n&&(r=x.call(r)).push(n),a){var d={depth:o.depth};return $(o,"quoteStyle")&&(d.quoteStyle=o.quoteStyle),e(t,d,u+1,r)}return e(t,o,u+1,r)}if("function"==typeof t&&!U(t)){var H=function(e){if(e.name)return e.name;var t=v.call(b.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),X=Q(t,M);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(X.length>0?" { "+k.call(X,", ")+" }":"")}if(W(t)){var ee=A?y.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):I.call(t);return"object"!=typeof t||A?ee:K(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(t)){for(var te="<"+E.call(String(t.nodeName)),ne=t.attributes||[],ue=0;ue"}if(z(t)){if(0===t.length)return"[]";var re=Q(t,M);return O&&!function(e){for(var t=0;t=0)return!1;return!0}(re)?"["+Y(re,O)+"]":"[ "+k.call(re,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)){var ae=Q(t,M);return"cause"in Error.prototype||!("cause"in t)||N.call(t,"cause")?0===ae.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(ae,", ")+" }":"{ ["+String(t)+"] "+k.call(D.call("[cause]: "+M(t.cause),ae),", ")+" }"}if("object"==typeof t&&i){if(R&&"function"==typeof t[R]&&P)return P(t,{depth:S-u});if("symbol"!==i&&"function"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||"object"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var de=[];return d.call(t,(function(e,n){de.push(M(n,t,!0)+" => "+M(e,t))})),J("Map",a.call(t),de,O)}if(function(e){if(!c||!e||"object"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var oe=[];return l.call(t,(function(e){oe.push(M(e,t))})),J("Set",c.call(t),oe,O)}if(function(e){if(!f||!e||"object"!=typeof e)return!1;try{f.call(e,f);try{s.call(e,s)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return Z("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return Z("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(t){}return!1}(t))return Z("WeakRef");if(function(e){return!("[object Number]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(Number(t)));if(function(e){if(!e||"object"!=typeof e||!C)return!1;try{return C.call(e),!0}catch(t){}return!1}(t))return K(M(C.call(t)));if(function(e){return!("[object Boolean]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(m.call(t));if(function(e){return!("[object String]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(String(t)));if(!function(e){return!("[object Date]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)&&!U(t)){var ie=Q(t,M),ce=F?F(t)===Object.prototype:t instanceof Object||t.constructor===Object,le=t instanceof Object?"":"null prototype",fe=!ce&&j&&Object(t)===t&&j in t?g.call(q(t),8,-1):le?"Object":"",se=(ce||"function"!=typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||le?"["+k.call(D.call([],fe||[],le||[]),": ")+"] ":"");return 0===ie.length?se+"{}":O?se+"{"+Y(ie,O)+"}":se+"{ "+k.call(ie,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function $(e,t){return H.call(e,t)}function q(e){return h.call(e)}function G(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,u=e.length;n-1?e.split(","):e},c=function(e,t,n,u){if(e){var a=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,d=/(\[[^[\]]*])/g,o=n.depth>0&&/(\[[^[\]]*])/.exec(a),c=o?a.slice(0,o.index):a,l=[];if(c){if(!n.plainObjects&&r.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var f=0;n.depth>0&&null!==(o=d.exec(a))&&f=0;--a){var d,o=e[a];if("[]"===o&&n.parseArrays)d=[].concat(r);else{d=n.plainObjects?Object.create(null):{};var c="["===o.charAt(0)&&"]"===o.charAt(o.length-1)?o.slice(1,-1):o,l=parseInt(c,10);n.parseArrays||""!==c?!isNaN(l)&&o!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(d=[])[l]=r:"__proto__"!==c&&(d[c]=r):d={0:r}}r=d}return r}(l,t,n,u)}};e.exports=function(e,t){var n=function(e){if(!e)return d;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?d.charset:e.charset;return{allowDots:void 0===e.allowDots?d.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:d.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:d.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:d.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:d.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:d.comma,decoder:"function"==typeof e.decoder?e.decoder:d.decoder,delimiter:"string"==typeof e.delimiter||u.isRegExp(e.delimiter)?e.delimiter:d.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:d.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:d.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:d.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:d.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:d.strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var l="string"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,s=l.split(t.delimiter,f),p=-1,m=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(b=a(b)?[b]:b),r.call(c,h)?c[h]=u.combine(c[h],b):c[h]=b}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},s=Object.keys(l),p=0;p'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},g={},y=function(e,t){var n=g[e]||(g[e]=[]);if(!(n.push(t)>1)){var u=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete g[e];t=n.shift();)t.apply(null,arguments)}));if(l){var r=new d;s(r,"abort",u),s(r,"error",u),s(r,"load",(function(){var e;try{e=JSON.parse(r.responseText)}catch(t){return void u(t)}u(200!==r.status,e)})),r.open("GET",e),r.send()}else{var a=this||window;a._=function(e){a._=null,u(200!==e.meta.status,e.data)};var i=o(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),c=function(){a._&&a._({meta:{}})};s(i,"load",c),s(i,"error",c),i.readyState&&function(e,t,n){var u=function(r){if(t.test(e.readyState))return p(e,"readystatechange",u),n(r)};s(e,"readystatechange",u)}(i,/de|m/,c),a.document.getElementsByTagName("head")[0].appendChild(i)}}},E=function(e,t,n){var u=o(e.ownerDocument),r=e.appendChild(u("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+b(t["data-color-scheme"]);r.styleSheet?r.styleSheet.cssText=a:r.appendChild(e.ownerDocument.createTextNode(a));var d,i,l=u("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(d=t["data-icon"],i=/^large$/i.test(t["data-size"])?16:14,d=(""+d).toLowerCase().replace(/^octicon-/,""),c(v,d)||(d="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",u("span",{},[t["data-text"]||""])]),f=e.appendChild(u("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[l])),s=l.hostname.split(".").reverse();if(""===s[0]&&s.shift(),"com"!==s[0]||"github"!==s[1])return l.href="#",l.target="_self",void n(f);var p=s.length,m=(" /"+l.pathname).split(/\/+/);if(((2===p||3===p&&"gist"===s[2])&&"archive"===m[3]||2===p&&"releases"===m[3]&&"download"===m[4]||3===p&&"codeload"===s[2])&&(l.target="_top"),/^true$/i.test(t["data-show-count"])&&2===p){var h,g;if(!m[2]&&m[1])h=g="followers";else if(!m[3]&&m[2])g="stargazers_count",h="stargazers";else if(m[4]||"subscription"!==m[3])if(m[4]||"fork"!==m[3]){if("issues"!==m[3])return void n(f);g="open_issues_count",h="issues"}else g="forks_count",h="network/members";else g="subscribers_count",h="watchers";var _=m[2]?"/repos/"+m[1]+"/"+m[2]:"/users/"+m[1];y.call(this,"https://api.github.com"+_,(function(e,t){if(!e){var r=t[g];f.appendChild(u("a",{className:"social-count",href:t.html_url+"/"+h,target:"_blank",rel:"noopener","aria-label":r+" "+g.replace(/_count$/,"").replace("_"," ").slice(0,r<2?-1:void 0)+" on GitHub"},[(""+r).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(f)}))}else n(f)},w=window.devicePixelRatio||1,D=function(e){return(w>1?r.ceil(r.round(e*w)/w*2)/2:r.ceil(e))||0},k=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},x=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],u=0,r=n.length;u0){var n=t[0];return{x:n.clientX,y:n.clientY}}var u=e.pageX;if(void 0!==u)return{x:u,y:e.pageY}}return{x:0,y:0}}},527:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);n(147);t.a=function(e){var t=e.className,n=e.previous,u=e.next;return r.a.createElement("nav",{className:o()("pagination-nav",t)},r.a.createElement("div",{className:"pagination-nav__item"},n&&r.a.createElement(a.a,{className:"pagination-nav__link",to:n.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),r.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",n.title))),r.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},u&&r.a.createElement(a.a,{className:"pagination-nav__link",to:u.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),r.a.createElement("h4",{className:"pagination-nav__link--label"},u.title," \xbb"))))}},528:function(e,t,n){"use strict";var u=n(0);t.a=function(e,t,n){var r=Object(u.useState)(void 0),a=r[0],d=r[1];Object(u.useEffect)((function(){var u=[],r=[];function o(){var o=function(){var e=0,t=null;for(u=document.getElementsByClassName("anchor");e=0&&a<=n&&(t=r),e+=1}return t}();if(o){var i=0,c=!1;for(r=document.getElementsByClassName(e);i0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":a(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),i=n(1),c=n.n(i),l=n(2),f=n.n(l),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===s(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=f()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new o({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return h("action",e)}},{key:"defaultTarget",value:function(e){var t=h("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return h("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function h(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=m}]).default},e.exports=u()},532:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],u=t[2],r=t[3];if(n&&r){var a=[],d=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=u&&".."!=u&&"\u2025"!=u||(r+=d);for(var o=n;o!=r;o+=d)a.push(o);return a}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},533:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,u=e.languages,r={"application/javascript":u.javascript,"application/json":u.json||u.javascript,"application/xml":u.xml,"text/xml":u.xml,"text/html":u.html,"text/css":u.css,"text/plain":u.plain},a={"application/json":!0,"application/xml":!0};function d(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var o in r)if(r[o]){n=n||{};var i=a[o]?d(o):o;n[o.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+i+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[o]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},534:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},535:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},536:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},537:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},538:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},539:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,u={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[u,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:u.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":u,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},540:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},541:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],u=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,a=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:u,operator:r,punctuation:a};var d={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:d}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:d}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:u,operator:r,punctuation:a}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},542:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,u="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function d(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return u}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return"(?:"+r+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:d(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:d(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:d(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:d(a),lookbehind:!0,greedy:!0},number:{pattern:d(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},543:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},544:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canUseDOM=void 0;var u,r=n(565);var a=((u=r)&&u.__esModule?u:{default:u}).default,d=a.canUseDOM?window.HTMLElement:{};t.canUseDOM=a.canUseDOM;t.default=d},545:function(e,t,n){"use strict";var u=n(28),r=n(57);e.exports=function(e,t,n){t in e?u.f(e,t,r(0,n)):e[t]=n}},546:function(e,t,n){"use strict";var u=n(28).f,r=n(89),a=n(82),d=n(30),o=n(80),i=n(81),c=n(61),l=n(88),f=n(94),s=n(10),p=n(491).fastKey,m=n(492),h=s?"_s":"size",b=function(e,t){var n,u=p(t);if("F"!==u)return e._i[u];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,u){o(e,l,t,"_i"),e._t=t,e._i=r(null),e._f=void 0,e._l=void 0,e[h]=0,null!=u&&i(u,n,e[c],e)}));return a(l.prototype,{clear:function(){for(var e=m(this,t),n=e._i,u=e._f;u;u=u.n)u.r=!0,u.p&&(u.p=u.p.n=void 0),delete n[u.i];e._f=e._l=void 0,e[h]=0},delete:function(e){var n=m(this,t),u=b(n,e);if(u){var r=u.n,a=u.p;delete n._i[u.i],u.r=!0,a&&(a.n=r),r&&(r.p=a),n._f==u&&(n._f=r),n._l==u&&(n._l=a),n[h]--}return!!u},forEach:function(e){m(this,t);for(var n,u=d(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(u(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!b(m(this,t),e)}}),s&&u(l.prototype,"size",{get:function(){return m(this,t)[h]}}),l},def:function(e,t,n){var u,r,a=b(e,t);return a?a.v=n:(e._l=a={i:r=p(t,!0),k:t,v:n,p:u=e._l,n:void 0,r:!1},e._f||(e._f=a),u&&(u.n=a),e[h]++,"F"!==r&&(e._i[r]=a)),e},getEntry:b,setStrong:function(e,t,n){c(e,t,(function(e,n){this._t=m(e,t),this._k=n,this._l=void 0}),(function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))}),n?"entries":"values",!n,!0),f(t)}}},547:function(e,t,n){"use strict";var u=n(5),r=n(12),a=n(16),d=n(82),o=n(491),i=n(81),c=n(80),l=n(13),f=n(14),s=n(83),p=n(41),m=n(548);e.exports=function(e,t,n,h,b,v){var g=u[e],y=g,_=b?"set":"add",E=y&&y.prototype,w={},D=function(e){var t=E[e];a(E,e,"delete"==e||"has"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof y&&(v||E.forEach&&!f((function(){(new y).entries().next()})))){var k=new y,x=k[_](v?{}:-0,1)!=k,S=f((function(){k.has(1)})),C=s((function(e){new y(e)})),O=!v&&f((function(){for(var e=new y,t=5;t--;)e[_](t,t);return!e.has(-0)}));C||((y=t((function(t,n){c(t,y,e);var u=m(new g,t,y);return null!=n&&i(n,b,u[_],u),u}))).prototype=E,E.constructor=y),(S||O)&&(D("delete"),D("has"),b&&D("get")),(O||x)&&D(_),v&&E.clear&&delete E.clear}else y=h.getConstructor(t,e,b,_),d(y.prototype,n),o.NEED=!0;return p(y,e),w[e]=y,r(r.G+r.W+r.F*(y!=g),w),v||h.setStrong(y,e,b),y}},548:function(e,t,n){var u=n(13),r=n(549).set;e.exports=function(e,t,n){var a,d=t.constructor;return d!==n&&"function"==typeof d&&(a=d.prototype)!==n.prototype&&u(a)&&r&&r(e,a),e}},549:function(e,t,n){var u=n(13),r=n(8),a=function(e,t){if(r(e),!u(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,u){try{(u=n(30)(Function.call,n(550).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(r){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:u(e,n),e}}({},!1):void 0),check:a}},550:function(e,t,n){var u=n(62),r=n(57),a=n(33),d=n(87),o=n(31),i=n(86),c=Object.getOwnPropertyDescriptor;t.f=n(10)?c:function(e,t){if(e=a(e),t=d(t,!0),i)try{return c(e,t)}catch(n){}if(o(e,t))return r(!u.f.call(e,t),e[t])}},551:function(e,t,n){"use strict";var u=n(12),r=n(32),a=n(27),d=n(14),o=[].sort,i=[1,2,3];u(u.P+u.F*(d((function(){i.sort(void 0)}))||!d((function(){i.sort(null)}))||!n(552)(o)),"Array",{sort:function(e){return void 0===e?o.call(a(this)):o.call(a(this),r(e))}})},552:function(e,t,n){"use strict";var u=n(14);e.exports=function(e,t){return!!e&&u((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},561:function(e,t,n){"use strict";n(489),n(79),n(490),n(551),n(29),n(22),n(21),n(85),n(442);var u=n(1),r=(n(446),n(447),n(77),n(428),n(0)),a=n.n(r),d=n(481),o=n.n(d);n(150);var i=function(e){var t=e.humanize,n=e.icon,u=e.values,r=e.currentState,d=e.setState;if(0==u.size)return null;var i=Array.from(u);return a.a.createElement(a.a.Fragment,null,i.map((function(e,u){var i="string"==typeof e&&t?o()(e):e;return a.a.createElement("label",{key:u},a.a.createElement("input",{type:"checkbox",onChange:function(t){var n=new Set(r);t.currentTarget.checked?n.add(e):n.delete(e),d(n)},checked:r.has(e)}),i&&a.a.createElement(a.a.Fragment,null,n?a.a.createElement("i",{className:"feather icon-"+n}):""," ",i))})))},c=n(503),l=n(431),f=n(430),s=(n(440),n(451)),p=n.n(s),m=n(423),h=n.n(m),b=n(504),v=n.n(b),g=n(436);n(151);function y(e){var t=e.delivery_guarantee,n=e.description,u=e.event_types,r=e.function_category,d=(e.logo_path,e.name),o=e.pathTemplate,i=e.status,c=e.title,l=e.type,s=o;s||("source"==l&&(s="/docs/reference/sources//"),"transform"==l&&(s="/docs/reference/transforms//"),"sink"==l&&(s="/docs/reference/sinks//"));var p=s.replace("",d);return a.a.createElement(f.a,{to:p,className:"qovery-component",title:n},a.a.createElement("div",{className:"qovery-component--header"},a.a.createElement("div",{className:"qovery-component--name"},c)),a.a.createElement("div",{className:"qovery-component--badges"},"beta"==i?a.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},a.a.createElement("i",{className:"feather icon-alert-triangle"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},a.a.createElement("i",{className:"feather icon-award"})),"best_effort"==t?a.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},a.a.createElement("i",{className:"feather icon-shield-off"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},a.a.createElement("i",{className:"feather icon-shield"})),u.includes("log")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",u.includes("metric")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",a.a.createElement("span",{className:"badge badge--primary"},r)))}function _(e){var t=e.components,n=e.headingLevel,r=e.pathTemplate,d=e.titles,o=t.filter((function(e){return"source"==e.type})),i=t.filter((function(e){return"transform"==e.type})),f=t.filter((function(e){return"sink"==e.type})),s="h"+(n||3);return t.length>0?a.a.createElement(a.a.Fragment,null,o.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,o.length," Sources"),a.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",i.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,i.length," Transforms"),a.a.createElement("div",{className:"qovery-components--grid"},i.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",f.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,f.length," Sinks"),a.a.createElement("div",{className:"qovery-components--grid"},f.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",a.a.createElement("hr",null),a.a.createElement(l.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):a.a.createElement(c.a,{text:"no components found"})}t.a=function(e){var t=Object(g.a)().siteConfig.customFields.metadata,n=t.sources,u=t.transforms,d=t.sinks,o=e.titles||null==e.titles,c=1==e.filterColumn,l=e.pathTemplate,s=e.location?v.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(n))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(u))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(d))),m=m.sort((function(e,t){return e.name>t.name?1:-1}));var b=Object(r.useState)("true"==s["at-least-once"]),y=b[0],E=b[1],w=Object(r.useState)(new Set(s["event-types"]||e.eventTypes)),D=w[0],k=w[1],x=Object(r.useState)(new Set(s.functions)),S=x[0],C=x[1],O=Object(r.useState)(new Set(s["operating-systems"])),I=O[0],A=O[1],j=Object(r.useState)("true"==s["prod-ready"]),N=j[0],F=j[1],T=Object(r.useState)(new Set(s.providers)),P=T[0],M=T[1],R=Object(r.useState)(s.search),L=R[0],B=R[1];L&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(L.toLowerCase())}))),y&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),D.size>0&&(m=m.filter((function(e){return Array.from(D).some((function(t){return e.event_types.includes(t)}))}))),S.size>0&&(m=m.filter((function(e){return S.has(e.function_category)}))),I.size>0&&(m=m.filter((function(e){return Array.from(I).every((function(t){return e.operating_systems.includes(t)}))}))),N&&(m=m.filter((function(e){return"prod-ready"==e.status}))),P.size>0&&(m=m.filter((function(e){return Array.from(P).every((function(t){return e.service_providers&&e.service_providers.includes(t)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(t){return!e.exceptNames.includes(t.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(t){return!e.exceptFunctions.includes(t.function_category)})));var z=D.size>0?D:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),U=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),H=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return a.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":c})},a.a.createElement("div",{className:"filters"},a.a.createElement("div",{className:"search"},a.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return B(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Event Types",icon:"database",values:z,humanize:!0,currentState:D,setState:k}))),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return E(e.currentTarget.checked)},checked:y}),a.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),a.a.createElement("label",{title:"Show only production ready components."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return F(e.currentTarget.checked)},checked:N}),a.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),H.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Source Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:H,humanize:!0,currentState:S,setState:C}))),$.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Transform Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:S,setState:C}))),q.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Sink Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:S,setState:C}))),W.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Providers"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Providers",icon:"cloud",values:W,currentState:P,setState:M}))),U.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Operating Systems",icon:"cpu",values:U,currentState:I,setState:A})))),a.a.createElement("div",{className:"qovery-components--results"},a.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:l,titles:o})))}},563:function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var u=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},a=n(0),d={Prism:u.a,theme:r};function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},s=function(e,t){var n=e.plain,u=Object.create(null),r=e.styles.reduce((function(e,n){var u=n.languages,r=n.style;return u&&!u.includes(t)||n.types.forEach((function(t){var n=i({},e[t],r);e[t]=n})),e}),u);return r.root=n,r.plain=i({},n,{backgroundColor:null}),r};function p(e,t){var n={};for(var u in e)Object.prototype.hasOwnProperty.call(e,u)&&-1===t.indexOf(u)&&(n[u]=e[u]);return n}var m=function(e){function t(){for(var t=this,n=[],u=arguments.length;u--;)n[u]=arguments[u];e.apply(this,n),o(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?s(e.theme,e.language):void 0;return t.themeDict=n})),o(this,"getLineProps",(function(e){var n=e.key,u=e.className,r=e.style,a=i({},p(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),d=t.getThemeDict(t.props);return void 0!==d&&(a.style=d.plain),void 0!==r&&(a.style=void 0!==a.style?i({},a.style,r):r),void 0!==n&&(a.key=n),u&&(a.className+=" "+u),a})),o(this,"getStyleForToken",(function(e){var n=e.types,u=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return u?{display:"inline-block"}:void 0;if(1===r&&!u)return a[n[0]];var d=u?{display:"inline-block"}:{},o=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[d].concat(o))}})),o(this,"getTokenProps",(function(e){var n=e.key,u=e.className,r=e.style,a=e.token,d=i({},p(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(d.style=void 0!==d.style?i({},d.style,r):r),void 0!==n&&(d.key=n),u&&(d.className+=" "+u),d}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,u=e.code,r=e.children,a=this.getThemeDict(this.props),d=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],u=[0],r=[e.length],a=0,d=0,o=[],i=[o];d>-1;){for(;(a=u[d]++)0?p:["plain"],s=m):(p=f(p,m.type),m.alias&&(p=f(p,m.alias)),s=m.content),"string"==typeof s){var h=s.split(c),b=h.length;o.push({types:p,content:h[0]});for(var v=1;v=0)&&a(e,!n)}e.exports=t.default},568:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assertNodeList=i,t.setElement=function(e){var t=e;if("string"==typeof t&&d.canUseDOM){var n=document.querySelectorAll(t);i(n,t),t="length"in n?n[0]:n}return o=t||o},t.validateElement=c,t.hide=function(e){c(e)&&(e||o).setAttribute("aria-hidden","true")},t.show=function(e){c(e)&&(e||o).removeAttribute("aria-hidden")},t.documentNotReadyOrSSRTesting=function(){o=null},t.resetForTesting=function(){o=null};var u,r=n(593),a=(u=r)&&u.__esModule?u:{default:u},d=n(544);var o=null;function i(e,t){if(!e||!e.length)throw new Error("react-modal: No elements were found for selector "+t+".")}function c(e){return!(!e&&!o)||((0,a.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),!1)}},569:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=new function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit("register"))},this.deregister=function(e){var n=t.openInstances.indexOf(e);-1!==n&&(t.openInstances.splice(n,1),t.emit("deregister"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(n){return n(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]};t.default=u,e.exports=t.default},588:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u,r=n(589),a=(u=r)&&u.__esModule?u:{default:u};t.default=a.default,e.exports=t.default},589:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var u=Object.assign||function(e){for(var t=1;t0&&0===(g-=1)&&f.show(t),n.props.shouldFocusAfterRender&&(n.props.shouldReturnFocusAfterClose?(c.returnFocus(),c.teardownScopedFocus()):c.popWithoutFocus()),n.props.onAfterClose&&n.props.onAfterClose(),m.default.deregister(n)},n.open=function(){n.beforeOpen(),n.state.afterOpen&&n.state.beforeClose?(clearTimeout(n.closeTimer),n.setState({beforeClose:!1})):(n.props.shouldFocusAfterRender&&(c.setupScopedFocus(n.node),c.markForFocusLater()),n.setState({isOpen:!0},(function(){n.setState({afterOpen:!0}),n.props.isOpen&&n.props.onAfterOpen&&n.props.onAfterOpen({overlayEl:n.overlay,contentEl:n.content})})))},n.close=function(){n.props.closeTimeoutMS>0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus()},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},(function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())}))},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){9===e.keyCode&&(0,l.default)(n.content,e),n.props.shouldCloseOnEsc&&27===e.keyCode&&(e.stopPropagation(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnMouseUp=function(){n.shouldClose=!1},n.handleOverlayOnMouseDown=function(e){n.props.shouldCloseOnOverlayClick||e.target!=n.overlay||e.preventDefault()},n.handleContentOnClick=function(){n.shouldClose=!1},n.handleContentOnMouseDown=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var u="object"===(void 0===t?"undefined":r(t))?t:{base:v[e],afterOpen:v[e]+"--after-open",beforeClose:v[e]+"--before-close"},a=u.base;return n.state.afterOpen&&(a=a+" "+u.afterOpen),n.state.beforeClose&&(a=a+" "+u.beforeClose),"string"==typeof t&&t?a+" "+t:a},n.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(n,u){return n[e+"-"+u]=t[u],n}),{})},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n.moveFromContentToOverlay=null,n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&this.open()}},{key:"componentDidUpdate",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:"componentWillUnmount",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer)}},{key:"beforeOpen",value:function(){var e=this.props,t=e.appElement,n=e.ariaHideApp,u=e.htmlOpenClassName,r=e.bodyOpenClassName;r&&s.add(document.body,r),u&&s.add(document.getElementsByTagName("html")[0],u),n&&(g+=1,f.hide(t)),m.default.register(this)}},{key:"render",value:function(){var e=this.props,t=e.id,n=e.className,r=e.overlayClassName,a=e.defaultStyles,d=n?{}:a.content,i=r?{}:a.overlay;return this.shouldBeClosed()?null:o.default.createElement("div",{ref:this.setOverlayRef,className:this.buildClassName("overlay",r),style:u({},i,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},o.default.createElement("div",u({id:t,ref:this.setContentRef,style:u({},d,this.props.style.content),className:this.buildClassName("content",n),tabIndex:"-1",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.attributesFromObject("aria",this.props.aria||{}),this.attributesFromObject("data",this.props.data||{}),{"data-testid":this.props.testId}),this.props.children))}}]),t}(d.Component);y.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},y.propTypes={isOpen:i.default.bool.isRequired,defaultStyles:i.default.shape({content:i.default.object,overlay:i.default.object}),style:i.default.shape({content:i.default.object,overlay:i.default.object}),className:i.default.oneOfType([i.default.string,i.default.object]),overlayClassName:i.default.oneOfType([i.default.string,i.default.object]),bodyOpenClassName:i.default.string,htmlOpenClassName:i.default.string,ariaHideApp:i.default.bool,appElement:i.default.instanceOf(p.default),onAfterOpen:i.default.func,onAfterClose:i.default.func,onRequestClose:i.default.func,closeTimeoutMS:i.default.number,shouldFocusAfterRender:i.default.bool,shouldCloseOnOverlayClick:i.default.bool,shouldReturnFocusAfterClose:i.default.bool,role:i.default.string,contentLabel:i.default.string,aria:i.default.object,data:i.default.object,children:i.default.node,shouldCloseOnEsc:i.default.bool,overlayRef:i.default.func,contentRef:i.default.func,id:i.default.string,testId:i.default.string},t.default=y,e.exports=t.default},591:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=c,t.handleFocus=l,t.markForFocusLater=function(){d.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return void(0!==d.length&&(e=d.pop()).focus())}catch(t){console.warn(["You tried to return focus to",e,"but it is not in the DOM anymore"].join(" "))}},t.popWithoutFocus=function(){d.length>0&&d.pop()},t.setupScopedFocus=function(e){o=e,window.addEventListener?(window.addEventListener("blur",c,!1),document.addEventListener("focus",l,!0)):(window.attachEvent("onBlur",c),document.attachEvent("onFocus",l))},t.teardownScopedFocus=function(){o=null,window.addEventListener?(window.removeEventListener("blur",c),document.removeEventListener("focus",l)):(window.detachEvent("onBlur",c),document.detachEvent("onFocus",l))};var u,r=n(567),a=(u=r)&&u.__esModule?u:{default:u};var d=[],o=null,i=!1;function c(){i=!0}function l(){if(i){if(i=!1,!o)return;setTimeout((function(){o.contains(document.activeElement)||((0,a.default)(o)[0]||o).focus()}),0)}}},592:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=(0,a.default)(e);if(!n.length)return void t.preventDefault();var u=void 0,r=t.shiftKey,d=n[0],o=n[n.length-1];if(e===document.activeElement){if(!r)return;u=o}o!==document.activeElement||r||(u=d);d===document.activeElement&&r&&(u=o);if(u)return t.preventDefault(),void u.focus();var i=/(\bChrome\b|\bSafari\b)\//.exec(navigator.userAgent);if(null==i||"Chrome"==i[1]||null!=/\biPod\b|\biPad\b/g.exec(navigator.userAgent))return;var c=n.indexOf(document.activeElement);c>-1&&(c+=r?-1:1);if(void 0===(u=n[c]))return t.preventDefault(),void(u=r?o:d).focus();t.preventDefault(),u.focus()};var u,r=n(567),a=(u=r)&&u.__esModule?u:{default:u};e.exports=t.default},593:function(e,t,n){"use strict";var u=function(){};e.exports=u},594:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dumpClassLists=function(){0};var u={},r={};t.add=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(a,e),n.add(e)}));var n,a},t.remove=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(a,e),0===a[e]&&n.remove(e)}));var n,a}},595:function(e,t,n){"use strict";var u,r=n(569),a=(u=r)&&u.__esModule?u:{default:u};var d=void 0,o=void 0,i=[];function c(){0!==i.length&&i[i.length-1].focusContent()}a.default.subscribe((function(e,t){d&&o||((d=document.createElement("div")).setAttribute("data-react-modal-body-trap",""),d.style.position="absolute",d.style.opacity="0",d.setAttribute("tabindex","0"),d.addEventListener("focus",c),(o=d.cloneNode()).addEventListener("focus",c)),(i=t).length>0?(document.body.firstChild!==d&&document.body.insertBefore(d,document.body.firstChild),document.body.lastChild!==o&&document.body.appendChild(o)):(d.parentElement&&d.parentElement.removeChild(d),o.parentElement&&o.parentElement.removeChild(o))}))},596:function(e,t,n){"use strict";function u(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function r(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function a(e,t){try{var n=this.props,u=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,u)}finally{this.props=n,this.state=u}}function d(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,d=null,o=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?d="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(d="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?o="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(o="UNSAFE_componentWillUpdate"),null!==n||null!==d||null!==o){var i=e.displayName||e.name,c="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+c+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==d?"\n "+d:"")+(null!==o?"\n "+o:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=u,t.componentWillReceiveProps=r),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=a;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var u=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,u)}}return e}n.r(t),n.d(t,"polyfill",(function(){return d})),u.__suppressDeprecationWarning=!0,r.__suppressDeprecationWarning=!0,a.__suppressDeprecationWarning=!0},597:function(e,t,n){var u;!function(r){"use strict";var a,d,o,i=(a=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,d=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,o=/[^-+\dA-Z]/g,function(e,t,n,u){if(1!==arguments.length||"string"!==s(e)||/\d/.test(e)||(t=e,e=void 0),(e=e||new Date)instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");var r=(t=String(i.masks[t]||t||i.masks.default)).slice(0,4);"UTC:"!==r&&"GMT:"!==r||(t=t.slice(4),n=!0,"GMT:"===r&&(u=!0));var p=n?"getUTC":"get",m=e[p+"Date"](),h=e[p+"Day"](),b=e[p+"Month"](),v=e[p+"FullYear"](),g=e[p+"Hours"](),y=e[p+"Minutes"](),_=e[p+"Seconds"](),E=e[p+"Milliseconds"](),w=n?0:e.getTimezoneOffset(),D=l(e),k=f(e),x={d:m,dd:c(m),ddd:i.i18n.dayNames[h],dddd:i.i18n.dayNames[h+7],m:b+1,mm:c(b+1),mmm:i.i18n.monthNames[b],mmmm:i.i18n.monthNames[b+12],yy:String(v).slice(2),yyyy:v,h:g%12||12,hh:c(g%12||12),H:g,HH:c(g),M:y,MM:c(y),s:_,ss:c(_),l:c(E,3),L:c(Math.round(E/10)),t:g<12?i.i18n.timeNames[0]:i.i18n.timeNames[1],tt:g<12?i.i18n.timeNames[2]:i.i18n.timeNames[3],T:g<12?i.i18n.timeNames[4]:i.i18n.timeNames[5],TT:g<12?i.i18n.timeNames[6]:i.i18n.timeNames[7],Z:u?"GMT":n?"UTC":(String(e).match(d)||[""]).pop().replace(o,""),o:(w>0?"-":"+")+c(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),S:["th","st","nd","rd"][m%10>3?0:(m%100-m%10!=10)*m%10],W:D,N:k};return t.replace(a,(function(e){return e in x?x[e]:e.slice(1,e.length-1)}))});function c(e,t){for(e=String(e),t=t||2;e.length/":G?V="/guides/integrate/sources/"+G.name+"//":H&&(V="/guides/integrate/sinks//");var K=H?"/guides/integrate/sources//"+H.name+"/":"/guides/integrate/sources//",Z=Object(u.useState)(!1),J=Z[0],Y=Z[1],Q=Object(u.useState)(!1),X=Q[0],ee=Q[1];return Object(O.a)("contents__link","contents__link--active",100),r.a.createElement(l.a,{title:v,description:v+", in minutes, for free"},J&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return Y(!1)},overlayClassName:"modal-overlay",isOpen:null!==J,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you receive your data from?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[G&&G.name,"docker","qovery"],eventTypes:H&&H.event_types,pathTemplate:K,titles:!1,sources:!0,transforms:!1,sinks:!1})),X&&r.a.createElement(p.a,{className:"modal",onRequestClose:function(){return ee(!1)},overlayClassName:"modal-overlay",isOpen:null!==X,contentLabel:"Minimal Modal Example"},r.a.createElement("header",null,r.a.createElement("h1",null,"Where do you want to send your data?")),r.a.createElement(_.a,{exceptFunctions:["test"],exceptNames:[H&&H.name,"qovery"],eventTypes:G&&G.event_types,pathTemplate:V,titles:!1,sources:!1,transforms:!1,sinks:!0})),r.a.createElement("header",{className:"hero domain-bg domain-bg--"+M},r.a.createElement("div",{className:"container"},(z||G||H)&&r.a.createElement("div",{className:"component-icons"},z&&r.a.createElement("div",{className:"icon panel"},z.logo_path?r.a.createElement(g.a,{src:z.logo_path,alt:z.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Change your source",onClick:function(e){return Y(!0)}},G.logo_path?r.a.createElement(g.a,{src:G.logo_path,alt:G.title+" Logo"}):r.a.createElement("i",{className:"feather icon-server"})),!G&&!z&&r.a.createElement("div",{className:"icon panel link",title:"Select a source",onClick:function(e){return Y(!0)}},r.a.createElement("i",{className:"feather icon-plus"})),H&&r.a.createElement("div",{className:"icon panel link",title:"Change your destination",onClick:function(e){return ee(!0)}},H.logo_path?r.a.createElement(g.a,{src:H.logo_path,alt:H.title+" Logo"}):r.a.createElement("i",{className:"feather icon-database"})),!H&&r.a.createElement("div",{className:"icon panel link",title:"Select a destination",onClick:function(e){return ee(!0)}},r.a.createElement("i",{className:"feather icon-plus"}))),!z&&!G&&!H&&r.a.createElement("div",{className:"hero--category"},r.a.createElement(f.a,{to:E[0].permalink+"/"},E[0].name)),r.a.createElement("h1",{className:C.a.header},v),r.a.createElement("div",{className:"hero--subtitle"},n.description),r.a.createElement(y.a,{colorProfile:"guides",tags:D}))),r.a.createElement("main",{className:d()("container","container--l",C.a.container)},r.a.createElement("aside",{className:C.a.sidebar},r.a.createElement("section",{className:C.a.avatar},r.a.createElement(i,{bio:!0,github:c,size:"lg",rel:"author",subTitle:!1,vertical:!0})),r.a.createElement("section",{className:d()("table-of-contents",C.a.tableOfContents)},r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Stats"),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-book"})," ",w),r.a.createElement("div",{className:"text--secondary text--bold"},r.a.createElement("i",{className:"feather icon-clock"})," Updated ",r.a.createElement("time",{pubdate:"pubdate",dateTime:s},k()(R,"mmm dS, yyyy")))),t.rightToc.length>0&&r.a.createElement("div",{className:"section"},r.a.createElement("div",{className:"title"},"Contents"),r.a.createElement(I,{headings:t.rightToc})))),r.a.createElement("div",{className:C.a.article},r.a.createElement("article",null,r.a.createElement("div",{className:"markdown"},r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"anchor",id:"overview"}),r.a.createElement(h.a,{components:m.a},r.a.createElement(t,null)))),!n.hide_pagination&&r.a.createElement(b.a,{previous:a.prevItem,next:a.nextItem,className:C.a.paginator}))))}},424:function(e,t,n){"use strict";n(426);var u=n(0),r=n.n(u),a=n(423),d=n.n(a);n(132);t.a=function(e){var t=e.children,n=e.classNames,u=e.fill,a=e.icon,o=e.type,i=null;switch(o){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return r.a.createElement("div",{className:d()(n,"alert","alert--"+o,{"alert--fill":u,"alert--icon":!1!==a}),role:"alert"},!1!==a&&r.a.createElement("i",{className:d()("feather","icon-"+(a||i))}),t)}},428:function(e,t,n){var u=n(28).f,r=Function.prototype,a=/^\s*function ([^ (]*)/;"name"in r||n(10)&&u(r,"name",{configurable:!0,get:function(){try{return(""+this).match(a)[1]}catch(e){return""}}})},431:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);n(133);t.a=function(e){var t=e.children,n=e.className,u=e.badge,d=e.leftIcon,i=e.rightIcon,c=e.size,l=e.target,f=e.to,s=o()("jump-to","jump-to--"+c,n),p=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},d&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+d})),r.a.createElement("div",{className:"jump-to--main"},u?r.a.createElement("span",{className:"badge badge--primary badge--right"},u):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return l?r.a.createElement("a",{href:f,target:l,className:s},p):r.a.createElement(a.a,{to:f,className:s},p)}},437:function(e,t,n){"use strict";var u=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),a=n.n(r),d=n(447),o=n(423),i=n.n(o),c=n(433),l=n.n(c),f=n(446),s=37,p=39;function m(e){var t=e.block,n=e.centered,u=e.changeSelectedValue,r=e.className,d=e.handleKeydown,o=e.style,c=e.values,l=e.selectedValue,f=e.tabRefs;return a.a.createElement("div",{className:n?"tabs--centered":null},a.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",r,{"tabs--block":t}),style:o},c.map((function(e){var t=e.value,n=e.label;return a.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":l===t,className:i()("tab-item",{"tab-item--active":l===t}),key:t,ref:function(e){return f.push(e)},onKeyDown:function(e){return d(f,e.target,e)},onFocus:function(){return u(t)},onClick:function(){return u(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,u=e.changeSelectedValue,r=e.size,o=e.values,i=o;if(i[0].group){var c=_.groupBy(i,"group");i=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return a.a.createElement(d.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:i,isClearable:n,placeholder:t,value:o.find((function(e){return e.value==n})),onChange:function(e){return u(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,d=e.groupId,o=e.label,i=e.placeholder,c=e.select,b=e.size,v=(e.style,e.values),g=e.urlKey,y=Object(f.a)(),_=y.tabGroupChoices,E=y.setTabGroupChoices,w=Object(r.useState)(n),D=w[0],k=w[1];if(null!=d){var x=_[d];null!=x&&x!==D&&k(x)}var S=function(e){k(e),null!=d&&E(d,e)},C=[],O=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case s:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=l.a.parse(window.location.search);e[g]&&k(e[g])}}),[]),a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:"margin-bottom--"+(b||"md")},o&&a.a.createElement("div",{className:"margin-vert--sm"},o),v.length>1&&(c?a.a.createElement(h,Object(u.a)({changeSelectedValue:S,handleKeydown:O,placeholder:i,selectedValue:D,size:b,tabRefs:C},e)):a.a.createElement(m,Object(u.a)({changeSelectedValue:S,handleKeydown:O,selectedValue:D,tabRefs:C},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===D}))[0])}},441:function(e,t,n){"use strict";var u=n(0),r=n(485);t.a=function(){return Object(u.useContext)(r.a)}},443:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}},445:function(e,t,n){"use strict";n(457);var u=n(0),r=n.n(u),a=n(458),d=n(444),o=n(1),i=(n(448),n(449),n(459),n(430)),c=n(460),l=n(440),f=n.n(l),s=n(461),p=n.n(s),m=n(436),h=n(423),b=n.n(h),v=n(135),g=n.n(v),y=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.moon)})},_=function(){return r.a.createElement("span",{className:b()(g.a.toggle,g.a.sun)})},E=function(e){var t=Object(m.a)().isClient;return r.a.createElement(p.a,Object(o.a)({disabled:!t,icons:{checked:r.a.createElement(y,null),unchecked:r.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,t=(void 0===e?{}:e).customFields.metadata.latest_post,n=Date.parse(t.date),u=new Date,r=Math.abs(u-n),a=Math.ceil(r/864e5),d=null;return"undefined"!=typeof window&&(d=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),a<30&&(!d||d0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(f.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(M,e))}))):null)}))),(l||d)&&r.a.createElement("div",{className:"text--center"},l&&l.src&&r.a.createElement("div",{className:"margin-bottom--sm"},l.href?r.a.createElement("a",{href:l.href,target:"_blank",rel:"noopener noreferrer",className:P.a.footerLogoLink},r.a.createElement(R,{alt:l.alt,url:s})):r.a.createElement(R,{alt:l.alt,url:s})),r.a.createElement("small",null,d),r.a.createElement("br",null))))},B=n(462),z=n(463),U=n(3);n(138);t.a=function(e){var t=Object(m.a)().siteConfig,n=void 0===t?{}:t,u=n.favicon,o=(n.tagline,n.title),i=n.themeConfig.image,c=n.url,l=e.children,f=e.title,s=e.noFooter,p=e.description,h=e.image,b=e.keywords,v=(e.permalink,e.version),g=f?f+" | "+o:o,y=h||i,_=c+Object(k.a)(y),E=Object(k.a)(u),w=Object(U.h)(),D=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(z.a,null,r.a.createElement(B.a,null,r.a.createElement(d.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),g&&r.a.createElement("title",null,g),g&&r.a.createElement("meta",{property:"og:title",content:g}),u&&r.a.createElement("link",{rel:"shortcut icon",href:E}),p&&r.a.createElement("meta",{name:"description",content:p}),p&&r.a.createElement("meta",{property:"og:description",content:p}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),b&&b.length&&r.a.createElement("meta",{name:"keywords",content:b.join(",")}),y&&r.a.createElement("meta",{property:"og:image",content:_}),y&&r.a.createElement("meta",{property:"twitter:image",content:_}),y&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+g}),D&&r.a.createElement("meta",{property:"og:url",content:D}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),D&&r.a.createElement("link",{rel:"canonical",href:D})),r.a.createElement(a.a,null),r.a.createElement(N,null),r.a.createElement("div",{className:"main-wrapper"},l),!s&&r.a.createElement(L,null)))}},450:function(e,t,n){"use strict";var u=n(9),r=n(0),a=n.n(r),d=n(423),o=n.n(d),i=n(436),c=(n(139),n(140)),l=n.n(c);t.a=function(e){return function(t){var n,r=t.id,d=Object(u.a)(t,["id"]),c=Object(i.a)().siteConfig,f=(c=void 0===c?{}:c).themeConfig,s=(f=void 0===f?{}:f).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return r?a.a.createElement(e,d,a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(n={},n[l.a.enhancedAnchor]=!m,n)),id:r}),a.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),d.children):a.a.createElement(e,d)}}},451:function(e,t,n){(function(e,u){var r;(function(){var a="Expected a function",d="__lodash_placeholder__",o=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],i="[object Arguments]",c="[object Array]",l="[object Boolean]",f="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",g="[object RegExp]",y="[object Set]",_="[object String]",E="[object Symbol]",w="[object WeakMap]",D="[object ArrayBuffer]",k="[object DataView]",x="[object Float32Array]",S="[object Float64Array]",C="[object Int8Array]",O="[object Int16Array]",I="[object Int32Array]",A="[object Uint8Array]",j="[object Uint16Array]",N="[object Uint32Array]",F=/\b__p \+= '';/g,T=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,M=/&(?:amp|lt|gt|quot|#39);/g,R=/[&<>"']/g,L=RegExp(M.source),B=RegExp(R.source),z=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,H=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,G=/[\\^$.*+?()[\]{}|]/g,V=RegExp(G.source),K=/^\s+|\s+$/g,Z=/^\s+/,J=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,te=/\\(\\)?/g,ne=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ue=/\w*$/,re=/^[-+]0x[0-9a-f]+$/i,ae=/^0b[01]+$/i,de=/^\[object .+?Constructor\]$/,oe=/^0o[0-7]+$/i,ie=/^(?:0|[1-9]\d*)$/,ce=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,le=/($^)/,fe=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",be="["+se+"]",ve="\\d+",ge="[\\u2700-\\u27bf]",ye="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+ve+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",Ee="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",De="(?:\\ud83c[\\udde6-\\uddff]){2}",ke="[\\ud800-\\udbff][\\udc00-\\udfff]",xe="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Se="(?:"+ye+"|"+_e+")",Ce="(?:"+xe+"|"+_e+")",Oe="(?:"+be+"|"+Ee+")"+"?",Ie="[\\ufe0e\\ufe0f]?"+Oe+("(?:\\u200d(?:"+[we,De,ke].join("|")+")[\\ufe0e\\ufe0f]?"+Oe+")*"),Ae="(?:"+[ge,De,ke].join("|")+")"+Ie,je="(?:"+[we+be+"?",be,De,ke,me].join("|")+")",Ne=RegExp("['\u2019]","g"),Fe=RegExp(be,"g"),Te=RegExp(Ee+"(?="+Ee+")|"+je+Ie,"g"),Pe=RegExp([xe+"?"+ye+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,xe,"$"].join("|")+")",Ce+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,xe+Se,"$"].join("|")+")",xe+"?"+Se+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",xe+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ve,Ae].join("|"),"g"),Me=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Re=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Le=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Be=-1,ze={};ze[x]=ze[S]=ze[C]=ze[O]=ze[I]=ze[A]=ze["[object Uint8ClampedArray]"]=ze[j]=ze[N]=!0,ze[i]=ze[c]=ze[D]=ze[l]=ze[k]=ze[f]=ze[s]=ze[p]=ze[h]=ze[b]=ze[v]=ze[g]=ze[y]=ze[_]=ze[w]=!1;var Ue={};Ue[i]=Ue[c]=Ue[D]=Ue[k]=Ue[l]=Ue[f]=Ue[x]=Ue[S]=Ue[C]=Ue[O]=Ue[I]=Ue[h]=Ue[b]=Ue[v]=Ue[g]=Ue[y]=Ue[_]=Ue[E]=Ue[A]=Ue["[object Uint8ClampedArray]"]=Ue[j]=Ue[N]=!0,Ue[s]=Ue[p]=Ue[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},He=parseFloat,$e=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,Ge="object"==typeof self&&self&&self.Object===Object&&self,Ve=qe||Ge||Function("return this")(),Ke=t&&!t.nodeType&&t,Ze=Ke&&"object"==typeof u&&u&&!u.nodeType&&u,Je=Ze&&Ze.exports===Ke,Ye=Je&&qe.process,Qe=function(){try{var e=Ze&&Ze.require&&Ze.require("util").types;return e||Ye&&Ye.binding&&Ye.binding("util")}catch(t){}}(),Xe=Qe&&Qe.isArrayBuffer,et=Qe&&Qe.isDate,tt=Qe&&Qe.isMap,nt=Qe&&Qe.isRegExp,ut=Qe&&Qe.isSet,rt=Qe&&Qe.isTypedArray;function at(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function dt(e,t,n,u){for(var r=-1,a=null==e?0:e.length;++r-1}function st(e,t,n){for(var u=-1,r=null==e?0:e.length;++u-1;);return n}function Tt(e,t){for(var n=e.length;n--&&Et(t,e[n],0)>-1;);return n}function Pt(e,t){for(var n=e.length,u=0;n--;)e[n]===t&&++u;return u}var Mt=St({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Rt=St({"&":"&","<":"<",">":">",'"':""","'":"'"});function Lt(e){return"\\"+We[e]}function Bt(e){return Me.test(e)}function zt(e){var t=-1,n=Array(e.size);return e.forEach((function(e,u){n[++t]=[u,e]})),n}function Ut(e,t){return function(n){return e(t(n))}}function Wt(e,t){for(var n=-1,u=e.length,r=0,a=[];++n",""":'"',"'":"'"});var Kt=function e(t){var n,u=(t=null==t?Ve:Kt.defaults(Ve.Object(),t,Kt.pick(Ve,Le))).Array,r=t.Date,se=t.Error,pe=t.Function,me=t.Math,he=t.Object,be=t.RegExp,ve=t.String,ge=t.TypeError,ye=u.prototype,_e=pe.prototype,Ee=he.prototype,we=t["__core-js_shared__"],De=_e.toString,ke=Ee.hasOwnProperty,xe=0,Se=(n=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",Ce=Ee.toString,Oe=De.call(he),Ie=Ve._,Ae=be("^"+De.call(ke).replace(G,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),je=Je?t.Buffer:void 0,Te=t.Symbol,Me=t.Uint8Array,We=je?je.allocUnsafe:void 0,qe=Ut(he.getPrototypeOf,he),Ge=he.create,Ke=Ee.propertyIsEnumerable,Ze=ye.splice,Ye=Te?Te.isConcatSpreadable:void 0,Qe=Te?Te.iterator:void 0,gt=Te?Te.toStringTag:void 0,St=function(){try{var e=Xr(he,"defineProperty");return e({},"",{}),e}catch(t){}}(),Zt=t.clearTimeout!==Ve.clearTimeout&&t.clearTimeout,Jt=r&&r.now!==Ve.Date.now&&r.now,Yt=t.setTimeout!==Ve.setTimeout&&t.setTimeout,Qt=me.ceil,Xt=me.floor,en=he.getOwnPropertySymbols,tn=je?je.isBuffer:void 0,nn=t.isFinite,un=ye.join,rn=Ut(he.keys,he),an=me.max,dn=me.min,on=r.now,cn=t.parseInt,ln=me.random,fn=ye.reverse,sn=Xr(t,"DataView"),pn=Xr(t,"Map"),mn=Xr(t,"Promise"),hn=Xr(t,"Set"),bn=Xr(t,"WeakMap"),vn=Xr(he,"create"),gn=bn&&new bn,yn={},_n=Sa(sn),En=Sa(pn),wn=Sa(mn),Dn=Sa(hn),kn=Sa(bn),xn=Te?Te.prototype:void 0,Sn=xn?xn.valueOf:void 0,Cn=xn?xn.toString:void 0;function On(e){if(Hd(e)&&!Nd(e)&&!(e instanceof Nn)){if(e instanceof jn)return e;if(ke.call(e,"__wrapped__"))return Ca(e)}return new jn(e)}var In=function(){function e(){}return function(t){if(!Wd(t))return{};if(Ge)return Ge(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();function An(){}function jn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Nn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Fn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Jn(e,t,n,u,r,a){var d,o=1&t,c=2&t,s=4&t;if(n&&(d=r?n(e,u,r,a):n(e)),void 0!==d)return d;if(!Wd(e))return e;var w=Nd(e);if(w){if(d=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&ke.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!o)return vr(e,d)}else{var F=na(e),T=F==p||F==m;if(Md(e))return fr(e,o);if(F==v||F==i||T&&!r){if(d=c||T?{}:ra(e),!o)return c?function(e,t){return gr(e,ta(e),t)}(e,function(e,t){return e&&gr(t,Eo(t),e)}(d,e)):function(e,t){return gr(e,ea(e),t)}(e,Gn(d,e))}else{if(!Ue[F])return r?e:{};d=function(e,t,n){var u=e.constructor;switch(t){case D:return sr(e);case l:case f:return new u(+e);case k:return function(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case x:case S:case C:case O:case I:case A:case"[object Uint8ClampedArray]":case j:case N:return pr(e,n);case h:return new u;case b:case _:return new u(e);case g:return function(e){var t=new e.constructor(e.source,ue.exec(e));return t.lastIndex=e.lastIndex,t}(e);case y:return new u;case E:return r=e,Sn?he(Sn.call(r)):{}}var r}(e,F,o)}}a||(a=new Rn);var P=a.get(e);if(P)return P;a.set(e,d),Kd(e)?e.forEach((function(u){d.add(Jn(u,t,n,u,e,a))})):$d(e)&&e.forEach((function(u,r){d.set(r,Jn(u,t,n,r,e,a))}));var M=w?void 0:(s?c?Gr:qr:c?Eo:_o)(e);return ot(M||e,(function(u,r){M&&(u=e[r=u]),Hn(d,r,Jn(u,t,n,r,e,a))})),d}function Yn(e,t,n){var u=n.length;if(null==e)return!u;for(e=he(e);u--;){var r=n[u],a=t[r],d=e[r];if(void 0===d&&!(r in e)||!a(d))return!1}return!0}function Qn(e,t,n){if("function"!=typeof e)throw new ge(a);return ya((function(){e.apply(void 0,n)}),t)}function Xn(e,t,n,u){var r=-1,a=ft,d=!0,o=e.length,i=[],c=t.length;if(!o)return i;n&&(t=pt(t,At(n))),u?(a=st,d=!1):t.length>=200&&(a=Nt,d=!1,t=new Mn(t));e:for(;++r-1},Tn.prototype.set=function(e,t){var n=this.__data__,u=$n(n,e);return u<0?(++this.size,n.push([e,t])):n[u][1]=t,this},Pn.prototype.clear=function(){this.size=0,this.__data__={hash:new Fn,map:new(pn||Tn),string:new Fn}},Pn.prototype.delete=function(e){var t=Yr(this,e).delete(e);return this.size-=t?1:0,t},Pn.prototype.get=function(e){return Yr(this,e).get(e)},Pn.prototype.has=function(e){return Yr(this,e).has(e)},Pn.prototype.set=function(e,t){var n=Yr(this,e),u=n.size;return n.set(e,t),this.size+=n.size==u?0:1,this},Mn.prototype.add=Mn.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Mn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Rn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Rn.prototype.get=function(e){return this.__data__.get(e)},Rn.prototype.has=function(e){return this.__data__.has(e)},Rn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Tn){var u=n.__data__;if(!pn||u.length<199)return u.push([e,t]),this.size=++n.size,this;n=this.__data__=new Pn(u)}return n.set(e,t),this.size=n.size,this};var eu=Er(iu),tu=Er(cu,!0);function nu(e,t){var n=!0;return eu(e,(function(e,u,r){return n=!!t(e,u,r)})),n}function uu(e,t,n){for(var u=-1,r=e.length;++u0&&n(o)?t>1?au(o,t-1,n,u,r):mt(r,o):u||(r[r.length]=o)}return r}var du=wr(),ou=wr(!0);function iu(e,t){return e&&du(e,t,_o)}function cu(e,t){return e&&ou(e,t,_o)}function lu(e,t){return lt(t,(function(t){return Bd(e[t])}))}function fu(e,t){for(var n=0,u=(t=or(t,e)).length;null!=e&&nt}function hu(e,t){return null!=e&&ke.call(e,t)}function bu(e,t){return null!=e&&t in he(e)}function vu(e,t,n){for(var r=n?st:ft,a=e[0].length,d=e.length,o=d,i=u(d),c=1/0,l=[];o--;){var f=e[o];o&&t&&(f=pt(f,At(t))),c=dn(f.length,c),i[o]=!n&&(t||a>=120&&f.length>=120)?new Mn(o&&f):void 0}f=e[0];var s=-1,p=i[0];e:for(;++s=o)return i;var c=n[u];return i*("desc"==c?-1:1)}}return e.index-t.index}(e,t,n)}))}function Fu(e,t,n){for(var u=-1,r=t.length,a={};++u-1;)o!==e&&Ze.call(o,i,1),Ze.call(e,i,1);return e}function Pu(e,t){for(var n=e?t.length:0,u=n-1;n--;){var r=t[n];if(n==u||r!==a){var a=r;da(r)?Ze.call(e,r,1):Xu(e,r)}}return e}function Mu(e,t){return e+Xt(ln()*(t-e+1))}function Ru(e,t){var n="";if(!e||t<1||t>9007199254740991)return n;do{t%2&&(n+=e),(t=Xt(t/2))&&(e+=e)}while(t);return n}function Lu(e,t){return _a(ma(e,t,Go),e+"")}function Bu(e){return Bn(Io(e))}function zu(e,t){var n=Io(e);return Da(n,Zn(t,0,n.length))}function Uu(e,t,n,u){if(!Wd(e))return e;for(var r=-1,a=(t=or(t,e)).length,d=a-1,o=e;null!=o&&++ra?0:a+t),(n=n>a?a:n)<0&&(n+=a),a=t>n?0:n-t>>>0,t>>>=0;for(var d=u(a);++r>>1,d=e[a];null!==d&&!Jd(d)&&(n?d<=t:d=200){var c=t?null:Rr(e);if(c)return Ht(c);d=!1,r=Nt,i=new Mn}else i=t?[]:o;e:for(;++u=u?e:qu(e,t,n)}var lr=Zt||function(e){return Ve.clearTimeout(e)};function fr(e,t){if(t)return e.slice();var n=e.length,u=We?We(n):new e.constructor(n);return e.copy(u),u}function sr(e){var t=new e.constructor(e.byteLength);return new Me(t).set(new Me(e)),t}function pr(e,t){var n=t?sr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function mr(e,t){if(e!==t){var n=void 0!==e,u=null===e,r=e==e,a=Jd(e),d=void 0!==t,o=null===t,i=t==t,c=Jd(t);if(!o&&!c&&!a&&e>t||a&&d&&i&&!o&&!c||u&&d&&i||!n&&i||!r)return 1;if(!u&&!a&&!c&&e1?n[r-1]:void 0,d=r>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(r--,a):void 0,d&&oa(n[0],n[1],d)&&(a=r<3?void 0:a,r=1),t=he(t);++u-1?r[a?t[d]:d]:void 0}}function Cr(e){return $r((function(t){var n=t.length,u=n,r=jn.prototype.thru;for(e&&t.reverse();u--;){var d=t[u];if("function"!=typeof d)throw new ge(a);if(r&&!o&&"wrapper"==Kr(d))var o=new jn([],!0)}for(u=o?u:n;++u1&&y.reverse(),f&&co))return!1;var c=a.get(e);if(c&&a.get(t))return c==t;var l=-1,f=!0,s=2&n?new Mn:void 0;for(a.set(e,t),a.set(t,e);++l-1&&e%1==0&&e1?"& ":"")+t[u],t=t.join(n>2?", ":" "),e.replace(Y,"{\n/* [wrapped with "+t+"] */\n")}(u,function(e,t){return ot(o,(function(n){var u="_."+n[0];t&n[1]&&!ft(e,u)&&e.push(u)})),e.sort()}(function(e){var t=e.match(Q);return t?t[1].split(X):[]}(u),n)))}function wa(e){var t=0,n=0;return function(){var u=on(),r=16-(u-n);if(n=u,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Da(e,t){var n=-1,u=e.length,r=u-1;for(t=void 0===t?u:t;++n1?e[t-1]:void 0;return n="function"==typeof n?(e.pop(),n):void 0,Va(e,n)}));function ed(e){var t=On(e);return t.__chain__=!0,t}function td(e,t){return t(e)}var nd=$r((function(e){var t=e.length,n=t?e[0]:0,u=this.__wrapped__,r=function(t){return Kn(t,e)};return!(t>1||this.__actions__.length)&&u instanceof Nn&&da(n)?((u=u.slice(n,+n+(t?1:0))).__actions__.push({func:td,args:[r],thisArg:void 0}),new jn(u,this.__chain__).thru((function(e){return t&&!e.length&&e.push(void 0),e}))):this.thru(r)}));var ud=yr((function(e,t,n){ke.call(e,n)?++e[n]:Vn(e,n,1)}));var rd=Sr(ja),ad=Sr(Na);function dd(e,t){return(Nd(e)?ot:eu)(e,Jr(t,3))}function od(e,t){return(Nd(e)?it:tu)(e,Jr(t,3))}var id=yr((function(e,t,n){ke.call(e,n)?e[n].push(t):Vn(e,n,[t])}));var cd=Lu((function(e,t,n){var r=-1,a="function"==typeof t,d=Td(e)?u(e.length):[];return eu(e,(function(e){d[++r]=a?at(t,e,n):gu(e,t,n)})),d})),ld=yr((function(e,t,n){Vn(e,n,t)}));function fd(e,t){return(Nd(e)?pt:Cu)(e,Jr(t,3))}var sd=yr((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var pd=Lu((function(e,t){if(null==e)return[];var n=t.length;return n>1&&oa(e,t[0],t[1])?t=[]:n>2&&oa(t[0],t[1],t[2])&&(t=[t[0]]),Nu(e,au(t,1),[])})),md=Jt||function(){return Ve.Date.now()};function hd(e,t,n){return t=n?void 0:t,Br(e,128,void 0,void 0,void 0,void 0,t=e&&null==t?e.length:t)}function bd(e,t){var n;if("function"!=typeof t)throw new ge(a);return e=no(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=void 0),n}}var vd=Lu((function(e,t,n){var u=1;if(n.length){var r=Wt(n,Zr(vd));u|=32}return Br(e,u,t,n,r)})),gd=Lu((function(e,t,n){var u=3;if(n.length){var r=Wt(n,Zr(gd));u|=32}return Br(t,u,e,n,r)}));function yd(e,t,n){var u,r,d,o,i,c,l=0,f=!1,s=!1,p=!0;if("function"!=typeof e)throw new ge(a);function m(t){var n=u,a=r;return u=r=void 0,l=t,o=e.apply(a,n)}function h(e){return l=e,i=ya(v,t),f?m(e):o}function b(e){var n=e-c;return void 0===c||n>=t||n<0||s&&e-l>=d}function v(){var e=md();if(b(e))return g(e);i=ya(v,function(e){var n=t-(e-c);return s?dn(n,d-(e-l)):n}(e))}function g(e){return i=void 0,p&&u?m(e):(u=r=void 0,o)}function y(){var e=md(),n=b(e);if(u=arguments,r=this,c=e,n){if(void 0===i)return h(c);if(s)return lr(i),i=ya(v,t),m(c)}return void 0===i&&(i=ya(v,t)),o}return t=ro(t)||0,Wd(n)&&(f=!!n.leading,d=(s="maxWait"in n)?an(ro(n.maxWait)||0,t):d,p="trailing"in n?!!n.trailing:p),y.cancel=function(){void 0!==i&&lr(i),l=0,u=c=r=i=void 0},y.flush=function(){return void 0===i?o:g(md())},y}var _d=Lu((function(e,t){return Qn(e,1,t)})),Ed=Lu((function(e,t,n){return Qn(e,ro(t)||0,n)}));function wd(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ge(a);var n=function(){var u=arguments,r=t?t.apply(this,u):u[0],a=n.cache;if(a.has(r))return a.get(r);var d=e.apply(this,u);return n.cache=a.set(r,d)||a,d};return n.cache=new(wd.Cache||Pn),n}function Dd(e){if("function"!=typeof e)throw new ge(a);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}wd.Cache=Pn;var kd=ir((function(e,t){var n=(t=1==t.length&&Nd(t[0])?pt(t[0],At(Jr())):pt(au(t,1),At(Jr()))).length;return Lu((function(u){for(var r=-1,a=dn(u.length,n);++r=t})),jd=yu(function(){return arguments}())?yu:function(e){return Hd(e)&&ke.call(e,"callee")&&!Ke.call(e,"callee")},Nd=u.isArray,Fd=Xe?At(Xe):function(e){return Hd(e)&&pu(e)==D};function Td(e){return null!=e&&Ud(e.length)&&!Bd(e)}function Pd(e){return Hd(e)&&Td(e)}var Md=tn||ai,Rd=et?At(et):function(e){return Hd(e)&&pu(e)==f};function Ld(e){if(!Hd(e))return!1;var t=pu(e);return t==s||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!Gd(e)}function Bd(e){if(!Wd(e))return!1;var t=pu(e);return t==p||t==m||"[object AsyncFunction]"==t||"[object Proxy]"==t}function zd(e){return"number"==typeof e&&e==no(e)}function Ud(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wd(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Hd(e){return null!=e&&"object"==typeof e}var $d=tt?At(tt):function(e){return Hd(e)&&na(e)==h};function qd(e){return"number"==typeof e||Hd(e)&&pu(e)==b}function Gd(e){if(!Hd(e)||pu(e)!=v)return!1;var t=qe(e);if(null===t)return!0;var n=ke.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&De.call(n)==Oe}var Vd=nt?At(nt):function(e){return Hd(e)&&pu(e)==g};var Kd=ut?At(ut):function(e){return Hd(e)&&na(e)==y};function Zd(e){return"string"==typeof e||!Nd(e)&&Hd(e)&&pu(e)==_}function Jd(e){return"symbol"==typeof e||Hd(e)&&pu(e)==E}var Yd=rt?At(rt):function(e){return Hd(e)&&Ud(e.length)&&!!ze[pu(e)]};var Qd=Tr(Su),Xd=Tr((function(e,t){return e<=t}));function eo(e){if(!e)return[];if(Td(e))return Zd(e)?Gt(e):vr(e);if(Qe&&e[Qe])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Qe]());var t=na(e);return(t==h?zt:t==y?Ht:Io)(e)}function to(e){return e?(e=ro(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function no(e){var t=to(e),n=t%1;return t==t?n?t-n:t:0}function uo(e){return e?Zn(no(e),0,4294967295):0}function ro(e){if("number"==typeof e)return e;if(Jd(e))return NaN;if(Wd(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Wd(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(K,"");var n=ae.test(e);return n||oe.test(e)?$e(e.slice(2),n?2:8):re.test(e)?NaN:+e}function ao(e){return gr(e,Eo(e))}function oo(e){return null==e?"":Yu(e)}var io=_r((function(e,t){if(fa(t)||Td(t))gr(t,_o(t),e);else for(var n in t)ke.call(t,n)&&Hn(e,n,t[n])})),co=_r((function(e,t){gr(t,Eo(t),e)})),lo=_r((function(e,t,n,u){gr(t,Eo(t),e,u)})),fo=_r((function(e,t,n,u){gr(t,_o(t),e,u)})),so=$r(Kn);var po=Lu((function(e,t){e=he(e);var n=-1,u=t.length,r=u>2?t[2]:void 0;for(r&&oa(t[0],t[1],r)&&(u=1);++n1),t})),gr(e,Gr(e),n),u&&(n=Jn(n,7,Wr));for(var r=t.length;r--;)Xu(n,t[r]);return n}));var xo=$r((function(e,t){return null==e?{}:function(e,t){return Fu(e,t,(function(t,n){return bo(e,n)}))}(e,t)}));function So(e,t){if(null==e)return{};var n=pt(Gr(e),(function(e){return[e]}));return t=Jr(t),Fu(e,n,(function(e,n){return t(e,n[0])}))}var Co=Lr(_o),Oo=Lr(Eo);function Io(e){return null==e?[]:jt(e,_o(e))}var Ao=kr((function(e,t,n){return t=t.toLowerCase(),e+(n?jo(t):t)}));function jo(e){return Bo(oo(e).toLowerCase())}function No(e){return(e=oo(e))&&e.replace(ce,Mt).replace(Fe,"")}var Fo=kr((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),To=kr((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Po=Dr("toLowerCase");var Mo=kr((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Ro=kr((function(e,t,n){return e+(n?" ":"")+Bo(t)}));var Lo=kr((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Bo=Dr("toUpperCase");function zo(e,t,n){return e=oo(e),void 0===(t=n?void 0:t)?function(e){return Re.test(e)}(e)?function(e){return e.match(Pe)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(t)||[]}var Uo=Lu((function(e,t){try{return at(e,void 0,t)}catch(n){return Ld(n)?n:new se(n)}})),Wo=$r((function(e,t){return ot(t,(function(t){t=xa(t),Vn(e,t,vd(e[t],e))})),e}));function Ho(e){return function(){return e}}var $o=Cr(),qo=Cr(!0);function Go(e){return e}function Vo(e){return Du("function"==typeof e?e:Jn(e,1))}var Ko=Lu((function(e,t){return function(n){return gu(n,e,t)}})),Zo=Lu((function(e,t){return function(n){return gu(e,n,t)}}));function Jo(e,t,n){var u=_o(t),r=lu(t,u);null!=n||Wd(t)&&(r.length||!u.length)||(n=t,t=e,e=this,r=lu(t,_o(t)));var a=!(Wd(n)&&"chain"in n&&!n.chain),d=Bd(e);return ot(r,(function(n){var u=t[n];e[n]=u,d&&(e.prototype[n]=function(){var t=this.__chain__;if(a||t){var n=e(this.__wrapped__),r=n.__actions__=vr(this.__actions__);return r.push({func:u,args:arguments,thisArg:e}),n.__chain__=t,n}return u.apply(e,mt([this.value()],arguments))})})),e}function Yo(){}var Qo=jr(pt),Xo=jr(ct),ei=jr(vt);function ti(e){return ia(e)?xt(xa(e)):function(e){return function(t){return fu(t,e)}}(e)}var ni=Fr(),ui=Fr(!0);function ri(){return[]}function ai(){return!1}var di=Ar((function(e,t){return e+t}),0),oi=Mr("ceil"),ii=Ar((function(e,t){return e/t}),1),ci=Mr("floor");var li,fi=Ar((function(e,t){return e*t}),1),si=Mr("round"),pi=Ar((function(e,t){return e-t}),0);return On.after=function(e,t){if("function"!=typeof t)throw new ge(a);return e=no(e),function(){if(--e<1)return t.apply(this,arguments)}},On.ary=hd,On.assign=io,On.assignIn=co,On.assignInWith=lo,On.assignWith=fo,On.at=so,On.before=bd,On.bind=vd,On.bindAll=Wo,On.bindKey=gd,On.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Nd(e)?e:[e]},On.chain=ed,On.chunk=function(e,t,n){t=(n?oa(e,t,n):void 0===t)?1:an(no(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var a=0,d=0,o=u(Qt(r/t));ar?0:r+n),(u=void 0===u||u>r?r:no(u))<0&&(u+=r),u=n>u?0:uo(u);n>>0)?(e=oo(e))&&("string"==typeof t||null!=t&&!Vd(t))&&!(t=Yu(t))&&Bt(e)?cr(Gt(e),0,n):e.split(t,n):[]},On.spread=function(e,t){if("function"!=typeof e)throw new ge(a);return t=null==t?0:an(no(t),0),Lu((function(n){var u=n[t],r=cr(n,0,t);return u&&mt(r,u),at(e,this,r)}))},On.tail=function(e){var t=null==e?0:e.length;return t?qu(e,1,t):[]},On.take=function(e,t,n){return e&&e.length?qu(e,0,(t=n||void 0===t?1:no(t))<0?0:t):[]},On.takeRight=function(e,t,n){var u=null==e?0:e.length;return u?qu(e,(t=u-(t=n||void 0===t?1:no(t)))<0?0:t,u):[]},On.takeRightWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3),!1,!0):[]},On.takeWhile=function(e,t){return e&&e.length?tr(e,Jr(t,3)):[]},On.tap=function(e,t){return t(e),e},On.throttle=function(e,t,n){var u=!0,r=!0;if("function"!=typeof e)throw new ge(a);return Wd(n)&&(u="leading"in n?!!n.leading:u,r="trailing"in n?!!n.trailing:r),yd(e,t,{leading:u,maxWait:t,trailing:r})},On.thru=td,On.toArray=eo,On.toPairs=Co,On.toPairsIn=Oo,On.toPath=function(e){return Nd(e)?pt(e,xa):Jd(e)?[e]:vr(ka(oo(e)))},On.toPlainObject=ao,On.transform=function(e,t,n){var u=Nd(e),r=u||Md(e)||Yd(e);if(t=Jr(t,4),null==n){var a=e&&e.constructor;n=r?u?new a:[]:Wd(e)&&Bd(a)?In(qe(e)):{}}return(r?ot:iu)(e,(function(e,u,r){return t(n,e,u,r)})),n},On.unary=function(e){return hd(e,1)},On.union=Ha,On.unionBy=$a,On.unionWith=qa,On.uniq=function(e){return e&&e.length?Qu(e):[]},On.uniqBy=function(e,t){return e&&e.length?Qu(e,Jr(t,2)):[]},On.uniqWith=function(e,t){return t="function"==typeof t?t:void 0,e&&e.length?Qu(e,void 0,t):[]},On.unset=function(e,t){return null==e||Xu(e,t)},On.unzip=Ga,On.unzipWith=Va,On.update=function(e,t,n){return null==e?e:er(e,t,dr(n))},On.updateWith=function(e,t,n,u){return u="function"==typeof u?u:void 0,null==e?e:er(e,t,dr(n),u)},On.values=Io,On.valuesIn=function(e){return null==e?[]:jt(e,Eo(e))},On.without=Ka,On.words=zo,On.wrap=function(e,t){return xd(dr(t),e)},On.xor=Za,On.xorBy=Ja,On.xorWith=Ya,On.zip=Qa,On.zipObject=function(e,t){return rr(e||[],t||[],Hn)},On.zipObjectDeep=function(e,t){return rr(e||[],t||[],Uu)},On.zipWith=Xa,On.entries=Co,On.entriesIn=Oo,On.extend=co,On.extendWith=lo,Jo(On,On),On.add=di,On.attempt=Uo,On.camelCase=Ao,On.capitalize=jo,On.ceil=oi,On.clamp=function(e,t,n){return void 0===n&&(n=t,t=void 0),void 0!==n&&(n=(n=ro(n))==n?n:0),void 0!==t&&(t=(t=ro(t))==t?t:0),Zn(ro(e),t,n)},On.clone=function(e){return Jn(e,4)},On.cloneDeep=function(e){return Jn(e,5)},On.cloneDeepWith=function(e,t){return Jn(e,5,t="function"==typeof t?t:void 0)},On.cloneWith=function(e,t){return Jn(e,4,t="function"==typeof t?t:void 0)},On.conformsTo=function(e,t){return null==t||Yn(e,t,_o(t))},On.deburr=No,On.defaultTo=function(e,t){return null==e||e!=e?t:e},On.divide=ii,On.endsWith=function(e,t,n){e=oo(e),t=Yu(t);var u=e.length,r=n=void 0===n?u:Zn(no(n),0,u);return(n-=t.length)>=0&&e.slice(n,r)==t},On.eq=Od,On.escape=function(e){return(e=oo(e))&&B.test(e)?e.replace(R,Rt):e},On.escapeRegExp=function(e){return(e=oo(e))&&V.test(e)?e.replace(G,"\\$&"):e},On.every=function(e,t,n){var u=Nd(e)?ct:nu;return n&&oa(e,t,n)&&(t=void 0),u(e,Jr(t,3))},On.find=rd,On.findIndex=ja,On.findKey=function(e,t){return yt(e,Jr(t,3),iu)},On.findLast=ad,On.findLastIndex=Na,On.findLastKey=function(e,t){return yt(e,Jr(t,3),cu)},On.floor=ci,On.forEach=dd,On.forEachRight=od,On.forIn=function(e,t){return null==e?e:du(e,Jr(t,3),Eo)},On.forInRight=function(e,t){return null==e?e:ou(e,Jr(t,3),Eo)},On.forOwn=function(e,t){return e&&iu(e,Jr(t,3))},On.forOwnRight=function(e,t){return e&&cu(e,Jr(t,3))},On.get=ho,On.gt=Id,On.gte=Ad,On.has=function(e,t){return null!=e&&ua(e,t,hu)},On.hasIn=bo,On.head=Ta,On.identity=Go,On.includes=function(e,t,n,u){e=Td(e)?e:Io(e),n=n&&!u?no(n):0;var r=e.length;return n<0&&(n=an(r+n,0)),Zd(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&Et(e,t,n)>-1},On.indexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=null==n?0:no(n);return r<0&&(r=an(u+r,0)),Et(e,t,r)},On.inRange=function(e,t,n){return t=to(t),void 0===n?(n=t,t=0):n=to(n),function(e,t,n){return e>=dn(t,n)&&e=-9007199254740991&&e<=9007199254740991},On.isSet=Kd,On.isString=Zd,On.isSymbol=Jd,On.isTypedArray=Yd,On.isUndefined=function(e){return void 0===e},On.isWeakMap=function(e){return Hd(e)&&na(e)==w},On.isWeakSet=function(e){return Hd(e)&&"[object WeakSet]"==pu(e)},On.join=function(e,t){return null==e?"":un.call(e,t)},On.kebabCase=Fo,On.last=La,On.lastIndexOf=function(e,t,n){var u=null==e?0:e.length;if(!u)return-1;var r=u;return void 0!==n&&(r=(r=no(n))<0?an(u+r,0):dn(r,u-1)),t==t?function(e,t,n){for(var u=n+1;u--;)if(e[u]===t)return u;return u}(e,t,r):_t(e,Dt,r,!0)},On.lowerCase=To,On.lowerFirst=Po,On.lt=Qd,On.lte=Xd,On.max=function(e){return e&&e.length?uu(e,Go,mu):void 0},On.maxBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),mu):void 0},On.mean=function(e){return kt(e,Go)},On.meanBy=function(e,t){return kt(e,Jr(t,2))},On.min=function(e){return e&&e.length?uu(e,Go,Su):void 0},On.minBy=function(e,t){return e&&e.length?uu(e,Jr(t,2),Su):void 0},On.stubArray=ri,On.stubFalse=ai,On.stubObject=function(){return{}},On.stubString=function(){return""},On.stubTrue=function(){return!0},On.multiply=fi,On.nth=function(e,t){return e&&e.length?ju(e,no(t)):void 0},On.noConflict=function(){return Ve._===this&&(Ve._=Ie),this},On.noop=Yo,On.now=md,On.pad=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;if(!t||u>=t)return e;var r=(t-u)/2;return Nr(Xt(r),n)+e+Nr(Qt(r),n)},On.padEnd=function(e,t,n){e=oo(e);var u=(t=no(t))?qt(e):0;return t&&ut){var u=e;e=t,t=u}if(n||e%1||t%1){var r=ln();return dn(e+r*(t-e+He("1e-"+((r+"").length-1))),t)}return Mu(e,t)},On.reduce=function(e,t,n){var u=Nd(e)?ht:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,eu)},On.reduceRight=function(e,t,n){var u=Nd(e)?bt:Ct,r=arguments.length<3;return u(e,Jr(t,4),n,r,tu)},On.repeat=function(e,t,n){return t=(n?oa(e,t,n):void 0===t)?1:no(t),Ru(oo(e),t)},On.replace=function(){var e=arguments,t=oo(e[0]);return e.length<3?t:t.replace(e[1],e[2])},On.result=function(e,t,n){var u=-1,r=(t=or(t,e)).length;for(r||(r=1,e=void 0);++u9007199254740991)return[];var n=4294967295,u=dn(e,4294967295);e-=4294967295;for(var r=It(u,t=Jr(t));++n=a)return e;var o=n-qt(u);if(o<1)return u;var i=d?cr(d,0,o).join(""):e.slice(0,o);if(void 0===r)return i+u;if(d&&(o+=i.length-o),Vd(r)){if(e.slice(o).search(r)){var c,l=i;for(r.global||(r=be(r.source,oo(ue.exec(r))+"g")),r.lastIndex=0;c=r.exec(l);)var f=c.index;i=i.slice(0,void 0===f?o:f)}}else if(e.indexOf(Yu(r),o)!=o){var s=i.lastIndexOf(r);s>-1&&(i=i.slice(0,s))}return i+u},On.unescape=function(e){return(e=oo(e))&&L.test(e)?e.replace(M,Vt):e},On.uniqueId=function(e){var t=++xe;return oo(e)+t},On.upperCase=Lo,On.upperFirst=Bo,On.each=dd,On.eachRight=od,On.first=Ta,Jo(On,(li={},iu(On,(function(e,t){ke.call(On.prototype,t)||(li[t]=e)})),li),{chain:!1}),On.VERSION="4.17.15",ot(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){On[e].placeholder=On})),ot(["drop","take"],(function(e,t){Nn.prototype[e]=function(n){n=void 0===n?1:an(no(n),0);var u=this.__filtered__&&!t?new Nn(this):this.clone();return u.__filtered__?u.__takeCount__=dn(n,u.__takeCount__):u.__views__.push({size:dn(n,4294967295),type:e+(u.__dir__<0?"Right":"")}),u},Nn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),ot(["filter","map","takeWhile"],(function(e,t){var n=t+1,u=1==n||3==n;Nn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Jr(e,3),type:n}),t.__filtered__=t.__filtered__||u,t}})),ot(["head","last"],(function(e,t){var n="take"+(t?"Right":"");Nn.prototype[e]=function(){return this[n](1).value()[0]}})),ot(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");Nn.prototype[e]=function(){return this.__filtered__?new Nn(this):this[n](1)}})),Nn.prototype.compact=function(){return this.filter(Go)},Nn.prototype.find=function(e){return this.filter(e).head()},Nn.prototype.findLast=function(e){return this.reverse().find(e)},Nn.prototype.invokeMap=Lu((function(e,t){return"function"==typeof e?new Nn(this):this.map((function(n){return gu(n,e,t)}))})),Nn.prototype.reject=function(e){return this.filter(Dd(Jr(e)))},Nn.prototype.slice=function(e,t){e=no(e);var n=this;return n.__filtered__&&(e>0||t<0)?new Nn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),void 0!==t&&(n=(t=no(t))<0?n.dropRight(-t):n.take(t-e)),n)},Nn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Nn.prototype.toArray=function(){return this.take(4294967295)},iu(Nn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),u=/^(?:head|last)$/.test(t),r=On[u?"take"+("last"==t?"Right":""):t],a=u||/^find/.test(t);r&&(On.prototype[t]=function(){var t=this.__wrapped__,d=u?[1]:arguments,o=t instanceof Nn,i=d[0],c=o||Nd(t),l=function(e){var t=r.apply(On,mt([e],d));return u&&f?t[0]:t};c&&n&&"function"==typeof i&&1!=i.length&&(o=c=!1);var f=this.__chain__,s=!!this.__actions__.length,p=a&&!f,m=o&&!s;if(!a&&c){t=m?t:new Nn(this);var h=e.apply(t,d);return h.__actions__.push({func:td,args:[l],thisArg:void 0}),new jn(h,f)}return p&&m?e.apply(this,d):(h=this.thru(l),p?u?h.value()[0]:h.value():h)})})),ot(["pop","push","shift","sort","splice","unshift"],(function(e){var t=ye[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",u=/^(?:pop|shift)$/.test(e);On.prototype[e]=function(){var e=arguments;if(u&&!this.__chain__){var r=this.value();return t.apply(Nd(r)?r:[],e)}return this[n]((function(n){return t.apply(Nd(n)?n:[],e)}))}})),iu(Nn.prototype,(function(e,t){var n=On[t];if(n){var u=n.name+"";ke.call(yn,u)||(yn[u]=[]),yn[u].push({name:t,func:n})}})),yn[Or(void 0,2).name]=[{name:"wrapper",func:void 0}],Nn.prototype.clone=function(){var e=new Nn(this.__wrapped__);return e.__actions__=vr(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=vr(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=vr(this.__views__),e},Nn.prototype.reverse=function(){if(this.__filtered__){var e=new Nn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Nn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Nd(e),u=t<0,r=n?e.length:0,a=function(e,t,n){var u=-1,r=n.length;for(;++u=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},On.prototype.plant=function(e){for(var t,n=this;n instanceof An;){var u=Ca(n);u.__index__=0,u.__values__=void 0,t?r.__wrapped__=u:t=u;var r=u;n=n.__wrapped__}return r.__wrapped__=e,t},On.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Nn){var t=e;return this.__actions__.length&&(t=new Nn(this)),(t=t.reverse()).__actions__.push({func:td,args:[Wa],thisArg:void 0}),new jn(t,this.__chain__)}return this.thru(Wa)},On.prototype.toJSON=On.prototype.valueOf=On.prototype.value=function(){return nr(this.__wrapped__,this.__actions__)},On.prototype.first=On.prototype.head,Qe&&(On.prototype[Qe]=function(){return this}),On}();Ve._=Kt,void 0===(r=function(){return Kt}.call(t,n,t,u))||(u.exports=r)}).call(this)}).call(this,n(76),n(456)(e))},452:function(e,t,n){"use strict";var u=n(0);t.a=function(e){void 0===e&&(e=!0),Object(u.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e])}},453:function(e,t,n){"use strict";var u=n(436),r=n(441),a=n(438),d=n(432);t.a=function(){var e=Object(u.a)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=e.themeConfig.navbar,o=(n=void 0===n?{}:n).logo,i=void 0===o?{}:o,c=Object(r.a)().isDarkTheme,l=i.href||t,f={};i.target?f={target:i.target}:Object(d.a)(l)||(f={rel:"noopener noreferrer",target:"_blank"});var s=i.srcDark&&c?i.srcDark:i.src;return{logoLink:l,logoLinkProps:f,logoImageUrl:Object(a.a)(s),logoAlt:i.alt}}},455:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(77),n(473),n(439),n(78);var u=n(475),r=n.n(u);function a(e,t){var n=new r.a;return e.map((function(e){var u=e;return"string"==typeof e&&(u={label:e,permalink:"/blog/tags/"+n.slug(e)}),function(e,t){var n=e.label.split(": ",2),u=n[0],r=n[1],a="primary";switch(t){case"blog":case"guides":a=function(e){switch(e){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(u)}return{category:u,count:e.count,label:e.label,permalink:e.permalink,style:a,value:r}}(u,t)}))}},456:function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},457:function(e,t,n){"use strict";var u=n(12),r=n(26),a=n(517),d="".endsWith;u(u.P+u.F*n(518)("endsWith"),"String",{endsWith:function(e){var t=a(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,u=r(t.length),o=void 0===n?u:Math.min(r(n),u),i=String(e);return d?d.call(t,i,o):t.slice(o-i.length,o)===i}})},458:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(436),d=n(145),o=n.n(d);t.a=function(){var e=Object(a.a)().siteConfig,t=(e=void 0===e?{}:e).themeConfig.announcementBar,n=void 0===t?{}:t,d=n.id,i=n.content,c=n.backgroundColor,l=n.textColor,f=Object(u.useState)(!0),s=f[0],p=f[1];return Object(u.useEffect)((function(){var e=localStorage.getItem("docusaurus.announcement.id"),t=d!==e;localStorage.setItem("docusaurus.announcement.id",d),t&&localStorage.setItem("docusaurus.announcement.dismiss",!1),(t||"false"===localStorage.getItem("docusaurus.announcement.dismiss"))&&p(!1)}),[]),!i||s?null:r.a.createElement("div",{className:o.a.announcementBar,style:{backgroundColor:c,color:l},role:"banner"},r.a.createElement("div",{className:o.a.announcementBarContent,dangerouslySetInnerHTML:{__html:i}}),r.a.createElement("button",{type:"button",className:o.a.announcementBarClose,onClick:function(){localStorage.setItem("docusaurus.announcement.dismiss",!0),p(!0)},"aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")))}},459:function(e,t,n){"use strict";var u=n(0);u.PureComponent},460:function(e,t,n){"use strict";n(58),n(29),n(22),n(21),n(79);var u=n(0),r=n.n(u),a=n(423),d=n.n(a),o=n(436),i=n(472);n(146);t.a=function(e){var t=Object(u.useState)(!1),a=t[0],c=t[1],l=Object(u.useRef)(null),f=Object(o.a)().siteConfig,s=(void 0===f?{}:f).themeConfig.algolia,p=Object(i.c)();var m=function(e){void 0===e&&(e=!0),a||Promise.all([n.e(269).then(n.t.bind(null,570,7)),n.e(176).then(n.t.bind(null,583,7))]).then((function(t){var n=t[0].default;c(!0),window.docsearch=n,function(e){window.docsearch({appId:s.appId,apiKey:s.apiKey,indexName:s.indexName,inputSelector:"#search_input_react",algoliaOptions:s.algoliaOptions,handleSelected:function(e,t,n){var u=document.createElement("a");u.href=n.url;var r="#__docusaurus"===u.hash?""+u.pathname:""+u.pathname+u.hash;p.push(r)}}),e&&l.current.focus()}(e)}))},h=Object(u.useCallback)((function(){m(),a&&l.current.focus(),e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),b=Object(u.useCallback)((function(){e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]),v=Object(u.useCallback)((function(e){var t="mouseover"!==e.type;m(t)}));return r.a.createElement("div",{className:"navbar__search",key:"search-box"},r.a.createElement("span",{"aria-label":"expand searchbar",role:"button",className:d()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:h,onKeyDown:h,tabIndex:0}),r.a.createElement("input",{id:"search_input_react",type:"search",placeholder:"Search","aria-label":"Search",className:d()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onMouseOver:v,onFocus:v,onBlur:b,ref:l}))}},461:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,u)&&(n[u]=e[u]);return n}(t,["className","icons"])),a=(0,o.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return d.default.createElement("div",{className:a,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},d.default.createElement("div",{className:"react-toggle-track"},d.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),d.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),d.default.createElement("div",{className:"react-toggle-thumb"}),d.default.createElement("input",u({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(a.PureComponent);t.default=p,p.displayName="Toggle",p.defaultProps={icons:{checked:d.default.createElement(c.default,null),unchecked:d.default.createElement(l.default,null)}},p.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},462:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=(n(84),n(473),function(){var e=Object(u.useState)({}),t=e[0],n=e[1],r=Object(u.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}}),[]);return Object(u.useEffect)((function(){try{for(var e={},t=0;t=f?d(!1):e+n1&&"boolean"!=typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new u("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=x(e),r=n.length>0?n[0]:"",d=S("%"+r+"%",t),i=d.name,c=d.value,l=!1,f=d.alias;f&&(r=f[0],y(n,g([0,1],f)));for(var s=1,p=!0;s=n.length){var D=o(c,h);c=(p=!!D)&&"get"in D&&!("originalValue"in D.get)?D.get:c[h]}else p=v(c,h),c=c[h];p&&!l&&(m[i]=c)}}return c}},470:function(e,t,n){"use strict";var u=n(509);e.exports=Function.prototype.bind||u},471:function(e,t,n){"use strict";var u=String.prototype.replace,r=/%20/g,a="RFC1738",d="RFC3986";e.exports={default:d,formatters:{RFC1738:function(e){return u.call(e,r,"+")},RFC3986:function(e){return String(e)}},RFC1738:a,RFC3986:d}},472:function(e,t,n){"use strict";var u=n(39);n.d(t,"a",(function(){return u.c})),n.d(t,"b",(function(){return u.d})),n.d(t,"c",(function(){return u.e})),n.d(t,"d",(function(){return u.f}))},474:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);t.a=function(e){var t=e.count,n=e.label,u=e.permalink,d=e.style,i=e.value,c=e.valueOnly;return r.a.createElement(a.a,{to:u+"/",className:o()("badge","badge--rounded","badge--"+d)},c?i:n,t&&r.a.createElement(r.a.Fragment,null," (",t,")"))}},475:function(e,t,n){var u=n(476);e.exports=o;var r=Object.hasOwnProperty,a=/\s/g,d=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function o(){if(!(this instanceof o))return new o;this.reset()}function i(e,t){return"string"!=typeof e?"":(t||(e=e.toLowerCase()),e.trim().replace(d,"").replace(u(),"").replace(a,"-"))}o.prototype.slug=function(e,t){for(var n=i(e,!0===t),u=n;r.call(this.occurrences,n);)this.occurrences[u]++,n=u+"-"+this.occurrences[u];return this.occurrences[n]=0,n},o.prototype.reset=function(){this.occurrences=Object.create(null)},o.slug=i},476:function(e,t){e.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},478:function(e,t,n){"use strict";var u=n(471),r=Object.prototype.hasOwnProperty,a=Array.isArray,d=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),o=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},u=0;u1;){var t=e.pop(),n=t.obj[t.prop];if(a(n)){for(var u=[],r=0;r=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||a===u.RFC1738&&(40===l||41===l)?i+=o.charAt(c):l<128?i+=d[l]:l<2048?i+=d[192|l>>6]+d[128|63&l]:l<55296||l>=57344?i+=d[224|l>>12]+d[128|l>>6&63]+d[128|63&l]:(c+=1,l=65536+((1023&l)<<10|1023&o.charCodeAt(c)),i+=d[240|l>>18]+d[128|l>>12&63]+d[128|l>>6&63]+d[128|63&l])}return i},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(a(e)){for(var n=[],u=0;u{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=u(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=r,e.exports.default=r},485:function(e,t,n){"use strict";var u=n(0),r=n.n(u).a.createContext({isDarkTheme:!1,setLightTheme:function(){},setDarkTheme:function(){}});t.a=r},487:function(e,t,n){"use strict";(function(e){var u=n(1),r=(n(448),n(449),n(78),n(77),n(530),n(0)),a=n.n(r),d=n(531),o=n.n(d),i=n(563),c=n(53),l=n(423),f=n.n(l),s=n(543),p=n.n(s),m=n(532),h=n.n(m),b=n(436),v=n(441),g=n(148),y=n.n(g);(void 0!==e?e:window).Prism=c.a,n(533),n(534),n(535),n(536),n(90),n(537),n(538),n(539),n(540),n(541),n(542);var _=/{([\d,-]+)}/,E=/title=".*"/;t.a=function(e){var t=e.children,n=e.className,d=e.metastring,c=Object(b.a)().siteConfig.themeConfig.prism,l=void 0===c?{}:c,s=Object(r.useState)(!1),m=s[0],g=s[1],w=Object(r.useState)(!1),D=w[0],k=w[1];Object(r.useEffect)((function(){k(!0)}),[]);var x=Object(r.useRef)(null),S=Object(r.useRef)(null),C=[],O="",I=Object(v.a)().isDarkTheme,A=l.theme||p.a,j=l.darkTheme||A,N=I?j:A;if(d&&_.test(d)){var F=d.match(_)[1];C=h.a.parse(F).filter((function(e){return e>0}))}d&&E.test(d)&&(O=d.match(E)[0].split("title=")[1].replace(/"+/g,"")),Object(r.useEffect)((function(){var e;return S.current&&(e=new o.a(S.current,{target:function(){return x.current}})),function(){e&&e.destroy()}}),[S.current,x.current]);var T=n&&n.replace(/language-/,"");!T&&l.defaultLanguage&&(T=l.defaultLanguage);var P=function(){window.getSelection().empty(),g(!0),setTimeout((function(){return g(!1)}),2e3)};return a.a.createElement(i.a,Object(u.a)({},i.b,{key:D,theme:N,code:t.trim(),language:T}),(function(e){var t,n,r=e.className,d=e.style,o=e.tokens,i=e.getLineProps,c=e.getTokenProps;return a.a.createElement(a.a.Fragment,null,O&&a.a.createElement("div",{style:d,className:y.a.codeBlockTitle},O),a.a.createElement("div",{className:y.a.codeBlockContent},a.a.createElement("button",{ref:S,type:"button","aria-label":"Copy code to clipboard",className:f()(y.a.copyButton,(t={},t[y.a.copyButtonWithTitle]=O,t)),onClick:P},m?"Copied":"Copy"),a.a.createElement("pre",{className:f()(r,y.a.codeBlock,(n={},n[y.a.codeBlockWithTitle]=O,n))},a.a.createElement("div",{ref:x,className:y.a.codeBlockLines,style:d},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var n=i({line:e,key:t});return C.includes(t+1)&&(n.className=n.className+" docusaurus-highlight-code-line"),a.a.createElement("div",Object(u.a)({key:t},n),e.map((function(e,t){return a.a.createElement("span",Object(u.a)({key:t},c({token:e,key:t})))})))}))))))}))}}).call(this,n(76))},488:function(e,t,n){"use strict";var u=n(0),r=n.n(u);n(424),n(144);t.a=function(e){var t=e.children,n=Object(u.useState)(!1),a=n[0],d=n[1];return a?r.a.createElement("div",{className:"code-explanation code-explanation--expanded"},t,r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-arrow-up-circle"})," hide")):r.a.createElement("div",{className:"code-explanation code-explanation--collapsed"},r.a.createElement("div",{className:"code-explanation--toggle",onClick:function(){return d(!a)}},r.a.createElement("i",{className:"feather icon-info"})," explain this command"))}},489:function(e,t,n){"use strict";var u=n(30),r=n(12),a=n(27),d=n(91),o=n(92),i=n(26),c=n(545),l=n(93);r(r.S+r.F*!n(83)((function(e){Array.from(e)})),"Array",{from:function(e){var t,n,r,f,s=a(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,b=void 0!==h,v=0,g=l(s);if(b&&(h=u(h,m>2?arguments[2]:void 0,2)),null==g||p==Array&&o(g))for(n=new p(t=i(s.length));t>v;v++)c(n,v,b?h(s[v],v):s[v]);else for(f=g.call(s),n=new p;!(r=f.next()).done;v++)c(n,v,b?d(f,h,[r.value,v],!0):r.value);return n.length=v,n}})},490:function(e,t,n){"use strict";var u=n(546),r=n(492);e.exports=n(547)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return u.def(r(this,"Set"),e=0===e?0:e,e)}},u)},491:function(e,t,n){var u=n(40)("meta"),r=n(13),a=n(31),d=n(28).f,o=0,i=Object.isExtensible||function(){return!0},c=!n(14)((function(){return i(Object.preventExtensions({}))})),l=function(e){d(e,u,{value:{i:"O"+ ++o,w:{}}})},f=e.exports={KEY:u,NEED:!1,fastKey:function(e,t){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,u)){if(!i(e))return"F";if(!t)return"E";l(e)}return e[u].i},getWeak:function(e,t){if(!a(e,u)){if(!i(e))return!0;if(!t)return!1;l(e)}return e[u].w},onFreeze:function(e){return c&&f.NEED&&i(e)&&!a(e,u)&&l(e),e}}},492:function(e,t,n){var u=n(13);e.exports=function(e,t){if(!u(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},493:function(e,t,n){"use strict";const u=n(494);e.exports=(e,t)=>{if("string"!=typeof e)throw new TypeError("Expected a string");t=void 0===t?"_":t;const n=u("([\\p{Ll}\\d])(\\p{Lu})","g"),r=u("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(n,`$1${t}$2`).replace(r,`$1${t}$2`).toLowerCase()}},494:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=f(n(495)),r=f(n(496)),a=f(n(497)),d=f(n(498)),o=f(n(499)),i=f(n(500)),c=f(n(501)),l=f(n(502));function f(e){return e&&e.__esModule?e:{default:e}}(0,r.default)(u.default),(0,a.default)(u.default),(0,d.default)(u.default),(0,o.default)(u.default),(0,i.default)(u.default),(0,c.default)(u.default),(0,l.default)(u.default),t.default=u.default,e.exports=t.default},495:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u={astral:!1},r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},a={},d={},o={},i=[],c={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},l=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,f=void 0===r.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var t=!0;try{new RegExp("",e)}catch(n){t=!1}return t}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function g(e,t,n,u,r){var a=void 0;if(e.xregexp={captureNames:t},r)return e;if(e.__proto__)e.__proto__=j.prototype;else for(a in j.prototype)e[a]=j.prototype[a];return e.xregexp.source=n,e.xregexp.flags=u?u.split("").sort().join(""):u,e}function y(e){return r.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,t){if(!j.isRegExp(e))throw new TypeError("Type RegExp expected");var n=e.xregexp||{},u=function(e){return s?e.flags:r.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),a="",d="",o=null,i=null;return(t=t||{}).removeG&&(d+="g"),t.removeY&&(d+="y"),d&&(u=r.replace.call(u,new RegExp("["+d+"]+","g"),"")),t.addG&&(a+="g"),t.addY&&(a+="y"),a&&(u=y(u+a)),t.isInternalOnly||(void 0!==n.source&&(o=n.source),null!=n.flags&&(i=a?y(n.flags+a):n.flags)),e=g(new RegExp(t.source||e.source,u),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?n.captureNames.slice(0):null,o,i,t.isInternalOnly)}function E(e){return parseInt(e,16)}function w(e,t,n){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,t,n){return r.test.call(-1!==n.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(t))}(e.input,e.index+e[0].length,n)?"":"(?:)"}function D(e){return parseInt(e,10).toString(16)}function k(e,t){return p.call(e)==="[object "+t+"]"}function x(e){for(;e.length<4;)e="0"+e;return e}function S(e){var t={};return k(e,"String")?(j.forEach(e,/[^\s,]+/,(function(e){t[e]=!0})),t):e}function C(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");v[e]=!0}function O(e,t,n,u,r){for(var a=i.length,d=e[n],o=null,c=void 0,l=void 0;a--;)if(!((l=i[a]).leadChar&&l.leadChar!==d||l.scope!==u&&"all"!==l.scope||l.flag&&-1===t.indexOf(l.flag))&&(c=j.exec(e,l.regex,n,"sticky"))){o={matchLength:c[0].length,output:l.handler.call(r,c,u,t),reparse:l.reparse};break}return o}function I(e){u.astral=e}function A(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function j(e,t){if(j.isRegExp(e)){if(void 0!==t)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),t=void 0===t?"":String(t),j.isInstalled("astral")&&-1===t.indexOf("A")&&(t+="A"),o[e]||(o[e]={}),!o[e][t]){for(var n={hasNamedCapture:!1,captureNames:[]},u="default",a="",d=0,i=void 0,l=function(e,t){var n=void 0;if(y(t)!==t)throw new SyntaxError("Invalid duplicate regex flag "+t);for(e=r.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,n){if(r.test.call(/[gy]/,n))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return t=y(t+n),""})),n=0;n"}else if(n)return"\\"+(+n+d);return e}if(!k(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var c=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,l=[],f=void 0,s=0;s1&&-1!==n.indexOf("")){var u=_(this,{removeG:!0,isInternalOnly:!0});r.replace.call(String(e).slice(n.index),u,(function(){for(var e=arguments.length,t=Array(e),u=0;un.index&&(this.lastIndex=n.index)}return this.global||(this.lastIndex=t),n},a.test=function(e){return!!a.exec.call(this,e)},a.match=function(e){if(j.isRegExp(e)){if(e.global){var t=r.match.apply(this,arguments);return e.lastIndex=0,t}}else e=new RegExp(e);return a.exec.call(e,A(this))},a.replace=function(e,t){var n=j.isRegExp(e),u=void 0,a=void 0,d=void 0;return n?(e.xregexp&&(a=e.xregexp.captureNames),u=e.lastIndex):e+="",d=k(t,"Function")?r.replace.call(String(this),e,(function(){for(var u=arguments.length,r=Array(u),d=0;dn.length-3)throw new SyntaxError("Backreference to undefined group "+e);return n[r]||""}throw new SyntaxError("Invalid token "+e)}})),n&&(e.global?e.lastIndex=0:e.lastIndex=u),d},a.split=function(e,t){if(!j.isRegExp(e))return r.split.apply(this,arguments);var n=String(this),u=[],a=e.lastIndex,d=0,o=void 0;return t=(void 0===t?-1:t)>>>0,j.forEach(n,e,(function(e){e.index+e[0].length>d&&(u.push(n.slice(d,e.index)),e.length>1&&e.indext?u.slice(0,t):u},j.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,t){if("B"===e[1]&&"default"===t)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),j.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,t,n){var u=E(e[1]);if(u>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(u<=65535)return"\\u"+x(D(u));if(h&&-1!==n.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),j.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),j.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),j.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),j.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),j.addToken(/\\k<([\w$]+)>/,(function(e){var t=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],n=e.index+e[0].length;if(!t||t>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+t+(n===e.input.length||isNaN(e.input[n])?"":"(?:)")}),{leadChar:"\\"}),j.addToken(/\\(\d+)/,(function(e,t){if(!("default"===t&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),j.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),j.addToken(/\((?!\?)/,(function(e,t,n){return-1!==n.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),t.default=j,e.exports=t.default},496:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,n=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,t],"g",{conjunction:"or"});function u(e){var t=/^(?:\(\?:\))*\^/,n=/\$(?:\(\?:\))*$/;return t.test(e)&&n.test(e)&&n.test(e.replace(/\\[\s\S]/g,""))?e.replace(t,"").replace(n,""):e}function r(t,n){var u=n?"x":"";return e.isRegExp(t)?t.xregexp&&t.xregexp.captureNames?t:e(t.source,u):e(t,u)}function a(t){return t instanceof RegExp?t:e.escape(t)}function d(e,t,n){return e["subpattern"+n]=t,e}function o(e,t,n){return e+(t1?u-1:0),i=1;i"):i="(?:",h=m,""+i+l[d].pattern.replace(t,(function(e,t,n){if(t){if(o=l[d].names[m-h],++m,o)return"(?<"+o+">"}else if(n)return c=+n-1,l[d].names[c]?"\\k<"+l[d].names[c]+">":"\\"+(+n+h);return e}))+")"}if(r){if(o=g[b],v[++b]=++m,o)return"(?<"+o+">"}else if(a)return g[c=+a-1]?"\\k<"+g[c]+">":"\\"+v[+a];return e}));return e(y,o)}},e.exports=t.default},497:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(e,t,n,u){return{name:e,value:t,start:n,end:u}}e.matchRecursive=function(n,u,r,a,d){d=d||{};var o=-1!==(a=a||"").indexOf("g"),i=-1!==a.indexOf("y"),c=a.replace(/y/g,""),l=d.escapeChar,f=d.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,g=void 0,y=void 0,_=void 0,E=void 0;if(u=e(u,c),r=e(r,c),l){if(l.length>1)throw new Error("Cannot use more than one escape character");l=e.escape(l),E=new RegExp("(?:"+l+"[\\S\\s]|(?:(?!"+e.union([u,r],"",{conjunction:"or"}).source+")[^"+l+"])+)+",a.replace(/[^imu]+/g,""))}for(;;){if(l&&(h+=(e.exec(n,E,h,"sticky")||[""])[0].length),y=e.exec(n,u,h),_=e.exec(n,r,h),y&&_&&(y.index<=_.index?_=null:y=null),y||_)h=(m=(y||_).index)+(y||_)[0].length;else if(!p)break;if(i&&!p&&m>b)break;if(y)p||(v=m,g=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(f?(f[0]&&v>b&&s.push(t(f[0],n.slice(b,v),b,v)),f[1]&&s.push(t(f[1],n.slice(v,g),v,g)),f[2]&&s.push(t(f[2],n.slice(g,m),g,m)),f[3]&&s.push(t(f[3],n.slice(m,h),m,h))):s.push(n.slice(g,m)),b=h,!o))break}m===h&&++h}return o&&!i&&f&&f[0]&&n.length>b&&s.push(t(f[0],n.slice(b),b,n.length)),s}},e.exports=t.default},498:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t={},n=e._dec,u=e._hex,r=e._pad4;function a(e){return e.replace(/[- _]+/g,"").toLowerCase()}function d(e){var t=/^\\[xu](.+)/.exec(e);return t?n(t[1]):e.charCodeAt("\\"===e[0]?1:0)}function o(n){var a,o,i;return t[n]["b!"]||(t[n]["b!"]=(a=t[n].bmp,o="",i=-1,e.forEach(a,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var t=d(e[1]);t>i+1&&(o+="\\u"+r(u(i+1)),t>i+2&&(o+="-\\u"+r(u(t-1)))),i=d(e[2]||e[1])})),i<65535&&(o+="\\u"+r(u(i+1)),i<65534&&(o+="-\\uFFFF")),o))}function i(e,n){var u=n?"a!":"a=";return t[e][u]||(t[e][u]=function(e,n){var u=t[e],r="";return u.bmp&&!u.isBmpLast&&(r="["+u.bmp+"]"+(u.astral?"|":"")),u.astral&&(r+=u.astral),u.isBmpLast&&u.bmp&&(r+=(u.astral?"|":"")+"["+u.bmp+"]"),n?"(?:(?!"+r+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+r+")"}(e,n))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,n,u){var r="P"===e[1]||!!e[2],d=-1!==u.indexOf("A"),c=a(e[4]||e[3]),l=t[c];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!t.hasOwnProperty(c))throw new SyntaxError("Unknown Unicode token "+e[0]);if(l.inverseOf){if(c=a(l.inverseOf),!t.hasOwnProperty(c))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+l.inverseOf);l=t[c],r=!r}if(!l.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(d){if("class"===n)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return i(c,r)}return"class"===n?r?o(c):l.bmp:(r?"[^":"[")+l.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(n){for(var u=void 0,r=0;r\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=t.default},501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var t=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];t.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(t)},e.exports=t.default},502:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=t.default},503:function(e,t,n){"use strict";var u=n(0),r=n.n(u);t.a=function(e){var t=e.text;return r.a.createElement("section",{className:"empty"},r.a.createElement("div",{className:"icon"},r.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),r.a.createElement("div",{className:"text"},t))}},504:function(e,t,n){"use strict";var u=n(505),r=n(515),a=n(471);e.exports={formats:a,parse:r,stringify:u}},505:function(e,t,n){"use strict";var u=n(506),r=n(478),a=n(471),d=Object.prototype.hasOwnProperty,o={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},i=Array.isArray,c=String.prototype.split,l=Array.prototype.push,f=function(e,t){l.apply(e,i(t)?t:[t])},s=Date.prototype.toISOString,p=a.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:r.encode,encodeValuesOnly:!1,format:p,formatter:a.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},b=function e(t,n,a,d,o,l,s,p,b,v,g,y,_,E,w,D){for(var k,x=t,S=D,C=0,O=!1;void 0!==(S=S.get(h))&&!O;){var I=S.get(t);if(C+=1,void 0!==I){if(I===C)throw new RangeError("Cyclic object value");O=!0}void 0===S.get(h)&&(C=0)}if("function"==typeof p?x=p(n,x):x instanceof Date?x=g(x):"comma"===a&&i(x)&&(x=r.maybeMap(x,(function(e){return e instanceof Date?g(e):e}))),null===x){if(o)return s&&!E?s(n,m.encoder,w,"key",y):n;x=""}if("string"==typeof(k=x)||"number"==typeof k||"boolean"==typeof k||"symbol"==typeof k||"bigint"==typeof k||r.isBuffer(x)){if(s){var A=E?n:s(n,m.encoder,w,"key",y);if("comma"===a&&E){for(var j=c.call(String(x),","),N="",F=0;F0?x.join(",")||null:void 0}];else if(i(p))T=p;else{var M=Object.keys(x);T=b?M.sort(b):M}for(var R=d&&i(x)&&1===x.length?n+"[]":n,L=0;L0?E+_:""}},506:function(e,t,n){"use strict";var u=n(469),r=n(511),a=n(513),d=u("%TypeError%"),o=u("%WeakMap%",!0),i=u("%Map%",!0),c=r("WeakMap.prototype.get",!0),l=r("WeakMap.prototype.set",!0),f=r("WeakMap.prototype.has",!0),s=r("Map.prototype.get",!0),p=r("Map.prototype.set",!0),m=r("Map.prototype.has",!0),h=function(e,t){for(var n,u=e;null!==(n=u.next);u=n)if(n.key===t)return u.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,u={assert:function(e){if(!u.has(e))throw new d("Side channel does not contain "+a(e))},get:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return c(e,u)}else if(i){if(t)return s(t,u)}else if(n)return function(e,t){var n=h(e,t);return n&&n.value}(n,u)},has:function(u){if(o&&u&&("object"==typeof u||"function"==typeof u)){if(e)return f(e,u)}else if(i){if(t)return m(t,u)}else if(n)return function(e,t){return!!h(e,t)}(n,u);return!1},set:function(u,r){o&&u&&("object"==typeof u||"function"==typeof u)?(e||(e=new o),l(e,u,r)):i?(t||(t=new i),p(t,u,r)):(n||(n={key:{},next:null}),function(e,t,n){var u=h(e,t);u?u.value=n:e.next={key:t,next:e.next,value:n}}(n,u,r))}};return u}},507:function(e,t,n){"use strict";var u="undefined"!=typeof Symbol&&Symbol,r=n(508);e.exports=function(){return"function"==typeof u&&("function"==typeof Symbol&&("symbol"==typeof u("foo")&&("symbol"==typeof Symbol("bar")&&r())))}},508:function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var u=Object.getOwnPropertySymbols(e);if(1!==u.length||u[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var r=Object.getOwnPropertyDescriptor(e,t);if(42!==r.value||!0!==r.enumerable)return!1}return!0}},509:function(e,t,n){"use strict";var u="Function.prototype.bind called on incompatible ",r=Array.prototype.slice,a=Object.prototype.toString;e.exports=function(e){var t=this;if("function"!=typeof t||"[object Function]"!==a.call(t))throw new TypeError(u+t);for(var n,d=r.call(arguments,1),o=function(){if(this instanceof n){var u=t.apply(this,d.concat(r.call(arguments)));return Object(u)===u?u:this}return t.apply(e,d.concat(r.call(arguments)))},i=Math.max(0,t.length-d.length),c=[],l=0;l-1?r(n):n}},512:function(e,t,n){"use strict";var u=n(470),r=n(469),a=r("%Function.prototype.apply%"),d=r("%Function.prototype.call%"),o=r("%Reflect.apply%",!0)||u.call(d,a),i=r("%Object.getOwnPropertyDescriptor%",!0),c=r("%Object.defineProperty%",!0),l=r("%Math.max%");if(c)try{c({},"a",{value:1})}catch(s){c=null}e.exports=function(e){var t=o(u,d,arguments);if(i&&c){var n=i(t,"length");n.configurable&&c(t,"length",{value:1+l(0,e.length-(arguments.length-1))})}return t};var f=function(){return o(u,a,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},513:function(e,t,n){var u="function"==typeof Map&&Map.prototype,r=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,a=u&&r&&"function"==typeof r.get?r.get:null,d=u&&Map.prototype.forEach,o="function"==typeof Set&&Set.prototype,i=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=o&&i&&"function"==typeof i.get?i.get:null,l=o&&Set.prototype.forEach,f="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,b=Function.prototype.toString,v=String.prototype.match,g=String.prototype.slice,y=String.prototype.replace,_=String.prototype.toUpperCase,E=String.prototype.toLowerCase,w=RegExp.prototype.test,D=Array.prototype.concat,k=Array.prototype.join,x=Array.prototype.slice,S=Math.floor,C="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,A="function"==typeof Symbol&&"object"==typeof Symbol.iterator,j="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===A||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,F=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function T(e,t){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var u=e<0?-S(-e):S(e);if(u!==e){var r=String(u),a=g.call(t,r.length+1);return y.call(r,n,"$&_")+"."+y.call(y.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}}return y.call(t,n,"$&_")}var P=n(514),M=P.custom,R=W(M)?M:null;function L(e,t,n){var u="double"===(n.quoteStyle||t)?'"':"'";return u+e+u}function B(e){return y.call(String(e),/"/g,""")}function z(e){return!("[object Array]"!==q(e)||j&&"object"==typeof e&&j in e)}function U(e){return!("[object RegExp]"!==q(e)||j&&"object"==typeof e&&j in e)}function W(e){if(A)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!I)return!1;try{return I.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,u,r){var o=n||{};if($(o,"quoteStyle")&&"single"!==o.quoteStyle&&"double"!==o.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if($(o,"maxStringLength")&&("number"==typeof o.maxStringLength?o.maxStringLength<0&&o.maxStringLength!==1/0:null!==o.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var i=!$(o,"customInspect")||o.customInspect;if("boolean"!=typeof i&&"symbol"!==i)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if($(o,"indent")&&null!==o.indent&&"\t"!==o.indent&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if($(o,"numericSeparator")&&"boolean"!=typeof o.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=o.numericSeparator;if(void 0===t)return"undefined";if(null===t)return"null";if("boolean"==typeof t)return t?"true":"false";if("string"==typeof t)return function e(t,n){if(t.length>n.maxStringLength){var u=t.length-n.maxStringLength,r="... "+u+" more character"+(u>1?"s":"");return e(g.call(t,0,n.maxStringLength),n)+r}return L(y.call(y.call(t,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,V),"single",n)}(t,o);if("number"==typeof t){if(0===t)return 1/0/t>0?"0":"-0";var _=String(t);return h?T(t,_):_}if("bigint"==typeof t){var w=String(t)+"n";return h?T(t,w):w}var S=void 0===o.depth?5:o.depth;if(void 0===u&&(u=0),u>=S&&S>0&&"object"==typeof t)return z(t)?"[Array]":"[Object]";var O=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(o,u);if(void 0===r)r=[];else if(G(r,t)>=0)return"[Circular]";function M(t,n,a){if(n&&(r=x.call(r)).push(n),a){var d={depth:o.depth};return $(o,"quoteStyle")&&(d.quoteStyle=o.quoteStyle),e(t,d,u+1,r)}return e(t,o,u+1,r)}if("function"==typeof t&&!U(t)){var H=function(e){if(e.name)return e.name;var t=v.call(b.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),X=Q(t,M);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(X.length>0?" { "+k.call(X,", ")+" }":"")}if(W(t)){var ee=A?y.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):I.call(t);return"object"!=typeof t||A?ee:K(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(t)){for(var te="<"+E.call(String(t.nodeName)),ne=t.attributes||[],ue=0;ue"}if(z(t)){if(0===t.length)return"[]";var re=Q(t,M);return O&&!function(e){for(var t=0;t=0)return!1;return!0}(re)?"["+Y(re,O)+"]":"[ "+k.call(re,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)){var ae=Q(t,M);return"cause"in Error.prototype||!("cause"in t)||N.call(t,"cause")?0===ae.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(ae,", ")+" }":"{ ["+String(t)+"] "+k.call(D.call("[cause]: "+M(t.cause),ae),", ")+" }"}if("object"==typeof t&&i){if(R&&"function"==typeof t[R]&&P)return P(t,{depth:S-u});if("symbol"!==i&&"function"==typeof t.inspect)return t.inspect()}if(function(e){if(!a||!e||"object"!=typeof e)return!1;try{a.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var de=[];return d.call(t,(function(e,n){de.push(M(n,t,!0)+" => "+M(e,t))})),J("Map",a.call(t),de,O)}if(function(e){if(!c||!e||"object"!=typeof e)return!1;try{c.call(e);try{a.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var oe=[];return l.call(t,(function(e){oe.push(M(e,t))})),J("Set",c.call(t),oe,O)}if(function(e){if(!f||!e||"object"!=typeof e)return!1;try{f.call(e,f);try{s.call(e,s)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return Z("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return Z("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(t){}return!1}(t))return Z("WeakRef");if(function(e){return!("[object Number]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(Number(t)));if(function(e){if(!e||"object"!=typeof e||!C)return!1;try{return C.call(e),!0}catch(t){}return!1}(t))return K(M(C.call(t)));if(function(e){return!("[object Boolean]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(m.call(t));if(function(e){return!("[object String]"!==q(e)||j&&"object"==typeof e&&j in e)}(t))return K(M(String(t)));if(!function(e){return!("[object Date]"!==q(e)||j&&"object"==typeof e&&j in e)}(t)&&!U(t)){var ie=Q(t,M),ce=F?F(t)===Object.prototype:t instanceof Object||t.constructor===Object,le=t instanceof Object?"":"null prototype",fe=!ce&&j&&Object(t)===t&&j in t?g.call(q(t),8,-1):le?"Object":"",se=(ce||"function"!=typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||le?"["+k.call(D.call([],fe||[],le||[]),": ")+"] ":"");return 0===ie.length?se+"{}":O?se+"{"+Y(ie,O)+"}":se+"{ "+k.call(ie,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function $(e,t){return H.call(e,t)}function q(e){return h.call(e)}function G(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,u=e.length;n-1?e.split(","):e},c=function(e,t,n,u){if(e){var a=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,d=/(\[[^[\]]*])/g,o=n.depth>0&&/(\[[^[\]]*])/.exec(a),c=o?a.slice(0,o.index):a,l=[];if(c){if(!n.plainObjects&&r.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var f=0;n.depth>0&&null!==(o=d.exec(a))&&f=0;--a){var d,o=e[a];if("[]"===o&&n.parseArrays)d=[].concat(r);else{d=n.plainObjects?Object.create(null):{};var c="["===o.charAt(0)&&"]"===o.charAt(o.length-1)?o.slice(1,-1):o,l=parseInt(c,10);n.parseArrays||""!==c?!isNaN(l)&&o!==c&&String(l)===c&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(d=[])[l]=r:"__proto__"!==c&&(d[c]=r):d={0:r}}r=d}return r}(l,t,n,u)}};e.exports=function(e,t){var n=function(e){if(!e)return d;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?d.charset:e.charset;return{allowDots:void 0===e.allowDots?d.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:d.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:d.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:d.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:d.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:d.comma,decoder:"function"==typeof e.decoder?e.decoder:d.decoder,delimiter:"string"==typeof e.delimiter||u.isRegExp(e.delimiter)?e.delimiter:d.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:d.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:d.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:d.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:d.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:d.strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var l="string"==typeof e?function(e,t){var n,c={},l=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,s=l.split(t.delimiter,f),p=-1,m=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(b=a(b)?[b]:b),r.call(c,h)?c[h]=u.combine(c[h],b):c[h]=b}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},s=Object.keys(l),p=0;p'},heart:{width:12,height:16,path:''},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"repo-template":{width:14,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},g={},y=function(e,t){var n=g[e]||(g[e]=[]);if(!(n.push(t)>1)){var u=function(e){var t;return function(){t||(t=1,e.apply(this,arguments))}}((function(){for(delete g[e];t=n.shift();)t.apply(null,arguments)}));if(l){var r=new d;s(r,"abort",u),s(r,"error",u),s(r,"load",(function(){var e;try{e=JSON.parse(r.responseText)}catch(t){return void u(t)}u(200!==r.status,e)})),r.open("GET",e),r.send()}else{var a=this||window;a._=function(e){a._=null,u(200!==e.meta.status,e.data)};var i=o(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),c=function(){a._&&a._({meta:{}})};s(i,"load",c),s(i,"error",c),i.readyState&&function(e,t,n){var u=function(r){if(t.test(e.readyState))return p(e,"readystatechange",u),n(r)};s(e,"readystatechange",u)}(i,/de|m/,c),a.document.getElementsByTagName("head")[0].appendChild(i)}}},E=function(e,t,n){var u=o(e.ownerDocument),r=e.appendChild(u("style",{type:"text/css"})),a="body{margin:0}a{text-decoration:none;outline:0}.widget{display:inline-block;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:0;white-space:nowrap}.btn,.social-count{position:relative;display:inline-block;height:14px;padding:2px 5px;font-size:11px;font-weight:600;line-height:14px;vertical-align:bottom;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid}.btn{border-radius:.25em}.btn:not(:last-child){border-radius:.25em 0 0 .25em}.social-count{border-left:0;border-radius:0 .25em .25em 0}.widget-lg .btn,.widget-lg .social-count{height:20px;padding:3px 10px;font-size:12px;line-height:20px}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}"+b(t["data-color-scheme"]);r.styleSheet?r.styleSheet.cssText=a:r.appendChild(e.ownerDocument.createTextNode(a));var d,i,l=u("a",{className:"btn",href:t.href,target:"_blank",rel:"noopener",innerHTML:(d=t["data-icon"],i=/^large$/i.test(t["data-size"])?16:14,d=(""+d).toLowerCase().replace(/^octicon-/,""),c(v,d)||(d="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",u("span",{},[t["data-text"]||""])]),f=e.appendChild(u("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" widget-lg":"")},[l])),s=l.hostname.split(".").reverse();if(""===s[0]&&s.shift(),"com"!==s[0]||"github"!==s[1])return l.href="#",l.target="_self",void n(f);var p=s.length,m=(" /"+l.pathname).split(/\/+/);if(((2===p||3===p&&"gist"===s[2])&&"archive"===m[3]||2===p&&"releases"===m[3]&&"download"===m[4]||3===p&&"codeload"===s[2])&&(l.target="_top"),/^true$/i.test(t["data-show-count"])&&2===p){var h,g;if(!m[2]&&m[1])h=g="followers";else if(!m[3]&&m[2])g="stargazers_count",h="stargazers";else if(m[4]||"subscription"!==m[3])if(m[4]||"fork"!==m[3]){if("issues"!==m[3])return void n(f);g="open_issues_count",h="issues"}else g="forks_count",h="network/members";else g="subscribers_count",h="watchers";var _=m[2]?"/repos/"+m[1]+"/"+m[2]:"/users/"+m[1];y.call(this,"https://api.github.com"+_,(function(e,t){if(!e){var r=t[g];f.appendChild(u("a",{className:"social-count",href:t.html_url+"/"+h,target:"_blank",rel:"noopener","aria-label":r+" "+g.replace(/_count$/,"").replace("_"," ").slice(0,r<2?-1:void 0)+" on GitHub"},[(""+r).replace(/\B(?=(\d{3})+(?!\d))/g,",")]))}n(f)}))}else n(f)},w=window.devicePixelRatio||1,D=function(e){return(w>1?r.ceil(r.round(e*w)/w*2)/2:r.ceil(e))||0},k=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},x=function(e,t){if(null!=e&&null!=t)if(e.getAttribute&&(e=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},n=["icon","color-scheme","text","size","show-count"],u=0,r=n.length;u0){var n=t[0];return{x:n.clientX,y:n.clientY}}var u=e.pageX;if(void 0!==u)return{x:u,y:e.pageY}}return{x:0,y:0}}},527:function(e,t,n){"use strict";var u=n(0),r=n.n(u),a=n(430),d=n(423),o=n.n(d);n(147);t.a=function(e){var t=e.className,n=e.previous,u=e.next;return r.a.createElement("nav",{className:o()("pagination-nav",t)},r.a.createElement("div",{className:"pagination-nav__item"},n&&r.a.createElement(a.a,{className:"pagination-nav__link",to:n.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Previous"),r.a.createElement("h4",{className:"pagination-nav__link--label"},"\xab ",n.title))),r.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},u&&r.a.createElement(a.a,{className:"pagination-nav__link",to:u.permalink},r.a.createElement("h5",{className:"pagination-nav__link--sublabel"},"Next"),r.a.createElement("h4",{className:"pagination-nav__link--label"},u.title," \xbb"))))}},528:function(e,t,n){"use strict";var u=n(0);t.a=function(e,t,n){var r=Object(u.useState)(void 0),a=r[0],d=r[1];Object(u.useEffect)((function(){var u=[],r=[];function o(){var o=function(){var e=0,t=null;for(u=document.getElementsByClassName("anchor");e=0&&a<=n&&(t=r),e+=1}return t}();if(o){var i=0,c=!1;for(r=document.getElementsByClassName(e);i0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":a(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}(),i=n(1),c=n.n(i),l=n(2),f=n.n(l),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===s(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=f()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new o({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return h("action",e)}},{key:"defaultTarget",value:function(e){var t=h("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return h("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}]),t}(c.a);function h(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}t.default=m}]).default},e.exports=u()},532:function(e,t){e.exports.parse=function(e){var t=e.split(",").map((function(e){return function(e){if(/^-?\d+$/.test(e))return parseInt(e,10);var t;if(t=e.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){var n=t[1],u=t[2],r=t[3];if(n&&r){var a=[],d=(n=parseInt(n))<(r=parseInt(r))?1:-1;"-"!=u&&".."!=u&&"\u2025"!=u||(r+=d);for(var o=n;o!=r;o+=d)a.push(o);return a}}return[]}(e)}));return 0===t.length?[]:1===t.length?Array.isArray(t[0])?t[0]:t:t.reduce((function(e,t){return Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]),e.concat(t)}))}},533:function(e,t){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,u=e.languages,r={"application/javascript":u.javascript,"application/json":u.json||u.javascript,"application/xml":u.xml,"text/xml":u.xml,"text/html":u.html,"text/css":u.css,"text/plain":u.plain},a={"application/json":!0,"application/xml":!0};function d(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|"+("\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-])")+")"}for(var o in r)if(r[o]){n=n||{};var i=a[o]?d(o):o;n[o.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+i+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:r[o]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},534:function(e,t){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},535:function(e,t){!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},536:function(e,t){!function(e){var t=/\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/\b[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:t}},builtin:t,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism)},537:function(e,t){!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},538:function(e,t){!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},539:function(e,t){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,u={pattern:RegExp(n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[u,{pattern:RegExp(n+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:u.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":u,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},540:function(e,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},541:function(e,t){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],u=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,a=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:u,operator:r,punctuation:a};var d={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:d}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:d}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:u,operator:r,punctuation:a}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},542:function(e,t){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,u="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",r=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function d(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return u}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return u})).replace(/<>/g,(function(){return"(?:"+r+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:d(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:d(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:d(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:d(a),lookbehind:!0,greedy:!0},number:{pattern:d(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},543:function(e,t){e.exports={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]}},544:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.canUseDOM=void 0;var u,r=n(565);var a=((u=r)&&u.__esModule?u:{default:u}).default,d=a.canUseDOM?window.HTMLElement:{};t.canUseDOM=a.canUseDOM;t.default=d},545:function(e,t,n){"use strict";var u=n(28),r=n(57);e.exports=function(e,t,n){t in e?u.f(e,t,r(0,n)):e[t]=n}},546:function(e,t,n){"use strict";var u=n(28).f,r=n(89),a=n(82),d=n(30),o=n(80),i=n(81),c=n(61),l=n(88),f=n(94),s=n(10),p=n(491).fastKey,m=n(492),h=s?"_s":"size",b=function(e,t){var n,u=p(t);if("F"!==u)return e._i[u];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,c){var l=e((function(e,u){o(e,l,t,"_i"),e._t=t,e._i=r(null),e._f=void 0,e._l=void 0,e[h]=0,null!=u&&i(u,n,e[c],e)}));return a(l.prototype,{clear:function(){for(var e=m(this,t),n=e._i,u=e._f;u;u=u.n)u.r=!0,u.p&&(u.p=u.p.n=void 0),delete n[u.i];e._f=e._l=void 0,e[h]=0},delete:function(e){var n=m(this,t),u=b(n,e);if(u){var r=u.n,a=u.p;delete n._i[u.i],u.r=!0,a&&(a.n=r),r&&(r.p=a),n._f==u&&(n._f=r),n._l==u&&(n._l=a),n[h]--}return!!u},forEach:function(e){m(this,t);for(var n,u=d(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(u(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!b(m(this,t),e)}}),s&&u(l.prototype,"size",{get:function(){return m(this,t)[h]}}),l},def:function(e,t,n){var u,r,a=b(e,t);return a?a.v=n:(e._l=a={i:r=p(t,!0),k:t,v:n,p:u=e._l,n:void 0,r:!1},e._f||(e._f=a),u&&(u.n=a),e[h]++,"F"!==r&&(e._i[r]=a)),e},getEntry:b,setStrong:function(e,t,n){c(e,t,(function(e,n){this._t=m(e,t),this._k=n,this._l=void 0}),(function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))}),n?"entries":"values",!n,!0),f(t)}}},547:function(e,t,n){"use strict";var u=n(5),r=n(12),a=n(16),d=n(82),o=n(491),i=n(81),c=n(80),l=n(13),f=n(14),s=n(83),p=n(41),m=n(548);e.exports=function(e,t,n,h,b,v){var g=u[e],y=g,_=b?"set":"add",E=y&&y.prototype,w={},D=function(e){var t=E[e];a(E,e,"delete"==e||"has"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof y&&(v||E.forEach&&!f((function(){(new y).entries().next()})))){var k=new y,x=k[_](v?{}:-0,1)!=k,S=f((function(){k.has(1)})),C=s((function(e){new y(e)})),O=!v&&f((function(){for(var e=new y,t=5;t--;)e[_](t,t);return!e.has(-0)}));C||((y=t((function(t,n){c(t,y,e);var u=m(new g,t,y);return null!=n&&i(n,b,u[_],u),u}))).prototype=E,E.constructor=y),(S||O)&&(D("delete"),D("has"),b&&D("get")),(O||x)&&D(_),v&&E.clear&&delete E.clear}else y=h.getConstructor(t,e,b,_),d(y.prototype,n),o.NEED=!0;return p(y,e),w[e]=y,r(r.G+r.W+r.F*(y!=g),w),v||h.setStrong(y,e,b),y}},548:function(e,t,n){var u=n(13),r=n(549).set;e.exports=function(e,t,n){var a,d=t.constructor;return d!==n&&"function"==typeof d&&(a=d.prototype)!==n.prototype&&u(a)&&r&&r(e,a),e}},549:function(e,t,n){var u=n(13),r=n(8),a=function(e,t){if(r(e),!u(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,u){try{(u=n(30)(Function.call,n(550).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(r){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:u(e,n),e}}({},!1):void 0),check:a}},550:function(e,t,n){var u=n(62),r=n(57),a=n(33),d=n(87),o=n(31),i=n(86),c=Object.getOwnPropertyDescriptor;t.f=n(10)?c:function(e,t){if(e=a(e),t=d(t,!0),i)try{return c(e,t)}catch(n){}if(o(e,t))return r(!u.f.call(e,t),e[t])}},551:function(e,t,n){"use strict";var u=n(12),r=n(32),a=n(27),d=n(14),o=[].sort,i=[1,2,3];u(u.P+u.F*(d((function(){i.sort(void 0)}))||!d((function(){i.sort(null)}))||!n(552)(o)),"Array",{sort:function(e){return void 0===e?o.call(a(this)):o.call(a(this),r(e))}})},552:function(e,t,n){"use strict";var u=n(14);e.exports=function(e,t){return!!e&&u((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},561:function(e,t,n){"use strict";n(489),n(79),n(490),n(551),n(29),n(22),n(21),n(85),n(442);var u=n(1),r=(n(448),n(449),n(77),n(428),n(0)),a=n.n(r),d=n(481),o=n.n(d);n(150);var i=function(e){var t=e.humanize,n=e.icon,u=e.values,r=e.currentState,d=e.setState;if(0==u.size)return null;var i=Array.from(u);return a.a.createElement(a.a.Fragment,null,i.map((function(e,u){var i="string"==typeof e&&t?o()(e):e;return a.a.createElement("label",{key:u},a.a.createElement("input",{type:"checkbox",onChange:function(t){var n=new Set(r);t.currentTarget.checked?n.add(e):n.delete(e),d(n)},checked:r.has(e)}),i&&a.a.createElement(a.a.Fragment,null,n?a.a.createElement("i",{className:"feather icon-"+n}):""," ",i))})))},c=n(503),l=n(431),f=n(430),s=(n(440),n(451)),p=n.n(s),m=n(423),h=n.n(m),b=n(504),v=n.n(b),g=n(436);n(151);function y(e){var t=e.delivery_guarantee,n=e.description,u=e.event_types,r=e.function_category,d=(e.logo_path,e.name),o=e.pathTemplate,i=e.status,c=e.title,l=e.type,s=o;s||("source"==l&&(s="/docs/reference/sources//"),"transform"==l&&(s="/docs/reference/transforms//"),"sink"==l&&(s="/docs/reference/sinks//"));var p=s.replace("",d);return a.a.createElement(f.a,{to:p,className:"qovery-component",title:n},a.a.createElement("div",{className:"qovery-component--header"},a.a.createElement("div",{className:"qovery-component--name"},c)),a.a.createElement("div",{className:"qovery-component--badges"},"beta"==i?a.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},a.a.createElement("i",{className:"feather icon-alert-triangle"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},a.a.createElement("i",{className:"feather icon-award"})),"best_effort"==t?a.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},a.a.createElement("i",{className:"feather icon-shield-off"})):a.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},a.a.createElement("i",{className:"feather icon-shield"})),u.includes("log")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",u.includes("metric")?a.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",a.a.createElement("span",{className:"badge badge--primary"},r)))}function _(e){var t=e.components,n=e.headingLevel,r=e.pathTemplate,d=e.titles,o=t.filter((function(e){return"source"==e.type})),i=t.filter((function(e){return"transform"==e.type})),f=t.filter((function(e){return"sink"==e.type})),s="h"+(n||3);return t.length>0?a.a.createElement(a.a.Fragment,null,o.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,o.length," Sources"),a.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",i.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,i.length," Transforms"),a.a.createElement("div",{className:"qovery-components--grid"},i.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",f.length>0?a.a.createElement(a.a.Fragment,null,d&&a.a.createElement(s,null,f.length," Sinks"),a.a.createElement("div",{className:"qovery-components--grid"},f.map((function(e,t){return a.a.createElement(y,Object(u.a)({key:t,pathTemplate:r},e))})))):"",a.a.createElement("hr",null),a.a.createElement(l.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):a.a.createElement(c.a,{text:"no components found"})}t.a=function(e){var t=Object(g.a)().siteConfig.customFields.metadata,n=t.sources,u=t.transforms,d=t.sinks,o=e.titles||null==e.titles,c=1==e.filterColumn,l=e.pathTemplate,s=e.location?v.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(n))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(u))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(d))),m=m.sort((function(e,t){return e.name>t.name?1:-1}));var b=Object(r.useState)("true"==s["at-least-once"]),y=b[0],E=b[1],w=Object(r.useState)(new Set(s["event-types"]||e.eventTypes)),D=w[0],k=w[1],x=Object(r.useState)(new Set(s.functions)),S=x[0],C=x[1],O=Object(r.useState)(new Set(s["operating-systems"])),I=O[0],A=O[1],j=Object(r.useState)("true"==s["prod-ready"]),N=j[0],F=j[1],T=Object(r.useState)(new Set(s.providers)),P=T[0],M=T[1],R=Object(r.useState)(s.search),L=R[0],B=R[1];L&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(L.toLowerCase())}))),y&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),D.size>0&&(m=m.filter((function(e){return Array.from(D).some((function(t){return e.event_types.includes(t)}))}))),S.size>0&&(m=m.filter((function(e){return S.has(e.function_category)}))),I.size>0&&(m=m.filter((function(e){return Array.from(I).every((function(t){return e.operating_systems.includes(t)}))}))),N&&(m=m.filter((function(e){return"prod-ready"==e.status}))),P.size>0&&(m=m.filter((function(e){return Array.from(P).every((function(t){return e.service_providers&&e.service_providers.includes(t)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(t){return!e.exceptNames.includes(t.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(t){return!e.exceptFunctions.includes(t.function_category)})));var z=D.size>0?D:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),U=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),H=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return a.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":c})},a.a.createElement("div",{className:"filters"},a.a.createElement("div",{className:"search"},a.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return B(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Event Types",icon:"database",values:z,humanize:!0,currentState:D,setState:k}))),a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",a.a.createElement("i",{className:"feather icon-info"}))),a.a.createElement("div",{className:"filter--choices"},a.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return E(e.currentTarget.checked)},checked:y}),a.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),a.a.createElement("label",{title:"Show only production ready components."},a.a.createElement("input",{type:"checkbox",onChange:function(e){return F(e.currentTarget.checked)},checked:N}),a.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),H.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Source Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:H,humanize:!0,currentState:S,setState:C}))),$.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Transform Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:S,setState:C}))),q.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Sink Functions"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:S,setState:C}))),W.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},"Providers"),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Providers",icon:"cloud",values:W,currentState:P,setState:M}))),U.size>0&&a.a.createElement("div",{className:"filter"},a.a.createElement("div",{className:"filter--label"},a.a.createElement(f.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),a.a.createElement("div",{className:"filter--choices"},a.a.createElement(i,{label:"Operating Systems",icon:"cpu",values:U,currentState:I,setState:A})))),a.a.createElement("div",{className:"qovery-components--results"},a.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:l,titles:o})))}},563:function(e,t,n){"use strict";n.d(t,"b",(function(){return d}));var u=n(53),r={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","at-rule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},a=n(0),d={Prism:u.a,theme:r};function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return(i=Object.assign||function(e){for(var t=1;t0&&e[n-1]===t?e:e.concat(t)},s=function(e,t){var n=e.plain,u=Object.create(null),r=e.styles.reduce((function(e,n){var u=n.languages,r=n.style;return u&&!u.includes(t)||n.types.forEach((function(t){var n=i({},e[t],r);e[t]=n})),e}),u);return r.root=n,r.plain=i({},n,{backgroundColor:null}),r};function p(e,t){var n={};for(var u in e)Object.prototype.hasOwnProperty.call(e,u)&&-1===t.indexOf(u)&&(n[u]=e[u]);return n}var m=function(e){function t(){for(var t=this,n=[],u=arguments.length;u--;)n[u]=arguments[u];e.apply(this,n),o(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?s(e.theme,e.language):void 0;return t.themeDict=n})),o(this,"getLineProps",(function(e){var n=e.key,u=e.className,r=e.style,a=i({},p(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),d=t.getThemeDict(t.props);return void 0!==d&&(a.style=d.plain),void 0!==r&&(a.style=void 0!==a.style?i({},a.style,r):r),void 0!==n&&(a.key=n),u&&(a.className+=" "+u),a})),o(this,"getStyleForToken",(function(e){var n=e.types,u=e.empty,r=n.length,a=t.getThemeDict(t.props);if(void 0!==a){if(1===r&&"plain"===n[0])return u?{display:"inline-block"}:void 0;if(1===r&&!u)return a[n[0]];var d=u?{display:"inline-block"}:{},o=n.map((function(e){return a[e]}));return Object.assign.apply(Object,[d].concat(o))}})),o(this,"getTokenProps",(function(e){var n=e.key,u=e.className,r=e.style,a=e.token,d=i({},p(e,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:t.getStyleForToken(a),key:void 0});return void 0!==r&&(d.style=void 0!==d.style?i({},d.style,r):r),void 0!==n&&(d.key=n),u&&(d.className+=" "+u),d}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,u=e.code,r=e.children,a=this.getThemeDict(this.props),d=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],u=[0],r=[e.length],a=0,d=0,o=[],i=[o];d>-1;){for(;(a=u[d]++)0?p:["plain"],s=m):(p=f(p,m.type),m.alias&&(p=f(p,m.alias)),s=m.content),"string"==typeof s){var h=s.split(c),b=h.length;o.push({types:p,content:h[0]});for(var v=1;v=0)&&a(e,!n)}e.exports=t.default},568:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.assertNodeList=i,t.setElement=function(e){var t=e;if("string"==typeof t&&d.canUseDOM){var n=document.querySelectorAll(t);i(n,t),t="length"in n?n[0]:n}return o=t||o},t.validateElement=c,t.hide=function(e){c(e)&&(e||o).setAttribute("aria-hidden","true")},t.show=function(e){c(e)&&(e||o).removeAttribute("aria-hidden")},t.documentNotReadyOrSSRTesting=function(){o=null},t.resetForTesting=function(){o=null};var u,r=n(593),a=(u=r)&&u.__esModule?u:{default:u},d=n(544);var o=null;function i(e,t){if(!e||!e.length)throw new Error("react-modal: No elements were found for selector "+t+".")}function c(e){return!(!e&&!o)||((0,a.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),!1)}},569:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=new function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.register=function(e){-1===t.openInstances.indexOf(e)&&(t.openInstances.push(e),t.emit("register"))},this.deregister=function(e){var n=t.openInstances.indexOf(e);-1!==n&&(t.openInstances.splice(n,1),t.emit("deregister"))},this.subscribe=function(e){t.subscribers.push(e)},this.emit=function(e){t.subscribers.forEach((function(n){return n(e,t.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]};t.default=u,e.exports=t.default},588:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u,r=n(589),a=(u=r)&&u.__esModule?u:{default:u};t.default=a.default,e.exports=t.default},589:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bodyOpenClassName=t.portalClassName=void 0;var u=Object.assign||function(e){for(var t=1;t0&&0===(g-=1)&&f.show(t),n.props.shouldFocusAfterRender&&(n.props.shouldReturnFocusAfterClose?(c.returnFocus(),c.teardownScopedFocus()):c.popWithoutFocus()),n.props.onAfterClose&&n.props.onAfterClose(),m.default.deregister(n)},n.open=function(){n.beforeOpen(),n.state.afterOpen&&n.state.beforeClose?(clearTimeout(n.closeTimer),n.setState({beforeClose:!1})):(n.props.shouldFocusAfterRender&&(c.setupScopedFocus(n.node),c.markForFocusLater()),n.setState({isOpen:!0},(function(){n.setState({afterOpen:!0}),n.props.isOpen&&n.props.onAfterOpen&&n.props.onAfterOpen({overlayEl:n.overlay,contentEl:n.content})})))},n.close=function(){n.props.closeTimeoutMS>0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus()},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},(function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())}))},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){9===e.keyCode&&(0,l.default)(n.content,e),n.props.shouldCloseOnEsc&&27===e.keyCode&&(e.stopPropagation(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnMouseUp=function(){n.shouldClose=!1},n.handleOverlayOnMouseDown=function(e){n.props.shouldCloseOnOverlayClick||e.target!=n.overlay||e.preventDefault()},n.handleContentOnClick=function(){n.shouldClose=!1},n.handleContentOnMouseDown=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var u="object"===(void 0===t?"undefined":r(t))?t:{base:v[e],afterOpen:v[e]+"--after-open",beforeClose:v[e]+"--before-close"},a=u.base;return n.state.afterOpen&&(a=a+" "+u.afterOpen),n.state.beforeClose&&(a=a+" "+u.beforeClose),"string"==typeof t&&t?a+" "+t:a},n.attributesFromObject=function(e,t){return Object.keys(t).reduce((function(n,u){return n[e+"-"+u]=t[u],n}),{})},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n.moveFromContentToOverlay=null,n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&this.open()}},{key:"componentDidUpdate",value:function(e,t){this.props.isOpen&&!e.isOpen?this.open():!this.props.isOpen&&e.isOpen&&this.close(),this.props.shouldFocusAfterRender&&this.state.isOpen&&!t.isOpen&&this.focusContent()}},{key:"componentWillUnmount",value:function(){this.state.isOpen&&this.afterClose(),clearTimeout(this.closeTimer)}},{key:"beforeOpen",value:function(){var e=this.props,t=e.appElement,n=e.ariaHideApp,u=e.htmlOpenClassName,r=e.bodyOpenClassName;r&&s.add(document.body,r),u&&s.add(document.getElementsByTagName("html")[0],u),n&&(g+=1,f.hide(t)),m.default.register(this)}},{key:"render",value:function(){var e=this.props,t=e.id,n=e.className,r=e.overlayClassName,a=e.defaultStyles,d=n?{}:a.content,i=r?{}:a.overlay;return this.shouldBeClosed()?null:o.default.createElement("div",{ref:this.setOverlayRef,className:this.buildClassName("overlay",r),style:u({},i,this.props.style.overlay),onClick:this.handleOverlayOnClick,onMouseDown:this.handleOverlayOnMouseDown},o.default.createElement("div",u({id:t,ref:this.setContentRef,style:u({},d,this.props.style.content),className:this.buildClassName("content",n),tabIndex:"-1",onKeyDown:this.handleKeyDown,onMouseDown:this.handleContentOnMouseDown,onMouseUp:this.handleContentOnMouseUp,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.attributesFromObject("aria",this.props.aria||{}),this.attributesFromObject("data",this.props.data||{}),{"data-testid":this.props.testId}),this.props.children))}}]),t}(d.Component);y.defaultProps={style:{overlay:{},content:{}},defaultStyles:{}},y.propTypes={isOpen:i.default.bool.isRequired,defaultStyles:i.default.shape({content:i.default.object,overlay:i.default.object}),style:i.default.shape({content:i.default.object,overlay:i.default.object}),className:i.default.oneOfType([i.default.string,i.default.object]),overlayClassName:i.default.oneOfType([i.default.string,i.default.object]),bodyOpenClassName:i.default.string,htmlOpenClassName:i.default.string,ariaHideApp:i.default.bool,appElement:i.default.instanceOf(p.default),onAfterOpen:i.default.func,onAfterClose:i.default.func,onRequestClose:i.default.func,closeTimeoutMS:i.default.number,shouldFocusAfterRender:i.default.bool,shouldCloseOnOverlayClick:i.default.bool,shouldReturnFocusAfterClose:i.default.bool,role:i.default.string,contentLabel:i.default.string,aria:i.default.object,data:i.default.object,children:i.default.node,shouldCloseOnEsc:i.default.bool,overlayRef:i.default.func,contentRef:i.default.func,id:i.default.string,testId:i.default.string},t.default=y,e.exports=t.default},591:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=c,t.handleFocus=l,t.markForFocusLater=function(){d.push(document.activeElement)},t.returnFocus=function(){var e=null;try{return void(0!==d.length&&(e=d.pop()).focus())}catch(t){console.warn(["You tried to return focus to",e,"but it is not in the DOM anymore"].join(" "))}},t.popWithoutFocus=function(){d.length>0&&d.pop()},t.setupScopedFocus=function(e){o=e,window.addEventListener?(window.addEventListener("blur",c,!1),document.addEventListener("focus",l,!0)):(window.attachEvent("onBlur",c),document.attachEvent("onFocus",l))},t.teardownScopedFocus=function(){o=null,window.addEventListener?(window.removeEventListener("blur",c),document.removeEventListener("focus",l)):(window.detachEvent("onBlur",c),document.detachEvent("onFocus",l))};var u,r=n(567),a=(u=r)&&u.__esModule?u:{default:u};var d=[],o=null,i=!1;function c(){i=!0}function l(){if(i){if(i=!1,!o)return;setTimeout((function(){o.contains(document.activeElement)||((0,a.default)(o)[0]||o).focus()}),0)}}},592:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=(0,a.default)(e);if(!n.length)return void t.preventDefault();var u=void 0,r=t.shiftKey,d=n[0],o=n[n.length-1];if(e===document.activeElement){if(!r)return;u=o}o!==document.activeElement||r||(u=d);d===document.activeElement&&r&&(u=o);if(u)return t.preventDefault(),void u.focus();var i=/(\bChrome\b|\bSafari\b)\//.exec(navigator.userAgent);if(null==i||"Chrome"==i[1]||null!=/\biPod\b|\biPad\b/g.exec(navigator.userAgent))return;var c=n.indexOf(document.activeElement);c>-1&&(c+=r?-1:1);if(void 0===(u=n[c]))return t.preventDefault(),void(u=r?o:d).focus();t.preventDefault(),u.focus()};var u,r=n(567),a=(u=r)&&u.__esModule?u:{default:u};e.exports=t.default},593:function(e,t,n){"use strict";var u=function(){};e.exports=u},594:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dumpClassLists=function(){0};var u={},r={};t.add=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]||(e[t]=0),e[t]+=1}(a,e),n.add(e)}));var n,a},t.remove=function(e,t){return n=e.classList,a="html"==e.nodeName.toLowerCase()?u:r,void t.split(" ").forEach((function(e){!function(e,t){e[t]&&(e[t]-=1)}(a,e),0===a[e]&&n.remove(e)}));var n,a}},595:function(e,t,n){"use strict";var u,r=n(569),a=(u=r)&&u.__esModule?u:{default:u};var d=void 0,o=void 0,i=[];function c(){0!==i.length&&i[i.length-1].focusContent()}a.default.subscribe((function(e,t){d&&o||((d=document.createElement("div")).setAttribute("data-react-modal-body-trap",""),d.style.position="absolute",d.style.opacity="0",d.setAttribute("tabindex","0"),d.addEventListener("focus",c),(o=d.cloneNode()).addEventListener("focus",c)),(i=t).length>0?(document.body.firstChild!==d&&document.body.insertBefore(d,document.body.firstChild),document.body.lastChild!==o&&document.body.appendChild(o)):(d.parentElement&&d.parentElement.removeChild(d),o.parentElement&&o.parentElement.removeChild(o))}))},596:function(e,t,n){"use strict";function u(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function r(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function a(e,t){try{var n=this.props,u=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,u)}finally{this.props=n,this.state=u}}function d(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"!=typeof e.getDerivedStateFromProps&&"function"!=typeof t.getSnapshotBeforeUpdate)return e;var n=null,d=null,o=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?d="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(d="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?o="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(o="UNSAFE_componentWillUpdate"),null!==n||null!==d||null!==o){var i=e.displayName||e.name,c="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+c+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==d?"\n "+d:"")+(null!==o?"\n "+o:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=u,t.componentWillReceiveProps=r),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=a;var l=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var u=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;l.call(this,e,t,u)}}return e}n.r(t),n.d(t,"polyfill",(function(){return d})),u.__suppressDeprecationWarning=!0,r.__suppressDeprecationWarning=!0,a.__suppressDeprecationWarning=!0},597:function(e,t,n){var u;!function(r){"use strict";var a,d,o,i=(a=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,d=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,o=/[^-+\dA-Z]/g,function(e,t,n,u){if(1!==arguments.length||"string"!==s(e)||/\d/.test(e)||(t=e,e=void 0),(e=e||new Date)instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");var r=(t=String(i.masks[t]||t||i.masks.default)).slice(0,4);"UTC:"!==r&&"GMT:"!==r||(t=t.slice(4),n=!0,"GMT:"===r&&(u=!0));var p=n?"getUTC":"get",m=e[p+"Date"](),h=e[p+"Day"](),b=e[p+"Month"](),v=e[p+"FullYear"](),g=e[p+"Hours"](),y=e[p+"Minutes"](),_=e[p+"Seconds"](),E=e[p+"Milliseconds"](),w=n?0:e.getTimezoneOffset(),D=l(e),k=f(e),x={d:m,dd:c(m),ddd:i.i18n.dayNames[h],dddd:i.i18n.dayNames[h+7],m:b+1,mm:c(b+1),mmm:i.i18n.monthNames[b],mmmm:i.i18n.monthNames[b+12],yy:String(v).slice(2),yyyy:v,h:g%12||12,hh:c(g%12||12),H:g,HH:c(g),M:y,MM:c(y),s:_,ss:c(_),l:c(E,3),L:c(Math.round(E/10)),t:g<12?i.i18n.timeNames[0]:i.i18n.timeNames[1],tt:g<12?i.i18n.timeNames[2]:i.i18n.timeNames[3],T:g<12?i.i18n.timeNames[4]:i.i18n.timeNames[5],TT:g<12?i.i18n.timeNames[6]:i.i18n.timeNames[7],Z:u?"GMT":n?"UTC":(String(e).match(d)||[""]).pop().replace(o,""),o:(w>0?"-":"+")+c(100*Math.floor(Math.abs(w)/60)+Math.abs(w)%60,4),S:["th","st","nd","rd"][m%10>3?0:(m%100-m%10!=10)*m%10],W:D,N:k};return t.replace(a,(function(e){return e in x?x[e]:e.slice(1,e.length-1)}))});function c(e,t){for(e=String(e),t=t||2;e.length0)&&(e.unobserve(n),e.disconnect(),r())}))}))).observe(n))},to:f})):i.a.createElement("a",Object(r.a)({},t,{href:f}))}},432:function(t,e,n){"use strict";function r(t){return!1===/^(https?:|\/\/)/.test(t)}n.d(e,"a",(function(){return r}))},436:function(t,e,n){"use strict";var r=n(0),o=n(69);e.a=function(){return Object(r.useContext)(o.a)}},438:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));n(473);var r=n(436);function o(t){var e=(Object(r.a)().siteConfig||{}).baseUrl,n=void 0===e?"/":e;if(!t)return t;return/^(https?:|\/\/)/.test(t)?t:t.startsWith("/")?n+t.slice(1):n+t}},443:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(584);e.a=function(t){return o.a.createElement(i.a,t)}},446:function(t,e,n){"use strict";var r=n(12),o=n(96)(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),n(74)("includes")},447:function(t,e,n){"use strict";var r=n(12),o=n(517);r(r.P+r.F*n(518)("includes"),"String",{includes:function(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},473:function(t,e,n){"use strict";var r=n(12),o=n(26),i=n(517),a="".startsWith;r(r.P+r.F*n(518)("startsWith"),"String",{startsWith:function(t){var e=i(this,t,"startsWith"),n=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},517:function(t,e,n){var r=n(95),o=n(34);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(t))}},518:function(t,e,n){var r=n(2)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(o){}}return!0}},584:function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return yt}));var r,o,i,a,c=n(15),u=n.n(c),s=n(585),f=n.n(s),l=n(586),p=n.n(l),d=n(0),h=n.n(d),y=n(51),m=n.n(y),b="bodyAttributes",v="htmlAttributes",T="titleAttributes",g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},w=(Object.keys(g).map((function(t){return g[t]})),"charset"),O="cssText",A="href",C="http-equiv",E="innerHTML",S="itemprop",j="name",P="property",k="rel",x="src",I="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},M="defaultTitle",R="defer",N="encodeSpecialCharacters",D="onChangeClientState",H="titleTemplate",q=Object.keys(L).reduce((function(t,e){return t[L[e]]=e,t}),{}),F=[g.NOSCRIPT,g.SCRIPT,g.STYLE],_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},U=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},Y=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},K=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},z=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},J=function(t){var e=X(t,g.TITLE),n=X(t,H);if(n&&e)return n.replace(/%s/g,(function(){return Array.isArray(e)?e.join(""):e}));var r=X(t,M);return e||r||void 0},$=function(t){return X(t,D)||function(){}},G=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return B({},t,e)}),{})},Q=function(t,e){return e.filter((function(t){return void 0!==t[g.BASE]})).map((function(t){return t[g.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},Z=(r=Date.now(),function(t){var e=Date.now();e-r>16?(r=e,t(e)):setTimeout((function(){Z(t)}),0)}),tt=function(t){return clearTimeout(t)},et="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||Z:t.requestAnimationFrame||Z,nt="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||tt:t.cancelAnimationFrame||tt,rt=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},ot=null,it=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.onChangeClientState,s=t.scriptTags,f=t.styleTags,l=t.title,p=t.titleAttributes;ut(g.BODY,r),ut(g.HTML,o),ct(l,p);var d={baseTag:st(g.BASE,n),linkTags:st(g.LINK,i),metaTags:st(g.META,a),noscriptTags:st(g.NOSCRIPT,c),scriptTags:st(g.SCRIPT,s),styleTags:st(g.STYLE,f)},h={},y={};Object.keys(d).forEach((function(t){var e=d[t],n=e.newTags,r=e.oldTags;n.length&&(h[t]=n),r.length&&(y[t]=d[t].oldTags)})),e&&e(),u(t,h,y)},at=function(t){return Array.isArray(t)?t.join(""):t},ct=function(t,e){void 0!==t&&document.title!==t&&(document.title=at(t)),ut(g.TITLE,e)},ut=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute("data-react-helmet"),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(e),c=0;c=0;l--)n.removeAttribute(i[l]);o.length===i.length?n.removeAttribute("data-react-helmet"):n.getAttribute("data-react-helmet")!==a.join(",")&&n.setAttribute("data-react-helmet",a.join(","))}},st=function(t,e){var n=document.head||document.querySelector(g.HEAD),r=n.querySelectorAll(t+"[data-react-helmet]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===E)n.innerHTML=e.innerHTML;else if(r===O)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var c=void 0===e[r]?"":e[r];n.setAttribute(r,c)}n.setAttribute("data-react-helmet","true"),o.some((function(t,e){return a=e,n.isEqualNode(t)}))?o.splice(a,1):i.push(n)})),o.forEach((function(t){return t.parentNode.removeChild(t)})),i.forEach((function(t){return n.appendChild(t)})),{oldTags:o,newTags:i}},ft=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[L[n]||n]=t[n],e}),e)},pt=function(t,e,n){switch(t){case g.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})["data-react-helmet"]=!0,o=lt(n,r),[h.a.createElement(g.TITLE,o,t)];var t,n,r,o},toString:function(){return function(t,e,n,r){var o=ft(n),i=at(e);return o?"<"+t+' data-react-helmet="true" '+o+">"+z(i,r)+"":"<"+t+' data-react-helmet="true">'+z(i,r)+""}(t,e.title,e.titleAttributes,n)}};case b:case v:return{toComponent:function(){return lt(e)},toString:function(){return ft(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,o=((r={key:n})["data-react-helmet"]=!0,r);return Object.keys(e).forEach((function(t){var n=L[t]||t;if(n===E||n===O){var r=e.innerHTML||e.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=e[t]})),h.a.createElement(t,o)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var o=Object.keys(r).filter((function(t){return!(t===E||t===O)})).reduce((function(t,e){var o=void 0===r[e]?e:e+'="'+z(r[e],n)+'"';return t?t+" "+o:o}),""),i=r.innerHTML||r.cssText||"",a=-1===F.indexOf(t);return e+"<"+t+' data-react-helmet="true" '+o+(a?"/>":">"+i+"")}),"")}(t,e,n)}}}},dt=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.scriptTags,s=t.styleTags,f=t.title,l=void 0===f?"":f,p=t.titleAttributes;return{base:pt(g.BASE,e,r),bodyAttributes:pt(b,n,r),htmlAttributes:pt(v,o,r),link:pt(g.LINK,i,r),meta:pt(g.META,a,r),noscript:pt(g.NOSCRIPT,c,r),script:pt(g.SCRIPT,u,r),style:pt(g.STYLE,s,r),title:pt(g.TITLE,{title:l,titleAttributes:p},r)}},ht=f()((function(t){return{baseTag:Q([A,I],t),bodyAttributes:G(b,t),defer:X(t,R),encode:X(t,N),htmlAttributes:G(v,t),linkTags:V(g.LINK,[k,A],t),metaTags:V(g.META,[j,w,C,P,S],t),noscriptTags:V(g.NOSCRIPT,[E],t),onChangeClientState:$(t),scriptTags:V(g.SCRIPT,[x,E],t),styleTags:V(g.STYLE,[O],t),title:J(t),titleAttributes:G(T,t)}}),(function(t){ot&&nt(ot),t.defer?ot=et((function(){it(t,(function(){ot=null}))})):(it(t),ot=null)}),dt)((function(){return null})),yt=(o=ht,a=i=function(t){function e(){return U(this,e),K(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!p()(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:e};case g.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,r=t.arrayTypeChildren,o=t.newChildProps,i=t.nestedChildren;return B({},r,((e={})[n.type]=[].concat(r[n.type]||[],[B({},o,this.mapNestedChildrenToProps(n,i))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,r=t.child,o=t.newProps,i=t.newChildProps,a=t.nestedChildren;switch(r.type){case g.TITLE:return B({},o,((e={})[r.type]=a,e.titleAttributes=B({},i),e));case g.BODY:return B({},o,{bodyAttributes:B({},i)});case g.HTML:return B({},o,{htmlAttributes:B({},i)})}return B({},o,((n={})[r.type]=B({},i),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=B({},e);return Object.keys(t).forEach((function(e){var r;n=B({},n,((r={})[e]=t[e],r))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return h.a.Children.forEach(t,(function(t){if(t&&t.props){var o=t.props,i=o.children,a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[q[n]||n]=t[n],e}),e)}(W(o,["children"]));switch(n.warnOnInvalidChildren(t,i),t.type){case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:a,nestedChildren:i});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:a,nestedChildren:i})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=W(t,["children"]),r=B({},n);return e&&(r=this.mapChildrenToProps(e,r)),h.a.createElement(o,r)},Y(e,null,[{key:"canUseDOM",set:function(t){o.canUseDOM=t}}]),e}(h.a.Component),i.propTypes={base:u.a.object,bodyAttributes:u.a.object,children:u.a.oneOfType([u.a.arrayOf(u.a.node),u.a.node]),defaultTitle:u.a.string,defer:u.a.bool,encodeSpecialCharacters:u.a.bool,htmlAttributes:u.a.object,link:u.a.arrayOf(u.a.object),meta:u.a.arrayOf(u.a.object),noscript:u.a.arrayOf(u.a.object),onChangeClientState:u.a.func,script:u.a.arrayOf(u.a.object),style:u.a.arrayOf(u.a.object),title:u.a.string,titleAttributes:u.a.object,titleTemplate:u.a.string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var t=o.rewind();return t||(t=dt({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},a);yt.renderStatic=yt.rewind}).call(this,n(76))},585:function(t,e,n){"use strict";var r,o=n(0),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var c=!("undefined"==typeof window||!window.document||!window.document.createElement);t.exports=function(t,e,n){if("function"!=typeof t)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof e)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var u,s=[];function f(){u=t(s.map((function(t){return t.props}))),l.canUseDOM?e(u):n&&(u=n(u))}var l=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,o.peek=function(){return u},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var t=u;return u=void 0,s=[],t};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){s.push(this),f()},a.componentDidUpdate=function(){f()},a.componentWillUnmount=function(){var t=s.indexOf(this);s.splice(t,1),f()},a.render=function(){return i.createElement(r,this.props)},o}(o.PureComponent);return a(l,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),a(l,"canUseDOM",c),l}}},586:function(t,e,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;t.exports=function(t,e){try{return function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var c,u,s,f=r(e),l=r(n);if(f&&l){if((u=e.length)!=n.length)return!1;for(c=u;0!=c--;)if(!t(e[c],n[c]))return!1;return!0}if(f!=l)return!1;var p=e instanceof Date,d=n instanceof Date;if(p!=d)return!1;if(p&&d)return e.getTime()==n.getTime();var h=e instanceof RegExp,y=n instanceof RegExp;if(h!=y)return!1;if(h&&y)return e.toString()==n.toString();var m=o(e);if((u=m.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,m[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(s=m[c])&&e.$$typeof||t(e[s],n[s])))return!1;return!0}return e!=e&&n!=n}(t,e)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{430:function(t,e,n){"use strict";var r=n(1),o=n(0),i=n.n(o),a=n(39),c=n(432),u=n(20),s=n.n(u);e.a=function(t){var e,n=t.to,u=t.href,f=n||u,l=Object(c.a)(f),p=Object(o.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&l&&window.docusaurus.prefetch(f),function(){d&&e&&e.disconnect()}}),[f,d,l]),f&&l?i.a.createElement(a.b,Object(r.a)({},t,{onMouseEnter:function(){p.current||(window.docusaurus.preload(f),p.current=!0)},innerRef:function(t){var n,r;d&&t&&l&&(n=t,r=function(){window.docusaurus.prefetch(f)},(e=new window.IntersectionObserver((function(t){t.forEach((function(t){n===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(e.unobserve(n),e.disconnect(),r())}))}))).observe(n))},to:f})):i.a.createElement("a",Object(r.a)({},t,{href:f}))}},432:function(t,e,n){"use strict";function r(t){return!1===/^(https?:|\/\/)/.test(t)}n.d(e,"a",(function(){return r}))},436:function(t,e,n){"use strict";var r=n(0),o=n(69);e.a=function(){return Object(r.useContext)(o.a)}},438:function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));n(473);var r=n(436);function o(t){var e=(Object(r.a)().siteConfig||{}).baseUrl,n=void 0===e?"/":e;if(!t)return t;return/^(https?:|\/\/)/.test(t)?t:t.startsWith("/")?n+t.slice(1):n+t}},444:function(t,e,n){"use strict";var r=n(0),o=n.n(r),i=n(584);e.a=function(t){return o.a.createElement(i.a,t)}},448:function(t,e,n){"use strict";var r=n(12),o=n(96)(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),n(74)("includes")},449:function(t,e,n){"use strict";var r=n(12),o=n(517);r(r.P+r.F*n(518)("includes"),"String",{includes:function(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:void 0)}})},473:function(t,e,n){"use strict";var r=n(12),o=n(26),i=n(517),a="".startsWith;r(r.P+r.F*n(518)("startsWith"),"String",{startsWith:function(t){var e=i(this,t,"startsWith"),n=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},517:function(t,e,n){var r=n(95),o=n(34);t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(t))}},518:function(t,e,n){var r=n(2)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(o){}}return!0}},584:function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return yt}));var r,o,i,a,c=n(15),u=n.n(c),s=n(585),f=n.n(s),l=n(586),p=n.n(l),d=n(0),h=n.n(d),y=n(51),m=n.n(y),b="bodyAttributes",v="htmlAttributes",T="titleAttributes",g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},w=(Object.keys(g).map((function(t){return g[t]})),"charset"),O="cssText",A="href",C="http-equiv",E="innerHTML",S="itemprop",j="name",P="property",k="rel",x="src",I="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},M="defaultTitle",R="defer",N="encodeSpecialCharacters",D="onChangeClientState",H="titleTemplate",q=Object.keys(L).reduce((function(t,e){return t[L[e]]=e,t}),{}),F=[g.NOSCRIPT,g.SCRIPT,g.STYLE],_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},U=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},Y=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},K=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},z=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},J=function(t){var e=X(t,g.TITLE),n=X(t,H);if(n&&e)return n.replace(/%s/g,(function(){return Array.isArray(e)?e.join(""):e}));var r=X(t,M);return e||r||void 0},$=function(t){return X(t,D)||function(){}},G=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return B({},t,e)}),{})},Q=function(t,e){return e.filter((function(t){return void 0!==t[g.BASE]})).map((function(t){return t[g.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},Z=(r=Date.now(),function(t){var e=Date.now();e-r>16?(r=e,t(e)):setTimeout((function(){Z(t)}),0)}),tt=function(t){return clearTimeout(t)},et="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||Z:t.requestAnimationFrame||Z,nt="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||tt:t.cancelAnimationFrame||tt,rt=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},ot=null,it=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.onChangeClientState,s=t.scriptTags,f=t.styleTags,l=t.title,p=t.titleAttributes;ut(g.BODY,r),ut(g.HTML,o),ct(l,p);var d={baseTag:st(g.BASE,n),linkTags:st(g.LINK,i),metaTags:st(g.META,a),noscriptTags:st(g.NOSCRIPT,c),scriptTags:st(g.SCRIPT,s),styleTags:st(g.STYLE,f)},h={},y={};Object.keys(d).forEach((function(t){var e=d[t],n=e.newTags,r=e.oldTags;n.length&&(h[t]=n),r.length&&(y[t]=d[t].oldTags)})),e&&e(),u(t,h,y)},at=function(t){return Array.isArray(t)?t.join(""):t},ct=function(t,e){void 0!==t&&document.title!==t&&(document.title=at(t)),ut(g.TITLE,e)},ut=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute("data-react-helmet"),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(e),c=0;c=0;l--)n.removeAttribute(i[l]);o.length===i.length?n.removeAttribute("data-react-helmet"):n.getAttribute("data-react-helmet")!==a.join(",")&&n.setAttribute("data-react-helmet",a.join(","))}},st=function(t,e){var n=document.head||document.querySelector(g.HEAD),r=n.querySelectorAll(t+"[data-react-helmet]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===E)n.innerHTML=e.innerHTML;else if(r===O)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var c=void 0===e[r]?"":e[r];n.setAttribute(r,c)}n.setAttribute("data-react-helmet","true"),o.some((function(t,e){return a=e,n.isEqualNode(t)}))?o.splice(a,1):i.push(n)})),o.forEach((function(t){return t.parentNode.removeChild(t)})),i.forEach((function(t){return n.appendChild(t)})),{oldTags:o,newTags:i}},ft=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[L[n]||n]=t[n],e}),e)},pt=function(t,e,n){switch(t){case g.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})["data-react-helmet"]=!0,o=lt(n,r),[h.a.createElement(g.TITLE,o,t)];var t,n,r,o},toString:function(){return function(t,e,n,r){var o=ft(n),i=at(e);return o?"<"+t+' data-react-helmet="true" '+o+">"+z(i,r)+"":"<"+t+' data-react-helmet="true">'+z(i,r)+""}(t,e.title,e.titleAttributes,n)}};case b:case v:return{toComponent:function(){return lt(e)},toString:function(){return ft(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,o=((r={key:n})["data-react-helmet"]=!0,r);return Object.keys(e).forEach((function(t){var n=L[t]||t;if(n===E||n===O){var r=e.innerHTML||e.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=e[t]})),h.a.createElement(t,o)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var o=Object.keys(r).filter((function(t){return!(t===E||t===O)})).reduce((function(t,e){var o=void 0===r[e]?e:e+'="'+z(r[e],n)+'"';return t?t+" "+o:o}),""),i=r.innerHTML||r.cssText||"",a=-1===F.indexOf(t);return e+"<"+t+' data-react-helmet="true" '+o+(a?"/>":">"+i+"")}),"")}(t,e,n)}}}},dt=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,c=t.noscriptTags,u=t.scriptTags,s=t.styleTags,f=t.title,l=void 0===f?"":f,p=t.titleAttributes;return{base:pt(g.BASE,e,r),bodyAttributes:pt(b,n,r),htmlAttributes:pt(v,o,r),link:pt(g.LINK,i,r),meta:pt(g.META,a,r),noscript:pt(g.NOSCRIPT,c,r),script:pt(g.SCRIPT,u,r),style:pt(g.STYLE,s,r),title:pt(g.TITLE,{title:l,titleAttributes:p},r)}},ht=f()((function(t){return{baseTag:Q([A,I],t),bodyAttributes:G(b,t),defer:X(t,R),encode:X(t,N),htmlAttributes:G(v,t),linkTags:V(g.LINK,[k,A],t),metaTags:V(g.META,[j,w,C,P,S],t),noscriptTags:V(g.NOSCRIPT,[E],t),onChangeClientState:$(t),scriptTags:V(g.SCRIPT,[x,E],t),styleTags:V(g.STYLE,[O],t),title:J(t),titleAttributes:G(T,t)}}),(function(t){ot&&nt(ot),t.defer?ot=et((function(){it(t,(function(){ot=null}))})):(it(t),ot=null)}),dt)((function(){return null})),yt=(o=ht,a=i=function(t){function e(){return U(this,e),K(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!p()(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:e};case g.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,r=t.arrayTypeChildren,o=t.newChildProps,i=t.nestedChildren;return B({},r,((e={})[n.type]=[].concat(r[n.type]||[],[B({},o,this.mapNestedChildrenToProps(n,i))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,r=t.child,o=t.newProps,i=t.newChildProps,a=t.nestedChildren;switch(r.type){case g.TITLE:return B({},o,((e={})[r.type]=a,e.titleAttributes=B({},i),e));case g.BODY:return B({},o,{bodyAttributes:B({},i)});case g.HTML:return B({},o,{htmlAttributes:B({},i)})}return B({},o,((n={})[r.type]=B({},i),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=B({},e);return Object.keys(t).forEach((function(e){var r;n=B({},n,((r={})[e]=t[e],r))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return h.a.Children.forEach(t,(function(t){if(t&&t.props){var o=t.props,i=o.children,a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[q[n]||n]=t[n],e}),e)}(W(o,["children"]));switch(n.warnOnInvalidChildren(t,i),t.type){case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:a,nestedChildren:i});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:a,nestedChildren:i})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=W(t,["children"]),r=B({},n);return e&&(r=this.mapChildrenToProps(e,r)),h.a.createElement(o,r)},Y(e,null,[{key:"canUseDOM",set:function(t){o.canUseDOM=t}}]),e}(h.a.Component),i.propTypes={base:u.a.object,bodyAttributes:u.a.object,children:u.a.oneOfType([u.a.arrayOf(u.a.node),u.a.node]),defaultTitle:u.a.string,defer:u.a.bool,encodeSpecialCharacters:u.a.bool,htmlAttributes:u.a.object,link:u.a.arrayOf(u.a.object),meta:u.a.arrayOf(u.a.object),noscript:u.a.arrayOf(u.a.object),onChangeClientState:u.a.func,script:u.a.arrayOf(u.a.object),style:u.a.arrayOf(u.a.object),title:u.a.string,titleAttributes:u.a.object,titleTemplate:u.a.string},i.defaultProps={defer:!0,encodeSpecialCharacters:!0},i.peek=o.peek,i.rewind=function(){var t=o.rewind();return t||(t=dt({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},a);yt.renderStatic=yt.rewind}).call(this,n(76))},585:function(t,e,n){"use strict";var r,o=n(0),i=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var c=!("undefined"==typeof window||!window.document||!window.document.createElement);t.exports=function(t,e,n){if("function"!=typeof t)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof e)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var u,s=[];function f(){u=t(s.map((function(t){return t.props}))),l.canUseDOM?e(u):n&&(u=n(u))}var l=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,o.peek=function(){return u},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var t=u;return u=void 0,s=[],t};var a=o.prototype;return a.UNSAFE_componentWillMount=function(){s.push(this),f()},a.componentDidUpdate=function(){f()},a.componentWillUnmount=function(){var t=s.indexOf(this);s.splice(t,1),f()},a.render=function(){return i.createElement(r,this.props)},o}(o.PureComponent);return a(l,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),a(l,"canUseDOM",c),l}}},586:function(t,e,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;t.exports=function(t,e){try{return function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var c,u,s,f=r(e),l=r(n);if(f&&l){if((u=e.length)!=n.length)return!1;for(c=u;0!=c--;)if(!t(e[c],n[c]))return!1;return!0}if(f!=l)return!1;var p=e instanceof Date,d=n instanceof Date;if(p!=d)return!1;if(p&&d)return e.getTime()==n.getTime();var h=e instanceof RegExp,y=n instanceof RegExp;if(h!=y)return!1;if(h&&y)return e.toString()==n.toString();var m=o(e);if((u=m.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,m[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(s=m[c])&&e.$$typeof||t(e[s],n[s])))return!1;return!0}return e!=e&&n!=n}(t,e)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}}}]); \ No newline at end of file diff --git a/2121549d.83e910bc.js b/2121549d.e1f693a0.js similarity index 99% rename from 2121549d.83e910bc.js rename to 2121549d.e1f693a0.js index dc5708f61d..b0b8f7b8a8 100644 --- a/2121549d.83e910bc.js +++ b/2121549d.e1f693a0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{193:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(449),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(448),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{193:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(447),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(446),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/270.ce4f4441.js b/270.0b2e77a4.js similarity index 98% rename from 270.ce4f4441.js rename to 270.0b2e77a4.js index a8510ceb54..c0306c5888 100644 --- a/270.ce4f4441.js +++ b/270.0b2e77a4.js @@ -1,2 +1,2 @@ -/*! For license information please see 270.ce4f4441.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[270],{423:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:b,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(F,e))}))):null)}))),(m||o)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},Q=t(462),H=t(463),V=t(3);t(138);a.a=function(e){var a=Object(g.a)().siteConfig,t=void 0===a?{}:a,n=t.favicon,c=(t.tagline,t.title),i=t.themeConfig.image,s=t.url,m=e.children,u=e.title,d=e.noFooter,b=e.description,h=e.image,v=e.keywords,f=(e.permalink,e.version),E=u?u+" | "+c:c,p=h||i,_=s+Object(y.a)(p),k=Object(y.a)(n),w=Object(V.h)(),N=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(H.a,null,r.a.createElement(Q.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),E&&r.a.createElement("title",null,E),E&&r.a.createElement("meta",{property:"og:title",content:E}),n&&r.a.createElement("link",{rel:"shortcut icon",href:k}),b&&r.a.createElement("meta",{name:"description",content:b}),b&&r.a.createElement("meta",{property:"og:description",content:b}),f&&r.a.createElement("meta",{name:"docsearch:version",content:f}),v&&v.length&&r.a.createElement("meta",{name:"keywords",content:v.join(",")}),p&&r.a.createElement("meta",{property:"og:image",content:_}),p&&r.a.createElement("meta",{property:"twitter:image",content:_}),p&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+E}),N&&r.a.createElement("meta",{property:"og:url",content:N}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),N&&r.a.createElement("link",{rel:"canonical",href:N})),r.a.createElement(l.a,null),r.a.createElement(I,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(q,null)))}},454:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r},564:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(445);a.default=function(){return r.a.createElement(l.a,{title:"Page Not Found"},r.a.createElement("div",{className:"container margin-vert--xl"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col col--6 col--offset-3"},r.a.createElement("h1",{className:"hero__title"},"Page Not Found"),r.a.createElement("p",null,"We could not find what you were looking for."),r.a.createElement("p",null,"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))}}}]); \ No newline at end of file +/*! For license information please see 270.0b2e77a4.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[270],{423:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:b,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(F,e))}))):null)}))),(m||o)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:A.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,o),r.a.createElement("br",null))))},Q=t(462),H=t(463),V=t(3);t(138);a.a=function(e){var a=Object(g.a)().siteConfig,t=void 0===a?{}:a,n=t.favicon,c=(t.tagline,t.title),i=t.themeConfig.image,s=t.url,m=e.children,u=e.title,d=e.noFooter,b=e.description,h=e.image,v=e.keywords,f=(e.permalink,e.version),E=u?u+" | "+c:c,p=h||i,_=s+Object(y.a)(p),k=Object(y.a)(n),w=Object(V.h)(),N=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(H.a,null,r.a.createElement(Q.a,null,r.a.createElement(o.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),E&&r.a.createElement("title",null,E),E&&r.a.createElement("meta",{property:"og:title",content:E}),n&&r.a.createElement("link",{rel:"shortcut icon",href:k}),b&&r.a.createElement("meta",{name:"description",content:b}),b&&r.a.createElement("meta",{property:"og:description",content:b}),f&&r.a.createElement("meta",{name:"docsearch:version",content:f}),v&&v.length&&r.a.createElement("meta",{name:"keywords",content:v.join(",")}),p&&r.a.createElement("meta",{property:"og:image",content:_}),p&&r.a.createElement("meta",{property:"twitter:image",content:_}),p&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+E}),N&&r.a.createElement("meta",{property:"og:url",content:N}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),N&&r.a.createElement("link",{rel:"canonical",href:N})),r.a.createElement(l.a,null),r.a.createElement(I,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(q,null)))}},454:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r},564:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(445);a.default=function(){return r.a.createElement(l.a,{title:"Page Not Found"},r.a.createElement("div",{className:"container margin-vert--xl"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col col--6 col--offset-3"},r.a.createElement("h1",{className:"hero__title"},"Page Not Found"),r.a.createElement("p",null,"We could not find what you were looking for."),r.a.createElement("p",null,"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))}}}]); \ No newline at end of file diff --git a/270.ce4f4441.js.LICENSE.txt b/270.0b2e77a4.js.LICENSE.txt similarity index 100% rename from 270.ce4f4441.js.LICENSE.txt rename to 270.0b2e77a4.js.LICENSE.txt diff --git a/2ea1d02e.d9f09dbd.js b/2ea1d02e.e074ce0d.js similarity index 98% rename from 2ea1d02e.d9f09dbd.js rename to 2ea1d02e.e074ce0d.js index a47b59c1ce..de6969ca45 100644 --- a/2ea1d02e.d9f09dbd.js +++ b/2ea1d02e.e074ce0d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{204:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),l=n(424),i=(n(437),n(429)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(449),i=n(423),c=n.n(i),u=n(433),s=n.n(u),b=n(448),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{204:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),l=n(424),i=(n(437),n(429)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(447),i=n(423),c=n.n(i),u=n(433),s=n.n(u),b=n(446),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/3088ad98.43ffaec8.js b/3088ad98.810b2d56.js similarity index 99% rename from 3088ad98.43ffaec8.js rename to 3088ad98.810b2d56.js index 239133070d..04ecc8fe08 100644 --- a/3088ad98.43ffaec8.js +++ b/3088ad98.810b2d56.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{207:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(425)),o=n(424),l=(n(437),n(429)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Deploy Temporal on Kubernetes",permalink:"/guides/tutorial/deploy-temporal-on-kubernetes"},nextItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),i=n(423),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),i=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(449),l=n(423),c=n.n(l),b=n(433),s=n.n(b),u=n(448),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{207:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return m}));var a=n(1),r=n(9),i=(n(0),n(425)),o=n(424),l=(n(437),n(429)),c={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},b={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Getting Started with Preview Environments on AWS",description:"Step-by-step guide to get started with the preview environment on AWS",permalink:"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",readingTime:"6 min read",source:"@site/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Getting Started with Preview Environments on AWS",truncated:!1,prevItem:{title:"Deploy Temporal on Kubernetes",permalink:"/guides/tutorial/deploy-temporal-on-kubernetes"},nextItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"}},s=[{value:"Steps",id:"steps",children:[]},{value:"Create your Blueprint Environment",id:"create-your-blueprint-environment",children:[{value:"Enable Preview Environment",id:"enable-preview-environment",children:[]},{value:"Change your base branch",id:"change-your-base-branch",children:[]}]},{value:"Validate your Blueprint Environment",id:"validate-your-blueprint-environment",children:[]},{value:"Create a Preview Environment",id:"create-a-preview-environment",children:[]},{value:"Delete a Preview Environment",id:"delete-a-preview-environment",children:[]},{value:"Advanced",id:"advanced",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:s};function m(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"It is critical to have testing and staging environments accurately reflect production, but achieving this can be a major operational hassle. Most engineering teams use a single staging environment which makes it hard for developers to test their changes in isolation; the alternative is for DevOps teams to spin up new testing or staging environments manually and tear them down after testing is done."),Object(i.b)("p",null,"Qovery\u2019s Preview Environments solve this problem by automatically creating a clone of your production environment (including applications, databases and configuration) on every pull request, so you can test your changes with confidence without affecting your production."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_flow_schema.jpg",alt:"Flow on how Qovery Preview Environment works"})),Object(i.b)("p",null,"Qovery keeps your preview environments up to date on every commit and automatically destroys them when the original pull request is merged or closed. You can also set up an expiry time to automatically clean up preview environments after a period of inactivity."),Object(i.b)("p",null,"Preview Environments can be helpful in a lot of cases:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Share your changes live in code reviews: no more Git diffs for visual changes!"),Object(i.b)("li",{parentName:"ul"},"Get shareable links for upcoming features and collaborate more effectively with internal and external stakeholders."),Object(i.b)("li",{parentName:"ul"},"Run CI tests against a high fidelity copy of your production environment before merging.")),Object(i.b)("p",null,"In this step-by-step guide you will learn how to get started using the Preview Environments on AWS with Qovery."),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This guide also works with other cloud service providers supported by Qovery.")),Object(i.b)("blockquote",null,Object(i.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning the Preview Environments")),Object(i.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(i.b)("li",{parentName:"ul"},"You have ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"installed Qovery on your AWS account")),Object(i.b)("li",{parentName:"ul"},"You have at least already ",Object(i.b)("strong",{parentName:"li"},"deployed successfully")," a first application"))),Object(i.b)("h2",{id:"steps"},"Steps"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-blueprint-environment"}),'Create a "Blueprint" environment')),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#enable-preview-environment"}),"Enable Preview Environment feature")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#create-a-preview-environment"}),"Create a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#delete-a-preview-environment"}),"Delete a Preview Environment")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#seed-your-database"}),"Seed your database")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#auto-stop-and-start-your-preview-environments"}),"Auto stop and start your Preview Environments")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#integrate-your-ci-platform"}),"Integrate your CI (Continuous Deployment) platform"))),Object(i.b)("h2",{id:"create-your-blueprint-environment"},"Create your Blueprint Environment"),Object(i.b)("p",null,"Even if not required, we recommend creating an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"environment"),' that will serve as a root to create your Preview Environments. The idea is to keep this environment as a template of a fully working environment. This environment should not be directly used. This is what we call "blueprint environment".'),Object(i.b)("p",null,"I assume you already have a working environment, so to create a blueprint environment you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Go to your working environment"),Object(i.b)("li",{parentName:"ol"},'Click on "Actions" > "Clone"'),Object(i.b)("li",{parentName:"ol"},'Name your environment "blueprint"'),Object(i.b)("li",{parentName:"ol"},'Click on "Create"')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/a282d6b832794671a3582550aa45f9ae",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)(o.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"We recommend using a different cluster than your production for your Preview Environments.")),Object(i.b)("h3",{id:"enable-preview-environment"},"Enable Preview Environment"),Object(i.b)("p",null,"Now, you can go to turn on Preview Environments by:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Click on your ",Object(i.b)("inlineCode",{parentName:"li"},"Blueprint"),' environment "Settings".'),Object(i.b)("li",{parentName:"ol"},"Click on the ",Object(i.b)("inlineCode",{parentName:"li"},"Preview Env.")," tab"),Object(i.b)("li",{parentName:"ol"},"Turn on Preview Environment feature for all your applications by clicking on ",Object(i.b)("inlineCode",{parentName:"li"},"Activate preview environment for all apps"),".")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/55b9d99a59524e1cb7875f7db7691fbe",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h3",{id:"change-your-base-branch"},"Change your base branch"),Object(i.b)("p",null,"Now that you have turned on the Preview Environment feature, you need to change the base branch from your applications inside your Blueprint Environment. Let's say, every new feature branch you create are coming from ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". Then you will need to change all your applications to target the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," branch."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/67df458d340d484fa1e675cc20e36caf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Here is a flow example showing what happen when you create a new Pull Request from a ",Object(i.b)("inlineCode",{parentName:"p"},"feat/xxx")," branch that has been created from the base branch ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),"."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/preview-environment-on-aws-for-beginner/preview_env_branching.jpg",alt:"Flow on how Qovery Preview Environment Branching works"})),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"A developer creates a git branch ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is created from ",Object(i.b)("inlineCode",{parentName:"li"},"staging"),"."),Object(i.b)("li",{parentName:"ol"},"A developer creates a Pull Request for ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx"),"."),Object(i.b)("li",{parentName:"ol"},"Qovery creates a Preview Environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," from the ",Object(i.b)("inlineCode",{parentName:"li"},"blueprint")," environment. ",Object(i.b)("strong",{parentName:"li"},"The frontend, backend, PostgreSQL and Redis instances are cloned!")),Object(i.b)("li",{parentName:"ol"},"The frontend app from the environment ",Object(i.b)("inlineCode",{parentName:"li"},"feat/xxx")," is accessible via a dedicated URL.")),Object(i.b)("h2",{id:"validate-your-blueprint-environment"},"Validate your Blueprint Environment"),Object(i.b)("p",null,"Before creating a Preview Environment, validate that your Blueprint environment works."),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/3dd4d9aee9ac44a9af0cb8eddee7735c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"Once done, you need to:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},'Stop your Blueprint environment by clicking on "Actions" > "Stop".'),Object(i.b)("li",{parentName:"ol"},'Turn off "auto-deploy" by clicking on "Settings" > "Deployment" > "Auto-deploy off" > "Save".')),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/36b0bb48346f40f6ac8569a7b8dbc5b3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"We are now ready to try out our Preview Environment configuration."),Object(i.b)("h2",{id:"create-a-preview-environment"},"Create a Preview Environment"),Object(i.b)("p",null,"To create a Preview Environment, here are the steps:"),Object(i.b)("ol",null,Object(i.b)("li",{parentName:"ol"},"Checkout your ",Object(i.b)("inlineCode",{parentName:"li"},"staging")," branch."),Object(i.b)("li",{parentName:"ol"},"Create a branch ",Object(i.b)("inlineCode",{parentName:"li"},"test_qovery_preview_environment")," and push it."),Object(i.b)("li",{parentName:"ol"},"Create a Pull Request/Merge Request.")),Object(i.b)(o.a,{type:"success",mdxType:"Alert"},Object(i.b)("p",null,"Qovery take care of cloning all your services and the configuration as well (Environment Variables and Secrets included).")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/2266d0897c964635b37447ae9ef2acea",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("p",null,"You must see a new environment appearing in your environment list on Qovery. Wait until it is fully deployed, then you will be able to connect to it. This environment is fully isolated from your base environment."),Object(i.b)("h2",{id:"delete-a-preview-environment"},"Delete a Preview Environment"),Object(i.b)("p",null,"To delete you need to merge ",Object(i.b)("inlineCode",{parentName:"p"},"test_qovery_preview_environment")," into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),". You also have the ability to delete it manually on Qovery."),Object(i.b)(o.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"By merging into ",Object(i.b)("inlineCode",{parentName:"p"},"staging"),", Qovery will auto-redeploy the new version in your ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment. Turn off ",Object(i.b)("inlineCode",{parentName:"p"},"auto-deploy")," from the ",Object(i.b)("inlineCode",{parentName:"p"},"staging")," environment settings if you want to manually deploy new version in staging.")),Object(i.b)("div",{class:"video-container"},Object(i.b)("p",{align:"center"},Object(i.b)("iframe",{src:"https://www.loom.com/embed/1feb31f4bbec4d54b0764dfa1271dd0d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(i.b)("h2",{id:"advanced"},"Advanced"),Object(i.b)("p",null,"Eager to know how to go integrate Qovery Preview Environments with your CI and much more? Check out our the following guides:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/qovery/lifecycle-job-examples/tree/main/examples/seed-postgres-database-with-sql-script"}),"Seed your Preview Environment database")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/integration/continuous-integration/"}),"Integrate your CI platform")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/environment/#deployment-rule"}),"Auto-stop and start your Preview Environment")),Object(i.b)("li",{parentName:"ul"},Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/tutorial/customizing-preview-url-with-qovery-cli/"}),"Set up a custom domain for your Preview Environment"))),Object(i.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(i.b)("p",null,"Congrats! You have set up your Preview Environments features. Feel free to check out our ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question. In the next guide, we will go deeper configuration to integrate the Preview Environment with your existing products and workflow."))}m.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),i=n(423),o=n.n(i);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,i=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:o()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==i}),role:"alert"},!1!==i&&r.a.createElement("i",{className:o()("feather","icon-"+(i||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),i=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),i=n.n(r),o=n(447),l=n(423),c=n.n(l),b=n(433),s=n.n(b),u=n(446),m=37,p=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,o=e.handleKeydown,l=e.style,b=e.values,s=e.selectedValue,u=e.tabRefs;return i.a.createElement("div",{className:n?"tabs--centered":null},i.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:l},b.map((function(e){var t=e.value,n=e.label;return i.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function v(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,c=l;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return i.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,o=e.groupId,l=e.label,c=e.placeholder,b=e.select,h=e.size,f=(e.style,e.values),g=e.urlKey,w=Object(u.a)(),y=w.tabGroupChoices,j=w.setTabGroupChoices,O=Object(r.useState)(n),N=O[0],E=O[1];if(null!=o){var k=y[o];null!=k&&k!==N&&E(k)}var C=function(e){E(e),null!=o&&j(o,e)},P=[],x=function(e,t,n){switch(n.keyCode){case p:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=s.a.parse(window.location.search);e[g]&&E(e[g])}}),[]),i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"margin-bottom--"+(h||"md")},l&&i.a.createElement("div",{className:"margin-vert--sm"},l),f.length>1&&(b?i.a.createElement(v,Object(a.a)({changeSelectedValue:C,handleKeydown:x,placeholder:c,selectedValue:N,size:h,tabRefs:P},e)):i.a.createElement(d,Object(a.a)({changeSelectedValue:C,handleKeydown:x,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/30e307eb.9f08b9f7.js b/30e307eb.9f08b9f7.js deleted file mode 100644 index 4d653d1a14..0000000000 --- a/30e307eb.9f08b9f7.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 30e307eb.9f08b9f7.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{208:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return b})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var r=n(1),a=n(9),o=(n(0),n(425)),l=n(434),i=n(424),c=(n(429),{last_modified_on:"2023-12-19",title:"Kubernetes",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster"}),b={id:"using-qovery/configuration/provider/kubernetes",title:"Kubernetes",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster",source:"@site/docs/using-qovery/configuration/provider/kubernetes.md",permalink:"/docs/using-qovery/configuration/provider/kubernetes",sidebar:"docs",previous:{title:"Provider",permalink:"/docs/using-qovery/configuration/provider"},next:{title:"Cluster Advanced Settings",permalink:"/docs/using-qovery/configuration/cluster-advanced-settings"}},s=[{value:"Components",id:"components",children:[]},{value:"What's the requirements?",id:"whats-the-requirements",children:[]},{value:"Run local demo infrastructure (optional)",id:"run-local-demo-infrastructure-optional",children:[]},{value:"Install Qovery",id:"install-qovery",children:[]},{value:"Configuration",id:"configuration",children:[{value:"Qovery",id:"qovery",children:[]},{value:"Ingress",id:"ingress",children:[]},{value:"DNS",id:"dns",children:[]},{value:"Logging",id:"logging",children:[]},{value:"Certificates",id:"certificates",children:[]}]},{value:"Observability",id:"observability",children:[{value:"Metrics Server",id:"metrics-server",children:[]}]},{value:"FAQ",id:"faq",children:[{value:"I have a non-covered use case. What should I do?",id:"i-have-a-non-covered-use-case-what-should-i-do",children:[]},{value:"Can I host the Qovery control plane on my own?",id:"can-i-host-the-qovery-control-plane-on-my-own",children:[]}]}],u={rightToc:s};function d(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(r.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"Installing Qovery on your Kubernetes cluster is currently in beta. ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"You need to request your access here"),".")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This section is for Kubernetes power-users. If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/"}),"AWS"),", ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/"}),"GCP"),", ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/"}),"Scaleway"),", or contact us.")),Object(o.b)("p",null,"Qovery Self-Managed or BYOK (Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery Managed/BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster.\nIn this version, Qovery does not manage the Kubernetes cluster for you."),Object(o.b)("p",null,"This page explains how to install and configure Qovery on your Kubernetes cluster. If you are looking for a quick step-by-step guide, please follow the ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"/guides/provider/guide-kubernetes/"}),"Kubernetes guide"),"."),Object(o.b)("h2",{id:"components"},"Components"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_byok_how_it_works.jpg",alt:"How Qovery works with Self Managed Kubernetes cluster"})),Object(o.b)("p",null,"They are two types of components:"),Object(o.b)("p",null,"Qovery components:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery."),Object(o.b)("li",{parentName:"ul"},"Qovery Engine: the Qovery Engine is responsible for managing your applications on your Kubernetes cluster. It is installed on your Kubernetes cluster."),Object(o.b)("li",{parentName:"ul"},"Qovery Cluster Agent (optional): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane."),Object(o.b)("li",{parentName:"ul"},"Qovery Shell Agent (optional): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using ",Object(o.b)("inlineCode",{parentName:"li"},"qovery shell")," command.")),Object(o.b)("p",null,"Third-party components:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"NGINX Ingress Controller (optional)"),Object(o.b)("li",{parentName:"ul"},"External DNS (optional)"),Object(o.b)("li",{parentName:"ul"},"Loki (optional)"),Object(o.b)("li",{parentName:"ul"},"Promtail (optional)"),Object(o.b)("li",{parentName:"ul"},"Cert Manager (optional)"),Object(o.b)("li",{parentName:"ul"},"...")),Object(o.b)("p",null,"You can chose what you want to install and manage, and you will have a description of what services are usedi, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to."),Object(o.b)("h2",{id:"whats-the-requirements"},"What's the requirements?"),Object(o.b)("p",null,"Qovery requires a Kubernetes cluster with the following requirements:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Kubernetes version 1.26 or higher"),Object(o.b)("li",{parentName:"ul"},"Helm version 3.0 or higher"),Object(o.b)("li",{parentName:"ul"},"2 CPU"),Object(o.b)("li",{parentName:"ul"},"4 GB RAM"),Object(o.b)("li",{parentName:"ul"},"20 GB disk space"),Object(o.b)("li",{parentName:"ul"},"Being able to access to the Internet")),Object(o.b)("h2",{id:"run-local-demo-infrastructure-optional"},"Run local demo infrastructure (optional)"),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"This local demo infrastructure is only for testing purpose, to quickly test Qovery. It is not supported by Qovery for production workloads. If you already have a managed Kubernetes cluster like EKS, you can skip this part.")),Object(o.b)("p",null,"First you will need some binaries to run the demo infrastructure locally:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(r.a)({parentName:"li"},{href:"https://www.docker.com/"}),"docker"),": Docker is a set of platform as a service (PaaS) products that use OS-level virtualization to deliver software in packages called containers."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(r.a)({parentName:"li"},{href:"https://kubernetes.io/docs/tasks/tools/#kubectl"}),"kubectl"),": Kubernetes command-line tool."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(r.a)({parentName:"li"},{href:"https://k3d.io/"}),"k3d"),": k3d is a lightweight wrapper to run k3s (Rancher Lab\u2019s minimal Kubernetes distribution) in docker."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(r.a)({parentName:"li"},{href:"https://helm.sh"}),"Helm"),": Helm is a package manager for Kubernetes.")),Object(o.b)("p",null,"Qovery requires a container registry to store its images."),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"We will use ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://aws.amazon.com/ecr/"}),"ECR")," to have a private repository for this demo, but you can chose any kind of registry (docker.io, ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://quay.io/"}),"quay.io"),", GCR...).")),Object(o.b)("p",null,"We have to use a binary for ECR authentication and token rotation. So we create the prerequired folders and file for the binary:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{}),"mkdir -p registry/bin\ntouch registry/bin/ecr-credential-provider\nchmod 755 registry/bin/ecr-credential-provider\n")),Object(o.b)("p",null,"Note: the ecr-credential-provider binary should be present for k3s to start. We will build it later."),Object(o.b)("p",null,"And create an IAM user with the following policy:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-json"}),'{\n "Statement": [\n {\n "Action": [\n "ecr:*",\n ],\n "Effect": "Allow",\n "Resource": "*"\n }\n ],\n "Version": "2012-10-17"\n}\n')),Object(o.b)("p",null,"Then we create a ",Object(o.b)("inlineCode",{parentName:"p"},"registry/config.yaml")," file to configure the ECR credential provider, where you should set the AWS credentials:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'apiVersion: kubelet.config.k8s.io/v1\nkind: CredentialProviderConfig\nproviders:\n - name: ecr-credential-provider\n matchImages:\n - "*.dkr.ecr.*.amazonaws.com"\n - "*.dkr.ecr.*.amazonaws.com.cn"\n - "*.dkr.ecr-fips.*.amazonaws.com"\n - "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"\n - "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"\n defaultCacheDuration: "12h"\n apiVersion: credentialprovider.kubelet.k8s.io/v1\n env:\n - name: AWS_ACCESS_KEY_ID\n value: xxx\n - name: AWS_DEFAULT_REGION\n value: xxx\n - name: AWS_SECRET_ACCESS_KEY\n value: xxx\n')),Object(o.b)("p",null,"Now we can run a local Kubernetes cluster:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-bash"}),'k3d cluster create --k3s-arg "--disable=traefik,metrics-server@server:0" \\\n-v $(pwd)/registry/bin:/var/lib/rancher/credentialprovider/bin@server:0 \\\n-v $(pwd)/registry/config.yaml:/var/lib/rancher/credentialprovider/config.yaml@server:0\n')),Object(o.b)("p",null,"After a few seconds/minutes (depending on your network bandwidth), you should have a local Kubernetes cluster running. Deploy this job to build and deploy the ECR credential provider binary on k3d (",Object(o.b)("inlineCode",{parentName:"p"},"job.yaml"),"):"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'apiVersion: batch/v1\nkind: Job\nmetadata:\n name: cloud-provider-repository-binary-builder\nspec:\n backoffLimit: 0\n template:\n spec:\n restartPolicy: Never\n containers:\n - name: ecr-credential-builder\n image: alpine:3.18\n command:\n - /bin/sh\n - -c\n - |\n apk add -U ca-certificates tar zstd tzdata go git\n git clone https://github.com/kubernetes/cloud-provider-aws.git\n cd cloud-provider-aws/cmd/ecr-credential-provider\n CGO_ENABLED=0 go build -mod=readonly .\n chmod 755 ecr-credential-provider\n mkdir -p /mnt/host/var/lib/rancher/credentialprovider/bin/\n cp ecr-credential-provider /mnt/host/var/lib/rancher/credentialprovider/bin/\n volumeMounts:\n - mountPath: /mnt/host\n name: host\n volumes:\n - hostPath:\n path: /\n type: ""\n name: host\n')),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{}),"kubectl apply -f job.yaml\n")),Object(o.b)("p",null,"You should have see those pods running:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-bash"}),"$ kubectl get po -A\nNAMESPACE NAME READY STATUS RESTARTS AGE\nkube-system local-path-provisioner-957fdf8bc-nwz5q 1/1 Running 0 112m\nkube-system coredns-77ccd57875-jhcnk 1/1 Running 0 112m\ndefault cloud-provider-repository-binary-builder-4cvsv 0/1 Completed 0 112m\n")),Object(o.b)("p",null,"You're now ready to move on."),Object(o.b)("h2",{id:"install-qovery"},"Install Qovery"),Object(o.b)(l.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("p",null,"Install ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(o.b)("li",null,Object(o.b)("p",null,"Add Qovery Helm repository."),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(o.b)("li",null,Object(o.b)("p",null,"Login to the Qovery console, create a cluster until it's asked to save informations in the ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," file.")),Object(o.b)("li",null,Object(o.b)("p",null,"You will find several ",Object(o.b)("inlineCode",{parentName:"p"},"values.yaml")," files. Depending on you need, select the one you want and update the configuration accordingly:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"values-demo.yaml"),": this version is to locally test with k3s or minikube"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"values-.yaml"),": find versions made for some providers")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Note: The provided values files are examples. There is no restriction where Qovery can be deployed. Feel free to copy or use an existing example and adapt it to your needs.")),Object(o.b)("p",null,"Here is an example of how the chart works:"),Object(o.b)("details",null,Object(o.b)("summary",null,"values-demo.yaml"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'## Services you can enable or disable\nservices:\n qovery:\n qovery-cluster-agent:\n enabled: true\n qovery-shell-agent:\n enabled: true\n qovery-engine:\n enabled: true\n ingress:\n ingress-nginx:\n enabled: true\n dns:\n external-dns:\n enabled: true\n logging:\n loki:\n enabled: true\n promtail:\n enabled: true\n certificates:\n cert-manager:\n enabled: true\n qovery-cert-manager-webhook:\n enabled: true\n cert-manager-configs:\n enabled: true\n observability:\n metrics-server:\n enabled: true\n\n## Qovery Common config\n# Past information from Qovery cluster console creation\n\nqovery:\n clusterId: &clusterId "set-by-customer"\n clusterShortId: &shortClusterId "set-by-customer"\n organizationId: &organizationId "set-by-customer"\n jwtToken: &jwtToken "set-by-customer"\n domain: &domain "set-by-customer"\n grpcServer: &grpcServer "set-by-customer"\n engineGrpcServer: &engineGrpcServer "set-by-customer"\n qoveryDnsUrl: &qoveryDnsUrl "set-by-customer"\n lokiUrl: &lokiUrl "set-by-customer"\n promtailLokiUrl: &promtailLokiUrl "set-by-customer"\n acmeEmailAddr: &acmeEmailAddr "set-by-customer"\n externalDnsPrefix: &externalDnsPrefix "set-by-customer"\n architectures: &architectures "set-by-customer"\n\n## Chart overrides\n...\n')))),Object(o.b)("li",null,Object(o.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install -n qovery -f values-demo.yaml qovery\n")),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"-f values-demo.yaml"),": specify the values overrides file you want to use"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"qovery"),": name of the chart to deploy"))))),Object(o.b)("h2",{id:"configuration"},"Configuration"),Object(o.b)("h3",{id:"qovery"},"Qovery"),Object(o.b)("p",null,"This is the configuration of Qovery itself. It is used by all Qovery components."),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Key"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Required"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Default"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.clusterId")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The cluster ID. It is used to identify your cluster."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.shortClusterId")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The short cluster ID. It is used to identify your cluster."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.organizationId")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The organization ID. It is used to identify your organization."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.jwtToken")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The JWT token. It is used to authenticate your cluster."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.domain")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The domain name used by Qovery."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.qoveryDnsUrl")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Qovery DNS url in case you want to use Qovery provided DNS"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.lokiUrl")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"No"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Local Loki URL (required if Loki is set)"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.promtailLokiUrl")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"No"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Promtail Loki URL (required if Promtail and Loki are set)"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.acmeEmailAddr")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"No"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Email address used for ",Object(o.b)("inlineCode",{parentName:"td"},"Let's Encrypt")," TLS requests"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.externalDnsPrefix")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"No"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"ExernalDNS TXT record prefix (required if ExternalDNS is set)"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"qovery.architectures")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"No"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Set cluster architectures (comma separated)"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"AMD64"))))),Object(o.b)(i.a,{type:"danger",mdxType:"Alert"},Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Do not share the jwtToken! Keep it in a safe place.")," It is used to authenticate the cluster.")),Object(o.b)("h4",{id:"qovery-cluster-agent"},"Qovery Cluster Agent"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional. If you don't want to use the cluster agent, you can disable it. You will not be able to see your logs and metrics in the Qovery dashboard.")),Object(o.b)("p",null,"The cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane."),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Key"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Required"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Default"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-cluster-agent.environmentVariables.GRPC_SERVER")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The gRPC server URL."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-cluster-agent.environmentVariables.CLUSTER_JWT_TOKEN")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The JWT token."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-cluster-agent.environmentVariables.CLUSTER_ID")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The cluster ID."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-cluster-agent.environmentVariables.ORGANIZATION_ID")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The organization ID."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))))),Object(o.b)("h4",{id:"qovery-shell-agent"},"Qovery Shell Agent"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional. If you don't want to use the shell agent, you can disable it. You will not be able to open a secure remote shell to your application.")),Object(o.b)("p",null,"The shell agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using ",Object(o.b)("inlineCode",{parentName:"p"},"qovery shell")," command."),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Key"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Required"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(r.a)({parentName:"tr"},{align:null}),"Default"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-shell-agent.environmentVariables.GRPC_SERVER")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The gRPC server URL."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-shell-agent.environmentVariables.CLUSTER_JWT_TOKEN")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The JWT token."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-shell-agent.environmentVariables.CLUSTER_ID")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The cluster ID."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"services.qovery-shell-agent.environmentVariables.ORGANIZATION_ID")),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"Yes"),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),"The organization ID."),Object(o.b)("td",Object(r.a)({parentName:"tr"},{align:null}),Object(o.b)("inlineCode",{parentName:"td"},"set-by-customer"))))),Object(o.b)("h3",{id:"ingress"},"Ingress"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional. To be able to expose web services privately or publicly, an Ingress is required. If you don't need it, you can disable the service.")),Object(o.b)("p",null,"Qovery uses ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://docs.nginx.com/nginx-ingress-controller/"}),"NGINX Ingress Controller")," by default to route traffic to your applications."),Object(o.b)("h4",{id:"nginx-ingress-controller"},"Nginx Ingress Controller"),Object(o.b)("p",null,"Here is the minimum override configuration to be used:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n fullnameOverride: ingress-nginx\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: false\n # Ingress class used when an application/container with public access is set\n ingressClass: nginx-qovery\n extraArgs:\n # Default TLS certificate name and path\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n # Allows customization of the source of the IP address or FQDN to report in the ingress status field\n publishService:\n enabled: true\n')),Object(o.b)("h4",{id:"other-ingress-controllers"},"Other Ingress Controllers"),Object(o.b)("p",null,"Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you."),Object(o.b)("h3",{id:"dns"},"DNS"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional but strongly recommended. Used to easily reach your applications with DNS records, even on private network.")),Object(o.b)("p",null,"Qovery uses ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/external-dns"}),"External DNS")," to automatically configure DNS records for your applications."),Object(o.b)("p",null,"If you don't want or can't add your own DNS provider, you can use the Qovery DNS provider. It is a managed DNS provider by Qovery with a sub-domain given by Qovery for free.\nYou'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain."),Object(o.b)("h4",{id:"external-dns"},"External DNS"),Object(o.b)("p",null,"Here is one example with Qoery DNS provider:"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"external-dns:\n fullnameOverride: external-dns\n # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)\n provider: pdns\n # will use the domain name given by Qovery during the cluster setup phease\n domainFilters: [*domain]\n # an owner ID is set to avoid conflicts in case of multiple Qovery clusters\n txtOwnerId: *shortClusterId\n # a prefix to help Qovery to debug in case of issues\n txtPrefix: *externalDnsPrefix\n # set the Qovery DNS provider configuration\n pdns:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n apiPort: 443\n")),Object(o.b)("h3",{id:"logging"},"Logging"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional but strongly recommended. Promtail and Loki are not mandatory to use Qovery. However, it's required if you want to have log history and reduce Kubernetes API load.")),Object(o.b)("p",null,"Qovery uses ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://grafana.com/oss/loki/"}),"Loki")," to store your logs and ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://grafana.com/docs/loki/latest/clients/promtail/"}),"Promtail")," to collect your logs."),Object(o.b)("h4",{id:"loki"},"Loki"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n fullnameOverride: loki\n loki:\n # no auth is set for internal cluster usage\n auth_enabled: false\n ingester:\n lifecycler:\n ring:\n kvstore:\n # we store it in memory for the demo, you'll lose history once Loki restarts\n store: inmemory\n replication_factor: 1\n schema_config:\n configs:\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: filesystem\n schema: v11\n index:\n prefix: index_\n period: 24h\n monitoring:\n # all the monitoring part is disabled to reduce resource footprint for the demo usage\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # we use a single binary to reduce resource footprint for the demo usage\n singleBinary:\n replicas: 1\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n")),Object(o.b)("h4",{id:"promtail"},"Promtail"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"promtail:\n fullnameOverride: promtail\n # promtail requires to be spawned in kube-system namespace\n namespace: kube-system\n priorityClassName: system-node-critical\n config:\n clients:\n # forward logs to Loki\n - url: *promtailLokiUrl\n snippets:\n extraRelabelConfigs:\n - action: labelmap\n # required to be able to watch logs from Qovery console interface\n regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)\n")),Object(o.b)("h3",{id:"certificates"},"Certificates"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional but strongly recommended. Cert-manager helps you to get TLS certificates through Let's Encrypt. Without it, you will not be able to automatically get TLS certificates.")),Object(o.b)("p",null,"Qovery uses ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://cert-manager.io/"}),"Cert Manager")," to automatically get TLS certificates for your applications."),Object(o.b)("h4",{id:"cert-manager"},"Cert Manager"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager:\n fullnameOverride: cert-manager\n # CRD are required\n installCRDs: true\n replicaCount: 1\n startupapicheck:\n jobAnnotations:\n helm.sh/hook: post-install,post-upgrade\n rbac:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n serviceAccount:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n")),Object(o.b)("h4",{id:"qovery-cert-manager-webhook"},"Qovery Cert Manager Webhook"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional and only required if you're using Qovery DNS provider. Set this to get automatic TLS certificates by Qovery.")),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cert-manager-webhook:\n fullnameOverride: qovery-cert-manager-webhook\n certManager:\n namespace: qovery\n serviceAccountName: cert-manager\n secret:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n")),Object(o.b)("h4",{id:"cert-manager-configs"},"Cert Manager Configs"),Object(o.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # As it's a demo cluster, we use the staging environment to avoid rate limit issues\n acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n")),Object(o.b)("p",null,"Qovery uses ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"Metrics Server")," to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics."),Object(o.b)("h2",{id:"observability"},"Observability"),Object(o.b)("h3",{id:"metrics-server"},"Metrics Server"),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Optional but strongly recommended. Without metrics server, you will not be able to scale your applications automatically and will not have metrics information in the Qovery dashboard.")),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n fullnameOverride: metrics-server\n defaultArgs:\n - --cert-dir=/tmp\n - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n - --kubelet-use-node-status-port\n - --metric-resolution=15s\n - --kubelet-insecure-tls\n apiService:\n create: false\n")),Object(o.b)("h2",{id:"faq"},"FAQ"),Object(o.b)("h3",{id:"i-have-a-non-covered-use-case-what-should-i-do"},"I have a non-covered use case. What should I do?"),Object(o.b)("p",null,"Please ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://www.qovery.com/contact"}),"contact us"),". We will be happy to help you."),Object(o.b)("h3",{id:"can-i-host-the-qovery-control-plane-on-my-own"},"Can I host the Qovery control plane on my own?"),Object(o.b)("p",null,"At the momement, you can't. But please ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://www.qovery.com/contact"}),"contact us")," to discuss about it. We will be happy to help you."))}d.isMDXComponent=!0},423:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var b=a.a.createContext({}),s=function(e){var t=a.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):i({},t,{},e)),n},u=function(e){var t=s(e.components);return a.a.createElement(b.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,b=c(e,["components","mdxType","originalType","parentName"]),u=s(n),p=r,m=u["".concat(l,".").concat(p)]||u[p]||d[p]||o;return n?a.a.createElement(m,i({ref:t},b,{components:n})):a.a.createElement(m,i({ref:t},b))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var b=2;b1?arguments[1]:void 0,n),c=l>2?arguments[2]:void 0,b=void 0===c?n:a(c,n);b>i;)t[i++]=e;return t}},428:function(e,t,n){var r=n(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||n(10)&&r(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var r=n(0),a=n.n(r),o=n(424);t.a=function(e){var t=e.children,n=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},433:function(e,t,n){"use strict";var r=n(435),a=n(51);function o(e,t){return t.encode?t.strict?r(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=a({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(a),o,r)})),Object.keys(r).sort().reduce((function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):r},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[o(t,e),"[",r,"]"].join(""):[o(t,e),"[",o(r,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(r){var a=e[r];if(void 0===a)return"";if(null===a)return o(r,t);if(Array.isArray(a)){var l=[];return a.slice().forEach((function(e){void 0!==e&&l.push(n(r,e,l.length))})),l.join("&")}return o(r,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,n){"use strict";var r=n(0),a=n.n(r),o=(n(423),n(433)),l=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,i="undefined"!=typeof window?window.location:null,c={title:"Tutorial on "+i+" failed",body:"The tutorial on:\n\n"+i+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},b="https://github.com/qovery/documentation/issues/new?"+l.a.stringify(c),s=Object(r.useState)(null),u=s[0],d=s[1];return a.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:b,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/30e307eb.cc152329.js b/30e307eb.cc152329.js new file mode 100644 index 0000000000..ded58f9b61 --- /dev/null +++ b/30e307eb.cc152329.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{208:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return i})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return d})),a.d(t,"default",(function(){return m}));var n=a(1),r=a(9),l=(a(0),a(425)),o=a(437),c=a(443),b=a(434),s=a(424),i=(a(429),{last_modified_on:"2023-12-22",title:"Kubernetes",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster"}),u={id:"using-qovery/configuration/provider/kubernetes",title:"Kubernetes",description:"Learn how to install and configure Qovery on your own Kubernetes cluster (BYOK) / Self-managed Kubernetes cluster",source:"@site/docs/using-qovery/configuration/provider/kubernetes.md",permalink:"/docs/using-qovery/configuration/provider/kubernetes",sidebar:"docs",previous:{title:"Provider",permalink:"/docs/using-qovery/configuration/provider"},next:{title:"Cluster Advanced Settings",permalink:"/docs/using-qovery/configuration/cluster-advanced-settings"}},d=[{value:"Components",id:"components",children:[]},{value:"What's the requirements?",id:"whats-the-requirements",children:[]},{value:"Private registry",id:"private-registry",children:[]},{value:"Install Qovery",id:"install-qovery",children:[]},{value:"Configuration",id:"configuration",children:[{value:"Qovery",id:"qovery",children:[]},{value:"Ingress",id:"ingress",children:[]},{value:"DNS",id:"dns",children:[]},{value:"Logging",id:"logging",children:[]},{value:"Certificates",id:"certificates",children:[]}]},{value:"Observability",id:"observability",children:[{value:"Metrics Server",id:"metrics-server",children:[]}]},{value:"FAQ",id:"faq",children:[{value:"I have a non-covered use case. What should I do?",id:"i-have-a-non-covered-use-case-what-should-i-do",children:[]},{value:"Can I host the Qovery control plane on my own?",id:"can-i-host-the-qovery-control-plane-on-my-own",children:[]}]}],p={rightToc:d};function m(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(l.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(l.b)(s.a,{type:"warning",mdxType:"Alert"},Object(l.b)("p",null,"Installing Qovery on your Kubernetes cluster is currently in beta. ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/bring-your-own-kubernetes"}),"You need to request your access here"),".")),Object(l.b)(s.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"This section is for Kubernetes power-users. If you are not familiar with Kubernetes, we recommend you to use Qovery on a Managed Kubernetes cluster on ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/"}),"AWS"),", ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/"}),"GCP"),", ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/"}),"Scaleway"),", or contact us.")),Object(l.b)("p",null,"Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster.\nRead ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.qovery.com/blog/kubernetes-managed-by-qovery-vs-self-managed-byok"}),"this article")," to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery Managed/BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster.\nIn this version, Qovery does not manage the Kubernetes cluster for you."),Object(l.b)("p",null,"This page explains how to install and configure Qovery on your Kubernetes cluster. If you are looking for a quick step-by-step guide, please follow the ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/provider/guide-kubernetes/"}),"Kubernetes guide"),"."),Object(l.b)("h2",{id:"components"},"Components"),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/qovery_byok_how_it_works.jpg",alt:"How Qovery works with Self Managed Kubernetes cluster"})),Object(l.b)("p",null,"They are two types of components:"),Object(l.b)("p",null,"Qovery components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery."),Object(l.b)("li",{parentName:"ul"},"Qovery Cluster Agent (mandatory): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane."),Object(l.b)("li",{parentName:"ul"},"Qovery Shell Agent (mandatory): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using ",Object(l.b)("inlineCode",{parentName:"li"},"qovery shell")," command."),Object(l.b)("li",{parentName:"ul"},"Qovery Engine (optional): the Qovery Engine is responsible for managing your applications deployment on your Kubernetes cluster. It can be used Qovery side or is installed on your Kubernetes cluster.")),Object(l.b)("p",null,"Third-party components:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"NGINX Ingress Controller (optional)"),Object(l.b)("li",{parentName:"ul"},"External DNS (optional)"),Object(l.b)("li",{parentName:"ul"},"Loki (optional)"),Object(l.b)("li",{parentName:"ul"},"Promtail (optional)"),Object(l.b)("li",{parentName:"ul"},"Cert Manager (optional)"),Object(l.b)("li",{parentName:"ul"},"...")),Object(l.b)("p",null,"You can chose what you want to install and manage, and you will have a description of what services are used, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to."),Object(l.b)("h2",{id:"whats-the-requirements"},"What's the requirements?"),Object(l.b)("p",null,"Qovery requires a Kubernetes cluster with the following requirements:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"Kubernetes version 1.26 or higher"),Object(l.b)("li",{parentName:"ul"},"Helm version 3.0 or higher"),Object(l.b)("li",{parentName:"ul"},"2 CPU"),Object(l.b)("li",{parentName:"ul"},"4 GB RAM"),Object(l.b)("li",{parentName:"ul"},"20 GB disk space"),Object(l.b)("li",{parentName:"ul"},"Being able to access to the Internet"),Object(l.b)("li",{parentName:"ul"},"A private registry")),Object(l.b)("p",null,"Here are some examples of Kubernetes distributions that can be used with Qovery. ",Object(l.b)("strong",{parentName:"p"},"This is a non exhaustive list"),"."),Object(l.b)(s.a,{type:"danger",mdxType:"Alert"},Object(l.b)("p",null,"Theses examples are not recommendations! Simply examples of what can be installed in the fastest way.")),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"eks",placeholder:"Select a cloud provider",select:!1,size:null,values:[{group:"k8s",label:"AWS - EKS",value:"eks"},{group:"k8s",label:"GCP - GKE",value:"gke"},{group:"k8s",label:"Scaleway - Kapsule",value:"kapsule"},{group:"k8s",label:"Demo (K3D)",value:"demo"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"eks",mdxType:"TabItem"},Object(l.b)("p",null,"To create a Kubernetes cluster on AWS, the simplest way is to use ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://eksctl.io/installation/"}),"eksctl binary"),". For example:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"eksctl create cluster --region=us-east-2 --zones=us-east-2a,us-east-2b,us-east-2d\n"))),Object(l.b)(c.a,{value:"gke",mdxType:"TabItem"},Object(l.b)("p",null,"To create a Kubernetes cluster on GCP, the simplest way is to use ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://cloud.google.com/sdk/docs/install"}),"gcloud binary"),". For example:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'gcloud beta container --project "qovery-gcp-tests" \\\n clusters create-auto "qovery-test" \\\n --region "us-east5" \\\n --release-channel "stable" \\\n --network "projects/qovery-gcp-tests/global/networks/default" \\\n --subnetwork "projects/qovery-gcp-tests/regions/us-east5/subnetworks/default"\n --cluster-ipv4-cidr "/16"\n --services-ipv4-cidr "10.0.0.0/16"\n'))),Object(l.b)(c.a,{value:"kapsule",mdxType:"TabItem"},Object(l.b)("p",null,"To create a Kubernetes cluster on Scaleway, the simplest way is to use ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/scaleway/scaleway-cli"}),"scw binary"),". For example:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"scw k8s cluster create name=qovery-test\nscw k8s pool create cluster-id= name=pool node-type=GP1_XL size=3\n")),Object(l.b)("p",null,"You can find the ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/creating-managing-kubernetes-lifecycle-cliv2/"}),"complete documentation here"),".")),Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with K3d to deploy a local Kubernetes cluster (you can use k3s or any other Kubernetes distribution):"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'k3d cluster create --image rancher/k3s:v1.26.11-k3s2 --k3s-arg "--disable=traefik,metrics-server@server:0" \\\n-v $(pwd)/registry_bin:/var/lib/rancher/credentialprovider/bin@server:0 \\\n-v $(pwd)/config.yaml:/var/lib/rancher/credentialprovider/config.yaml@server:0\n')),Object(l.b)("p",null,"Note: please take a look at the registry information below to understand why we need to mount the registry folder."))),Object(l.b)("h2",{id:"private-registry"},"Private registry"),Object(l.b)("p",null,"Qovery requires a private registry to store built images and mirror containers in order to reduce potential images deletion by 3rd party, while you still need them (",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/"}),"more info here"),")."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/configuration/provider/kubelet-credential-providers-plugin.png",alt:"Kubelet Credential Providers"})),Object(l.b)("p",null,"To do so, Qovery advise to use ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://kubernetes.io/blog/2022/12/22/kubelet-credential-providers/"}),"Kubelet Credential Provider")," as it's transparent for developers."),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"cpor",placeholder:"Select a platform",select:!1,size:null,values:[{group:"Registry",label:"Cloud Provider Own Registry",value:"cpor"},{group:"Registry",label:"ECR",value:"ecr"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"cpor",mdxType:"TabItem"},Object(l.b)("p",null,"If you're running Qovery Self-Managed version, and you are going to use the registry from the cloud provider itself, you don't have anything to do. The cloud providers already manage this part for you.")),Object(l.b)(c.a,{value:"ecr",mdxType:"TabItem"},Object(l.b)("p",null,"If you want to use ECR on a non-EKS cluster, you will need to install the ECR Credential Provider on your Kubernetes cluster."),Object(l.b)("p",null,"You have to create an IAM user with the following policy, and generate an access key:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "Statement": [\n {\n "Action": [\n "ecr:*",\n ],\n "Effect": "Allow",\n "Resource": "*"\n }\n ],\n "Version": "2012-10-17"\n}\n')),Object(l.b)("p",null,"Then we create a ",Object(l.b)("inlineCode",{parentName:"p"},"config.yaml")," file to configure the ECR credential provider, where you should set the AWS credentials previously generated:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'apiVersion: kubelet.config.k8s.io/v1\nkind: CredentialProviderConfig\nproviders:\n - name: ecr-credential-provider\n matchImages:\n - "*.dkr.ecr.*.amazonaws.com"\n - "*.dkr.ecr.*.amazonaws.com.cn"\n - "*.dkr.ecr-fips.*.amazonaws.com"\n - "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"\n - "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"\n defaultCacheDuration: "12h"\n apiVersion: credentialprovider.kubelet.k8s.io/v1\n env:\n - name: AWS_ACCESS_KEY_ID\n value: xxx\n - name: AWS_DEFAULT_REGION\n value: xxx\n - name: AWS_SECRET_ACCESS_KEY\n value: xxx\n')),Object(l.b)(s.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"Depending on your Kubernetes installation (cloud provider, on premise...) please refer to the official documentation to deploy the credential provider.")),Object(l.b)("details",null,Object(l.b)("summary",null,"Example with K3d"),Object(l.b)("p",null,"Here is an example with K3d to deploy a local Kubernetes cluster with the ECR credential provider."),Object(l.b)("p",null,"We first create the prerequired folders and file for the binary:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{}),"mkdir -p registry_bin\ntouch registry_bin/ecr-credential-provider\nchmod 755 registry_bin/ecr-credential-provider\n")),Object(l.b)("p",null,"Note: the ecr-credential-provider binary should be present for k3s to start. We will build it later."),Object(l.b)("p",null,"Now we can run a local Kubernetes cluster (update the path to ",Object(l.b)("inlineCode",{parentName:"p"},"config.yaml")," file, and the Kubernetes ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://hub.docker.com/r/rancher/k3s/tags"}),"image tag version"),"):"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),'k3d cluster create --image rancher/k3s:v1.26.11-k3s2 --k3s-arg "--disable=traefik,metrics-server@server:0" \\\n-v $(pwd)/registry_bin:/var/lib/rancher/credentialprovider/bin@server:0 \\\n-v $(pwd)/config.yaml:/var/lib/rancher/credentialprovider/config.yaml@server:0\n'))),Object(l.b)("br",null),Object(l.b)("p",null,"Once the Credential provider configuration has been deployed, we'll build the binary and deploy it on the cluster (note: it has to be present on all worker nodes).\nSimply deploy this job which will do the work:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'apiVersion: batch/v1\nkind: Job\nmetadata:\n name: cloud-provider-repository-binary-builder\nspec:\n backoffLimit: 0\n template:\n spec:\n restartPolicy: Never\n containers:\n - name: ecr-credential-builder\n image: alpine:3.18\n command:\n - /bin/sh\n - -c\n - |\n apk add -U ca-certificates tar zstd tzdata go git\n git clone https://github.com/kubernetes/cloud-provider-aws.git\n cd cloud-provider-aws/cmd/ecr-credential-provider\n CGO_ENABLED=0 go build -mod=readonly .\n chmod 755 ecr-credential-provider\n mkdir -p /mnt/host/var/lib/rancher/credentialprovider/bin/\n cp ecr-credential-provider /mnt/host/var/lib/rancher/credentialprovider/bin/\n volumeMounts:\n - mountPath: /mnt/host\n name: host\n volumes:\n - hostPath:\n path: /\n type: ""\n name: host\n')),Object(l.b)("p",null,"You can now move on the Qovery Helm deployment."))),Object(l.b)("h2",{id:"install-qovery"},"Install Qovery"),Object(l.b)(b.a,{headingDepth:3,mdxType:"Steps"},Object(l.b)("ol",null,Object(l.b)("li",null,Object(l.b)("p",null,"Install ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://helm.sh"}),"Helm")," command line tool.")),Object(l.b)("li",null,Object(l.b)("p",null,"Add Qovery Helm repository."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"helm repo add qovery https://helm.qovery.com\nhelm repo update\n"))),Object(l.b)("li",null,Object(l.b)("p",null,"Login to the Qovery console, create a cluster until it's asked to save informations in the ",Object(l.b)("inlineCode",{parentName:"p"},"values.yaml")," file.")),Object(l.b)("li",null,Object(l.b)("p",null,"You will find several ",Object(l.b)("inlineCode",{parentName:"p"},"values.yaml")," files. Depending on you need, select the one you want and update the configuration accordingly:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},Object(l.b)("inlineCode",{parentName:"li"},"values-demo.yaml"),": this version is to locally test with k3s or minikube"),Object(l.b)("li",{parentName:"ul"},Object(l.b)("inlineCode",{parentName:"li"},"values-.yaml"),": find versions made for some providers")),Object(l.b)(s.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"Note: The provided values files are examples. There is no restriction where Qovery can be deployed. Feel free to copy or use an existing example and adapt it to your needs.")),Object(l.b)("p",null,"Here is an example of how the chart works:"),Object(l.b)("details",null,Object(l.b)("summary",null,"values-demo.yaml"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'## Services you can enable or disable\nservices:\n qovery:\n qovery-cluster-agent:\n enabled: true\n qovery-shell-agent:\n enabled: true\n ingress:\n ingress-nginx:\n enabled: true\n dns:\n external-dns:\n enabled: true\n logging:\n loki:\n enabled: true\n promtail:\n enabled: true\n certificates:\n cert-manager:\n enabled: true\n qovery-cert-manager-webhook:\n enabled: true\n cert-manager-configs:\n enabled: true\n observability:\n metrics-server:\n enabled: true\n\n## Qovery Common config\n# Past information from Qovery cluster console creation\n\nqovery:\n clusterId: &clusterId "set-by-customer"\n clusterShortId: &shortClusterId "set-by-customer"\n organizationId: &organizationId "set-by-customer"\n jwtToken: &jwtToken "set-by-customer"\n domain: &domain "set-by-customer"\n grpcServer: &grpcServer "set-by-customer"\n engineGrpcServer: &engineGrpcServer "set-by-customer"\n qoveryDnsUrl: &qoveryDnsUrl "set-by-customer"\n lokiUrl: &lokiUrl "set-by-customer"\n promtailLokiUrl: &promtailLokiUrl "set-by-customer"\n acmeEmailAddr: &acmeEmailAddr "set-by-customer"\n externalDnsPrefix: &externalDnsPrefix "set-by-customer"\n architectures: &architectures "set-by-customer"\n\n## Chart overrides\n...\n')))),Object(l.b)("li",null,Object(l.b)("p",null,"Install Qovery on your Kubernetes cluster."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"helm upgrade --install -n qovery -f values-demo.yaml qovery\n")),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},Object(l.b)("inlineCode",{parentName:"li"},"-n qovery"),": the namespace where Qovery and its dependencies will be installed"),Object(l.b)("li",{parentName:"ul"},Object(l.b)("inlineCode",{parentName:"li"},"-f values-demo.yaml"),": specify the values overrides file you want to use"),Object(l.b)("li",{parentName:"ul"},Object(l.b)("inlineCode",{parentName:"li"},"qovery"),": name of the chart to deploy"))))),Object(l.b)("h2",{id:"configuration"},"Configuration"),Object(l.b)("h3",{id:"qovery"},"Qovery"),Object(l.b)("p",null,"This is the configuration of Qovery itself. It is used by all Qovery components."),Object(l.b)(s.a,{type:"danger",mdxType:"Alert"},Object(l.b)("p",null,Object(l.b)("strong",{parentName:"p"},"Do not share the jwtToken! Keep it in a safe place.")," It is used to authenticate the cluster.")),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Key"),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Required"),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Default"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.clusterId")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The cluster ID. It is used to identify your cluster."),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.shortClusterId")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The short cluster ID. It is used to identify your cluster."),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.organizationId")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The organization ID. It is used to identify your organization."),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.jwtToken")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The JWT token. It is used to authenticate your cluster."),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.domain")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The domain name used by Qovery."),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.qoveryDnsUrl")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Qovery DNS url in case you want to use Qovery provided DNS"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.lokiUrl")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Local Loki URL (required if Loki is set)"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.promtailLokiUrl")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Promtail Loki URL (required if Promtail and Loki are set)"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.acmeEmailAddr")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Email address used for ",Object(l.b)("inlineCode",{parentName:"td"},"Let's Encrypt")," TLS requests"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.externalDnsPrefix")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"ExernalDNS TXT record prefix (required if ExternalDNS is set)"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"set-by-customer"))),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"qovery.architectures")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Set cluster architectures (comma separated)"),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("inlineCode",{parentName:"td"},"AMD64"))))),Object(l.b)("h4",{id:"qovery-cluster-agent"},"Qovery Cluster Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"The cluster will not report to Qovery control plane Kubernetes information, so the Qovery console will report unknown satus values")))),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cluster-agent:\n fullnameOverride: qovery-cluster-agent\n")),Object(l.b)("h4",{id:"qovery-shell-agent"},"Qovery Shell Agent"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Used to give a remote shell access to you Kubernetes pods (if user is allowed from Qovery RBAC) with the Qovery CLI")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No remote connection will be possible, and Qovery support will not be able to help you to diagnose issues")))),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-shell-agent:\n fullnameOverride: qovery-shell-agent\n")),Object(l.b)("h3",{id:"ingress"},"Ingress"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Web services can be privately or publicly exposed")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No web services will be exposed")))),Object(l.b)("p",null,"Qovery us will be exposed ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://docs.nginx.com/nginx-ingress-controller/"}),"NGINX Ingress Controller")," by default to route traffic to your applications."),Object(l.b)("h4",{id:"nginx-ingress-controller"},"Nginx Ingress Controller"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"NginxIngress",label:"Demo",value:"demo"},{group:"NginxIngress",label:"AWS",value:"aws"},{group:"NginxIngress",label:"GCP",value:"gcp"},{group:"NginxIngress",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is the minimum override configuration to be used:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n fullnameOverride: ingress-nginx\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: false\n # Ingress class used when an application/container with public access is set\n ingressClass: nginx-qovery\n extraArgs:\n # Default TLS certificate name and path\n default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"\n # Allows customization of the source of the IP address or FQDN to report in the ingress status field\n publishService:\n enabled: true\n'))),Object(l.b)(c.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on AWS with NLB:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n proxy-body-size: 100m\n server-tokens: "false"\n ingressClass: nginx-qovery\n extraArgs:\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n maxUnavailable: 1\n \n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n \n publishService:\n enabled: true\n \n service:\n enabled: true\n annotations:\n service.beta.kubernetes.io/aws-load-balancer-type: nlb\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n sessionAffinity: ""\n healthCheckNodePort: 0\n'))),Object(l.b)(c.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Here is an example with Nginx Ingress Controller on Scaleway:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'ingress-nginx:\n controller:\n useComponentLabel: true\n admissionWebhooks:\n enabled: set-by-customer\n metrics:\n enabled: set-by-customer\n serviceMonitor:\n enabled: set-by-customer\n config:\n proxy-body-size: 100m\n server-tokens: "false"\n use-proxy-protocol: "true"\n ingressClass: nginx-qovery\n extraArgs:\n default-ssl-certificate: "cert-manager/letsencrypt-acme-qovery-cert"\n updateStrategy:\n rollingUpdate:\n maxUnavailable: 1\n autoscaling:\n enabled: true\n minReplicas: set-by-customer\n maxReplicas: set-by-customer\n targetCPUUtilizationPercentage: set-by-customer\n publishService:\n enabled: true\n service:\n enabled: true\n # https://github.com/scaleway/scaleway-cloud-controller-manager/blob/master/docs/loadbalancer-annotations.md\n annotations:\n service.beta.kubernetes.io/scw-loadbalancer-forward-port-algorithm: "leastconn"\n service.beta.kubernetes.io/scw-loadbalancer-protocol-http: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v1: "false"\n service.beta.kubernetes.io/scw-loadbalancer-proxy-protocol-v2: "true"\n service.beta.kubernetes.io/scw-loadbalancer-health-check-type: tcp\n service.beta.kubernetes.io/scw-loadbalancer-use-hostname: "true"\n service.beta.kubernetes.io/scw-loadbalancer-type: "set-by-customer"\n external-dns.alpha.kubernetes.io/hostname: "set-by-customer"\n externalTrafficPolicy: "Local"\n')))),Object(l.b)("h4",{id:"other-ingress-controllers"},"Other Ingress Controllers"),Object(l.b)("p",null,"Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you."),Object(l.b)("h3",{id:"dns"},"DNS"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Used to easily reach your applications with DNS records, even on private network")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"You will have easy access with dns names to your services, you'll have to use IPs")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/external-dns"}),"External DNS")," to automatically configure DNS records for your applications."),Object(l.b)("p",null,"If you don't want or can't add your own DNS provider, Qovery proposes it's own managed sub-domain DNS provider for free.\nYou'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain."),Object(l.b)("h4",{id:"external-dns"},"External DNS"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo & QoveryDNS",value:"demo"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Qovery DNS provider:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"external-dns:\n fullnameOverride: external-dns\n # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)\n provider: pdns\n # will use the domain name given by Qovery during the cluster setup phease\n domainFilters: [*domain]\n # an owner ID is set to avoid conflicts in case of multiple Qovery clusters\n txtOwnerId: *shortClusterId\n # a prefix to help Qovery to debug in case of issues\n txtPrefix: *externalDnsPrefix\n # set the Qovery DNS provider configuration\n pdns:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n apiPort: 443\n"))),Object(l.b)(c.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"Here is one example with Cloudflare:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'external-dns:\n fullnameOverride: external-dns\n provider: cloudflare\n domainFilters: [""]\n # an owner ID is set to avoid conflicts in case of multiple Qovery clusters\n txtOwnerId: *shortClusterId\n # a prefix to help Qovery to debug in case of issues\n txtPrefix: *externalDnsPrefix\n # set the Cloudflare DNS provider configuration\n cloudflare:\n ## @param cloudflare.apiToken When using the Cloudflare provider, `CF_API_TOKEN` to set (optional)\n apiToken: ""\n ## @param cloudflare.apiKey When using the Cloudflare provider, `CF_API_KEY` to set (optional)\n apiKey: ""\n ## @param cloudflare.secretName When using the Cloudflare provider, it\'s the name of the secret containing cloudflare_api_token or cloudflare_api_key.\n ## This ignores cloudflare.apiToken, and cloudflare.apiKey\n secretName: ""\n ## @param cloudflare.email When using the Cloudflare provider, `CF_API_EMAIL` to set (optional). Needed when using CF_API_KEY\n email: ""\n ## @param cloudflare.proxied When using the Cloudflare provider, enable the proxy feature (DDOS protection, CDN...) (optional)\n proxied: true\n')))),Object(l.b)("h3",{id:"logging"},"Logging"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Retrieve and store application's log history")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"You'll have live logs, but you will miss log history for debugging purpose")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://grafana.com/oss/loki/"}),"Loki")," to store your logs in a S3 compatible bucket and ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://grafana.com/docs/loki/latest/clients/promtail/"}),"Promtail")," to collect your logs."),Object(l.b)("h4",{id:"loki"},"Loki"),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"Loki",label:"Demo",value:"demo"},{group:"Loki",label:"AWS S3",value:"s3"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration ",Object(l.b)("strong",{parentName:"p"},"in Memory (no persistence)")," for Loki:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n fullnameOverride: loki\n loki:\n # no auth is set for internal cluster usage\n auth_enabled: false\n ingester:\n lifecycler:\n ring:\n kvstore:\n # we store it in memory for the demo, you'll lose history once Loki restarts\n store: inmemory\n replication_factor: 1\n schema_config:\n configs:\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: filesystem\n schema: v11\n index:\n prefix: index_\n period: 24h\n monitoring:\n # all the monitoring part is disabled to reduce resource footprint for the demo usage\n dashboards:\n enabled: false\n rules:\n enabled: false\n serviceMonitor:\n enabled: false\n metricsInstance:\n enabled: false\n selfMonitoring:\n enabled: false\n grafanaAgent:\n installOperator: false\n grafanaAgent:\n enabled: false\n lokiCanary:\n enabled: false\n test:\n enabled: false\n gateway:\n enabled: false\n # we use a single binary to reduce resource footprint for the demo usage\n singleBinary:\n replicas: 1\n persistence:\n enabled: false\n extraVolumes:\n - name: data\n emptyDir: {}\n - name: storage\n emptyDir: {}\n extraVolumeMounts:\n - name: data\n mountPath: /data\n - name: storage\n mountPath: /var/loki\n"))),Object(l.b)(c.a,{value:"s3",mdxType:"TabItem"},Object(l.b)("p",null,"Here is a configuration example with AWS S3 as storage backend:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"loki:\n fullnameOverride: loki\n kubectlImage:\n registry: set-by-customer\n repository: set-by-customer\n \n loki:\n image:\n registry: set-by-customer\n repository: set-by-customer\n auth_enabled: false\n commonConfig:\n replication_factor: 1 # single binary version\n ingester:\n chunk_idle_period: 3m \n chunk_block_size: 262144 \n chunk_retain_period: 1m \n max_transfer_retries: 0 \n lifecycler:\n ring:\n kvstore:\n store: memberlist \n replication_factor: 1 \n memberlist:\n abort_if_cluster_join_fails: false \n bind_port: 7946 \n join_members:\n - loki-headless.logging.svc:7946 \n max_join_backoff: 1m \n max_join_retries: 10 \n min_join_backoff: 1s \n limits_config:\n ingestion_rate_mb: 20 \n ingestion_burst_size_mb: 30 \n enforce_metric_name: false \n reject_old_samples: true \n reject_old_samples_max_age: 168h \n max_concurrent_tail_requests: 100 (default 10)\n split_queries_by_interval: 15m (default 15m)\n max_query_lookback: 12w (default 0)\n compactor:\n working_directory: /data/retention\n shared_store: aws\n compaction_interval: 10m\n retention_enabled: set-by-customer \n retention_delete_delay: 2h\n retention_delete_worker_count: 150\n table_manager:\n retention_deletes_enabled: set-by-customer \n retention_period: set-by-customer \n schema_config:\n configs:\n - from: 2020-05-15\n store: boltdb-shipper\n object_store: s3\n schema: v11\n index:\n prefix: index_\n period: 24h\n - from: 2023-06-01\n store: boltdb-shipper\n object_store: s3\n schema: v12\n index:\n prefix: index_\n period: 24h\n storage:\n bucketNames:\n chunks: \n ruler: \n admin: \n type: s3\n s3:\n s3: \n region: \n s3ForcePathStyle: \n insecure: \n storage_config:\n boltdb_shipper:\n active_index_directory: /data/loki/index\n shared_store: s3\n resync_interval: 5s\n cache_location: /data/loki/boltdb-cache\n")))),Object(l.b)("h4",{id:"promtail"},"Promtail"),Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"promtail:\n fullnameOverride: promtail\n # promtail requires to be spawned in kube-system namespace\n namespace: kube-system\n priorityClassName: system-node-critical\n config:\n clients:\n # forward logs to Loki\n - url: *promtailLokiUrl\n snippets:\n extraRelabelConfigs:\n - action: labelmap\n # required to be able to watch logs from Qovery console interface\n regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)\n")),Object(l.b)("h3",{id:"certificates"},"Certificates"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Cert-manager helps you to get TLS certificates through Let's Encrypt")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates")))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://cert-manager.io/"}),"Cert Manager")," to automatically get TLS certificates for your applications."),Object(l.b)("h4",{id:"cert-manager"},"Cert Manager"),Object(l.b)("p",null,"Here is the minimal setup for all cloud providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager:\n fullnameOverride: cert-manager\n # CRD are required\n installCRDs: true\n replicaCount: 1\n startupapicheck:\n jobAnnotations:\n helm.sh/hook: post-install,post-upgrade\n rbac:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n serviceAccount:\n annotations:\n helm.sh/hook: post-install,post-upgrade\n")),Object(l.b)("h4",{id:"qovery-cert-manager-webhook"},"Qovery Cert Manager Webhook"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but if you're using Qovery DNS Provider)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Required to get Let's Encrypt TLS if Qovery DNS Provider is used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Without it, you will not be able to automatically get TLS certificates with Qovery DNS Provider")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"qovery",placeholder:"Select a platform",select:!1,size:null,values:[{group:"QoveryCertManagerWebhook",label:"Qovery DNS",value:"qovery"},{group:"QoveryCertManagerWebhook",label:"",value:""}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"A configuration example compatible with all providers:"),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"qovery-cert-manager-webhook:\n fullnameOverride: qovery-cert-manager-webhook\n certManager:\n namespace: qovery\n serviceAccountName: cert-manager\n secret:\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n")))),Object(l.b)("h4",{id:"cert-manager-configs"},"Cert Manager Configs"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"This is an helper to deploy cert-manager config. But you can manually set it")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Installing Cert-manager is not enough, you have to configure it to get TLS working")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"ExternalDns",label:"Demo",value:"demo"},{group:"ExternalDns",label:"Qovery DNS",value:"qovery"},{group:"ExternalDns",label:"Cloudflare",value:"cloudflare"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n # As it's a demo cluster, we use the staging environment to avoid rate limit issues\n acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(c.a,{value:"qovery",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n # set the provider of your choice or use the Qovery DNS provider\n pdns:\n apiPort: 443\n apiUrl: *qoveryDnsUrl\n apiKey: *jwtToken\n"))),Object(l.b)(c.a,{value:"cloudflare",mdxType:"TabItem"},Object(l.b)("p",null,"This is the configuration of Cert Manager itself. It is used by all Cert Manager components."),Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),'cert-manager-configs:\n fullnameOverride: cert-manager-configs\n # set pdns to use Qovery DNS provider\n externalDnsProvider: pdns\n managedDns: [*domain]\n acme:\n letsEncrypt:\n emailReport: *acmeEmailAddr\n acmeUrl: https://acme-v02.api.letsencrypt.org/directory\n provider:\n cloudflare:\n apiToken: "set your Cloudflare API token here"\n email: "set your Cloudflare email here"\n')))),Object(l.b)("p",null,"Qovery uses ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"Metrics Server")," to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics."),Object(l.b)("h2",{id:"observability"},"Observability"),Object(l.b)("h3",{id:"metrics-server"},"Metrics Server"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})),Object(l.b)("th",Object(n.a)({parentName:"tr"},{align:null})))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"Required")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No (but strongly recommended)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If deployed")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Mandatory if you want to retrive pod metrics for the Qovery agent and if you want to be able to use the horizontal pod scaling")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(l.b)("strong",{parentName:"td"},"If missing")),Object(l.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"No HPA and no application metrics in the QOveyr console")))),Object(l.b)(o.a,{centered:!0,className:"rounded",defaultValue:"demo",placeholder:"Select a platform",select:!1,size:null,values:[{group:"MetricsServer",label:"Demo",value:"demo"},{group:"MetricsServer",label:"AWS",value:"aws"},{group:"MetricsServer",label:"GCP",value:"gcp"},{group:"MetricsServer",label:"Scaleway",value:"scaleway"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"aws",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n fullnameOverride: metrics-server\n apiService:\n create: true\n\n updateStrategy:\n type: set-by-customer\n\n resources:\n limits:\n cpu: set-by-customer\n memory: set-by-customer\n requests:\n cpu: set-by-customer\n memory: set-by-customer\n"))),Object(l.b)(c.a,{value:"gcp",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as GCP already provides a managed metrics server.")),Object(l.b)(c.a,{value:"scaleway",mdxType:"TabItem"},Object(l.b)("p",null,"Nothing needs to be deployed, as Scaleway already provides a managed metrics server.")),Object(l.b)(c.a,{value:"demo",mdxType:"TabItem"},Object(l.b)("pre",null,Object(l.b)("code",Object(n.a)({parentName:"pre"},{className:"language-yaml"}),"metrics-server:\n fullnameOverride: metrics-server\n defaultArgs:\n - --cert-dir=/tmp\n - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname\n - --kubelet-use-node-status-port\n - --metric-resolution=15s\n - --kubelet-insecure-tls\n apiService:\n create: false\n")))),Object(l.b)("h2",{id:"faq"},"FAQ"),Object(l.b)("h3",{id:"i-have-a-non-covered-use-case-what-should-i-do"},"I have a non-covered use case. What should I do?"),Object(l.b)("p",null,"Please ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.qovery.com/contact"}),"contact us"),". We will be happy to help you."),Object(l.b)("h3",{id:"can-i-host-the-qovery-control-plane-on-my-own"},"Can I host the Qovery control plane on my own?"),Object(l.b)("p",null,"At the momement, you can't. But please ",Object(l.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.qovery.com/contact"}),"contact us")," to discuss about it. We will be happy to help you."))}m.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),r=a.n(n),l=a(423),o=a.n(l);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,l=e.icon,c=e.type,b=null;switch(c){case"danger":b="alert-triangle";break;case"success":b="check-circle";break;case"warning":b="alert-triangle";break;default:b="info"}return r.a.createElement("div",{className:o()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.a.createElement("i",{className:o()("feather","icon-"+(l||b))}),t)}},428:function(e,t,a){var n=a(28).f,r=Function.prototype,l=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(l)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),r=a.n(n),l=a(424);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(l.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},434:function(e,t,a){"use strict";var n=a(0),r=a.n(n),l=(a(423),a(433)),o=a.n(l);a(134);t.a=function(e){var t=e.children,a=e.headingDepth,l=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,b={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+o.a.stringify(b),i=Object(n.useState)(null),u=i[0],d=i[1];return r.a.createElement("div",{className:"steps steps--h"+a},t,!l&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return d("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,a){"use strict";var n=a(1),r=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),l=a.n(r),o=a(447),c=a(423),b=a.n(c),s=a(433),i=a.n(s),u=a(446),d=37,p=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,o=e.handleKeydown,c=e.style,s=e.values,i=e.selectedValue,u=e.tabRefs;return l.a.createElement("div",{className:a?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:b()("tabs",r,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":i===t,className:b()("tab-item",{"tab-item--active":i===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return o(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,c=e.values,b=c;if(b[0].group){var s=_.groupBy(b,"group");b=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return l.a.createElement(o.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:b,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,o=e.groupId,c=e.label,b=e.placeholder,s=e.select,O=e.size,j=(e.style,e.values),y=e.urlKey,h=Object(u.a)(),v=h.tabGroupChoices,f=h.setTabGroupChoices,N=Object(r.useState)(a),w=N[0],k=N[1];if(null!=o){var x=v[o];null!=x&&x!==w&&k(x)}var C=function(e){k(e),null!=o&&f(o,e)},T=[],I=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=i.a.parse(window.location.search);e[y]&&k(e[y])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(O||"md")},c&&l.a.createElement("div",{className:"margin-vert--sm"},c),j.length>1&&(s?l.a.createElement(g,Object(n.a)({changeSelectedValue:C,handleKeydown:I,placeholder:b,selectedValue:w,size:O,tabRefs:T},e)):l.a.createElement(m,Object(n.a)({changeSelectedValue:C,handleKeydown:I,selectedValue:w,tabRefs:T},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===w}))[0])}},443:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/3116c1fa.e25c73d7.js b/3116c1fa.d79d732c.js similarity index 99% rename from 3116c1fa.e25c73d7.js rename to 3116c1fa.d79d732c.js index cf40f96dfc..3c3de09337 100644 --- a/3116c1fa.e25c73d7.js +++ b/3116c1fa.d79d732c.js @@ -1,2 +1,2 @@ -/*! For license information please see 3116c1fa.e25c73d7.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{209:function(u,e,d){"use strict";d.r(e);var n=d(1),t=(d(52),d(428),d(29),d(22),d(21),d(85),d(0)),r=d.n(t),a=d(450),c=d(445),f=(d(430),d(474)),i=d(451),o=d.n(i),l=d(455),s=d(481),p=d.n(s),m=d(598),h=d.n(m),b=Object(a.a)("h2");e.default=function(u){var e=u.tags,d=Object.values(e).map((function(u){return{count:u.count,label:u.name,permalink:u.permalink}})),t=Object(l.a)(d,"guides"),a=o.a.groupBy(t,"category");return r.a.createElement(c.a,{title:"Tags",description:"Qovery guide tags"},r.a.createElement("header",{className:"hero hero--clean"},r.a.createElement("div",{className:"container"},r.a.createElement("h1",null,"All Guide Tags"))),r.a.createElement("main",{className:"container container--xs"},Object.keys(a).map((function(u,e){var d=a[u];return r.a.createElement("section",null,r.a.createElement(b,{id:u.name},h()(p()(u))),d.map((function(u,e){return r.a.createElement("div",null,r.a.createElement(f.a,Object(n.a)({key:e,valueOnly:!0},u)))})))}))))}},423:function(u,e,d){var n;!function(){"use strict";var d={}.hasOwnProperty;function t(){for(var u=[],e=0;e1?arguments[1]:void 0)}}),d(74)("find")},445:function(u,e,d){"use strict";d(457);var n=d(0),t=d.n(n),r=d(458),a=d(443),c=d(1),f=(d(446),d(447),d(459),d(430)),i=d(460),o=d(440),l=d.n(o),s=d(461),p=d.n(s),m=d(436),h=d(423),b=d.n(h),v=d(135),_=d.n(v),g=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.moon)})},D=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.sun)})},y=function(u){var e=Object(m.a)().isClient;return t.a.createElement(p.a,Object(c.a)({disabled:!e,icons:{checked:t.a.createElement(g,null),unchecked:t.a.createElement(D,null)}},u))};function E(){var u=Object(m.a)().siteConfig,e=(void 0===u?{}:u).customFields.metadata.latest_post,d=Date.parse(e.date),n=new Date,t=Math.abs(n-d),r=Math.ceil(t/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&t.a.createElement("div",{className:"row footer__links"},t.a.createElement("div",{className:"col col--5 footer__col"},t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),t.a.createElement("div",null,t.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},t.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},t.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},t.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},t.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),f.map((function(u,e){return t.a.createElement("div",{key:e,className:"col footer__col"},null!=u.title?t.a.createElement("h4",{className:"footer__title"},u.title):null,null!=u.items&&Array.isArray(u.items)&&u.items.length>0?t.a.createElement("ul",{className:"footer__items"},u.items.map((function(u,e){return u.html?t.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:u.html}}):t.a.createElement("li",{key:u.href||u.to,className:"footer__item"},t.a.createElement(L,u))}))):null)}))),(o||a)&&t.a.createElement("div",{className:"text--center"},o&&o.src&&t.a.createElement("div",{className:"margin-bottom--sm"},o.href?t.a.createElement("a",{href:o.href,target:"_blank",rel:"noopener noreferrer",className:B.a.footerLogoLink},t.a.createElement(P,{alt:o.alt,url:s})):t.a.createElement(P,{alt:o.alt,url:s})),t.a.createElement("small",null,a),t.a.createElement("br",null))))},T=d(462),R=d(463),U=d(3);d(138);e.a=function(u){var e=Object(m.a)().siteConfig,d=void 0===e?{}:e,n=d.favicon,c=(d.tagline,d.title),f=d.themeConfig.image,i=d.url,o=u.children,l=u.title,s=u.noFooter,p=u.description,h=u.image,b=u.keywords,v=(u.permalink,u.version),_=l?l+" | "+c:c,g=h||f,D=i+Object(I.a)(g),y=Object(I.a)(n),E=Object(U.h)(),x=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return t.a.createElement(R.a,null,t.a.createElement(T.a,null,t.a.createElement(a.a,null,t.a.createElement("html",{lang:"en"}),t.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&t.a.createElement("title",null,_),_&&t.a.createElement("meta",{property:"og:title",content:_}),n&&t.a.createElement("link",{rel:"shortcut icon",href:y}),p&&t.a.createElement("meta",{name:"description",content:p}),p&&t.a.createElement("meta",{property:"og:description",content:p}),v&&t.a.createElement("meta",{name:"docsearch:version",content:v}),b&&b.length&&t.a.createElement("meta",{name:"keywords",content:b.join(",")}),g&&t.a.createElement("meta",{property:"og:image",content:D}),g&&t.a.createElement("meta",{property:"twitter:image",content:D}),g&&t.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),x&&t.a.createElement("meta",{property:"og:url",content:x}),t.a.createElement("meta",{name:"twitter:card",content:"summary"}),x&&t.a.createElement("link",{rel:"canonical",href:x})),t.a.createElement(r.a,null),t.a.createElement(j,null),t.a.createElement("div",{className:"main-wrapper"},o),!s&&t.a.createElement(M,null)))}},450:function(u,e,d){"use strict";var n=d(9),t=d(0),r=d.n(t),a=d(423),c=d.n(a),f=d(436),i=(d(139),d(140)),o=d.n(i);e.a=function(u){return function(e){var d,t=e.id,a=Object(n.a)(e,["id"]),i=Object(f.a)().siteConfig,l=(i=void 0===i?{}:i).themeConfig,s=(l=void 0===l?{}:l).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return t?r.a.createElement(u,a,r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(d={},d[o.a.enhancedAnchor]=!m,d)),id:t}),r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+t,title:"Direct link to heading"},"#"),a.children):r.a.createElement(u,a)}}},451:function(u,e,d){(function(u,n){var t;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],f="[object Arguments]",i="[object Array]",o="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",_="[object RegExp]",g="[object Set]",D="[object String]",y="[object Symbol]",E="[object WeakMap]",x="[object ArrayBuffer]",I="[object DataView]",w="[object Float32Array]",C="[object Float64Array]",F="[object Int8Array]",A="[object Int16Array]",k="[object Int32Array]",S="[object Uint8Array]",O="[object Uint16Array]",j="[object Uint32Array]",$=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,B=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,P=/[&<>"']/g,M=RegExp(L.source),T=RegExp(P.source),R=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,K=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,W=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,q=RegExp(H.source),J=/^\s+|\s+$/g,Z=/^\s+/,V=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,uu=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,eu=/\\(\\)?/g,du=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nu=/\w*$/,tu=/^[-+]0x[0-9a-f]+$/i,ru=/^0b[01]+$/i,au=/^\[object .+?Constructor\]$/,cu=/^0o[0-7]+$/i,fu=/^(?:0|[1-9]\d*)$/,iu=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ou=/($^)/,lu=/['\n\r\u2028\u2029\\]/g,su="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pu="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",mu="[\\ud800-\\udfff]",hu="["+pu+"]",bu="["+su+"]",vu="\\d+",_u="[\\u2700-\\u27bf]",gu="[a-z\\xdf-\\xf6\\xf8-\\xff]",Du="[^\\ud800-\\udfff"+pu+vu+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",yu="\\ud83c[\\udffb-\\udfff]",Eu="[^\\ud800-\\udfff]",xu="(?:\\ud83c[\\udde6-\\uddff]){2}",Iu="[\\ud800-\\udbff][\\udc00-\\udfff]",wu="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Cu="(?:"+gu+"|"+Du+")",Fu="(?:"+wu+"|"+Du+")",Au="(?:"+bu+"|"+yu+")"+"?",ku="[\\ufe0e\\ufe0f]?"+Au+("(?:\\u200d(?:"+[Eu,xu,Iu].join("|")+")[\\ufe0e\\ufe0f]?"+Au+")*"),Su="(?:"+[_u,xu,Iu].join("|")+")"+ku,Ou="(?:"+[Eu+bu+"?",bu,xu,Iu,mu].join("|")+")",ju=RegExp("['\u2019]","g"),$u=RegExp(bu,"g"),Nu=RegExp(yu+"(?="+yu+")|"+Ou+ku,"g"),Bu=RegExp([wu+"?"+gu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[hu,wu,"$"].join("|")+")",Fu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[hu,wu+Cu,"$"].join("|")+")",wu+"?"+Cu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",wu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",vu,Su].join("|"),"g"),Lu=RegExp("[\\u200d\\ud800-\\udfff"+su+"\\ufe0e\\ufe0f]"),Pu=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Mu=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Tu=-1,Ru={};Ru[w]=Ru[C]=Ru[F]=Ru[A]=Ru[k]=Ru[S]=Ru["[object Uint8ClampedArray]"]=Ru[O]=Ru[j]=!0,Ru[f]=Ru[i]=Ru[x]=Ru[o]=Ru[I]=Ru[l]=Ru[s]=Ru[p]=Ru[h]=Ru[b]=Ru[v]=Ru[_]=Ru[g]=Ru[D]=Ru[E]=!1;var Uu={};Uu[f]=Uu[i]=Uu[x]=Uu[I]=Uu[o]=Uu[l]=Uu[w]=Uu[C]=Uu[F]=Uu[A]=Uu[k]=Uu[h]=Uu[b]=Uu[v]=Uu[_]=Uu[g]=Uu[D]=Uu[y]=Uu[S]=Uu["[object Uint8ClampedArray]"]=Uu[O]=Uu[j]=!0,Uu[s]=Uu[p]=Uu[E]=!1;var zu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ku=parseFloat,Wu=parseInt,Gu="object"==typeof u&&u&&u.Object===Object&&u,Hu="object"==typeof self&&self&&self.Object===Object&&self,qu=Gu||Hu||Function("return this")(),Ju=e&&!e.nodeType&&e,Zu=Ju&&"object"==typeof n&&n&&!n.nodeType&&n,Vu=Zu&&Zu.exports===Ju,Yu=Vu&&Gu.process,Qu=function(){try{var u=Zu&&Zu.require&&Zu.require("util").types;return u||Yu&&Yu.binding&&Yu.binding("util")}catch(e){}}(),Xu=Qu&&Qu.isArrayBuffer,ue=Qu&&Qu.isDate,ee=Qu&&Qu.isMap,de=Qu&&Qu.isRegExp,ne=Qu&&Qu.isSet,te=Qu&&Qu.isTypedArray;function re(u,e,d){switch(d.length){case 0:return u.call(e);case 1:return u.call(e,d[0]);case 2:return u.call(e,d[0],d[1]);case 3:return u.call(e,d[0],d[1],d[2])}return u.apply(e,d)}function ae(u,e,d,n){for(var t=-1,r=null==u?0:u.length;++t-1}function se(u,e,d){for(var n=-1,t=null==u?0:u.length;++n-1;);return d}function Ne(u,e){for(var d=u.length;d--&&ye(e,u[d],0)>-1;);return d}function Be(u,e){for(var d=u.length,n=0;d--;)u[d]===e&&++n;return n}var Le=Ce({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Pe=Ce({"&":"&","<":"<",">":">",'"':""","'":"'"});function Me(u){return"\\"+zu[u]}function Te(u){return Lu.test(u)}function Re(u){var e=-1,d=Array(u.size);return u.forEach((function(u,n){d[++e]=[n,u]})),d}function Ue(u,e){return function(d){return u(e(d))}}function ze(u,e){for(var d=-1,n=u.length,t=0,r=[];++d",""":'"',"'":"'"});var Je=function u(e){var d,n=(e=null==e?qu:Je.defaults(qu.Object(),e,Je.pick(qu,Mu))).Array,t=e.Date,su=e.Error,pu=e.Function,mu=e.Math,hu=e.Object,bu=e.RegExp,vu=e.String,_u=e.TypeError,gu=n.prototype,Du=pu.prototype,yu=hu.prototype,Eu=e["__core-js_shared__"],xu=Du.toString,Iu=yu.hasOwnProperty,wu=0,Cu=(d=/[^.]+$/.exec(Eu&&Eu.keys&&Eu.keys.IE_PROTO||""))?"Symbol(src)_1."+d:"",Fu=yu.toString,Au=xu.call(hu),ku=qu._,Su=bu("^"+xu.call(Iu).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ou=Vu?e.Buffer:void 0,Nu=e.Symbol,Lu=e.Uint8Array,zu=Ou?Ou.allocUnsafe:void 0,Gu=Ue(hu.getPrototypeOf,hu),Hu=hu.create,Ju=yu.propertyIsEnumerable,Zu=gu.splice,Yu=Nu?Nu.isConcatSpreadable:void 0,Qu=Nu?Nu.iterator:void 0,_e=Nu?Nu.toStringTag:void 0,Ce=function(){try{var u=Xt(hu,"defineProperty");return u({},"",{}),u}catch(e){}}(),Ze=e.clearTimeout!==qu.clearTimeout&&e.clearTimeout,Ve=t&&t.now!==qu.Date.now&&t.now,Ye=e.setTimeout!==qu.setTimeout&&e.setTimeout,Qe=mu.ceil,Xe=mu.floor,ud=hu.getOwnPropertySymbols,ed=Ou?Ou.isBuffer:void 0,dd=e.isFinite,nd=gu.join,td=Ue(hu.keys,hu),rd=mu.max,ad=mu.min,cd=t.now,fd=e.parseInt,id=mu.random,od=gu.reverse,ld=Xt(e,"DataView"),sd=Xt(e,"Map"),pd=Xt(e,"Promise"),md=Xt(e,"Set"),hd=Xt(e,"WeakMap"),bd=Xt(hu,"create"),vd=hd&&new hd,_d={},gd=Cr(ld),Dd=Cr(sd),yd=Cr(pd),Ed=Cr(md),xd=Cr(hd),Id=Nu?Nu.prototype:void 0,wd=Id?Id.valueOf:void 0,Cd=Id?Id.toString:void 0;function Fd(u){if(Ka(u)&&!ja(u)&&!(u instanceof Od)){if(u instanceof Sd)return u;if(Iu.call(u,"__wrapped__"))return Fr(u)}return new Sd(u)}var Ad=function(){function u(){}return function(e){if(!za(e))return{};if(Hu)return Hu(e);u.prototype=e;var d=new u;return u.prototype=void 0,d}}();function kd(){}function Sd(u,e){this.__wrapped__=u,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Od(u){this.__wrapped__=u,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function jd(u){var e=-1,d=null==u?0:u.length;for(this.clear();++e=e?u:e)),u}function Zd(u,e,d,n,t,r){var a,c=1&e,i=2&e,s=4&e;if(d&&(a=t?d(u,n,t,r):d(u)),void 0!==a)return a;if(!za(u))return u;var E=ja(u);if(E){if(a=function(u){var e=u.length,d=new u.constructor(e);e&&"string"==typeof u[0]&&Iu.call(u,"index")&&(d.index=u.index,d.input=u.input);return d}(u),!c)return vt(u,a)}else{var $=dr(u),N=$==p||$==m;if(La(u))return lt(u,c);if($==v||$==f||N&&!t){if(a=i||N?{}:tr(u),!c)return i?function(u,e){return _t(u,er(u),e)}(u,function(u,e){return u&&_t(e,Dc(e),u)}(a,u)):function(u,e){return _t(u,ur(u),e)}(u,Gd(a,u))}else{if(!Uu[$])return t?u:{};a=function(u,e,d){var n=u.constructor;switch(e){case x:return st(u);case o:case l:return new n(+u);case I:return function(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.byteLength)}(u,d);case w:case C:case F:case A:case k:case S:case"[object Uint8ClampedArray]":case O:case j:return pt(u,d);case h:return new n;case b:case D:return new n(u);case _:return function(u){var e=new u.constructor(u.source,nu.exec(u));return e.lastIndex=u.lastIndex,e}(u);case g:return new n;case y:return t=u,wd?hu(wd.call(t)):{}}var t}(u,$,c)}}r||(r=new Ld);var B=r.get(u);if(B)return B;r.set(u,a),Ja(u)?u.forEach((function(n){a.add(Zd(n,e,d,n,u,r))})):Wa(u)&&u.forEach((function(n,t){a.set(t,Zd(n,e,d,t,u,r))}));var L=E?void 0:(s?i?Ht:Gt:i?Dc:gc)(u);return ce(L||u,(function(n,t){L&&(n=u[t=n]),zd(a,t,Zd(n,e,d,t,u,r))})),a}function Vd(u,e,d){var n=d.length;if(null==u)return!n;for(u=hu(u);n--;){var t=d[n],r=e[t],a=u[t];if(void 0===a&&!(t in u)||!r(a))return!1}return!0}function Yd(u,e,d){if("function"!=typeof u)throw new _u(r);return gr((function(){u.apply(void 0,d)}),e)}function Qd(u,e,d,n){var t=-1,r=le,a=!0,c=u.length,f=[],i=e.length;if(!c)return f;d&&(e=pe(e,Se(d))),n?(r=se,a=!1):e.length>=200&&(r=je,a=!1,e=new Bd(e));u:for(;++t-1},$d.prototype.set=function(u,e){var d=this.__data__,n=Kd(d,u);return n<0?(++this.size,d.push([u,e])):d[n][1]=e,this},Nd.prototype.clear=function(){this.size=0,this.__data__={hash:new jd,map:new(sd||$d),string:new jd}},Nd.prototype.delete=function(u){var e=Yt(this,u).delete(u);return this.size-=e?1:0,e},Nd.prototype.get=function(u){return Yt(this,u).get(u)},Nd.prototype.has=function(u){return Yt(this,u).has(u)},Nd.prototype.set=function(u,e){var d=Yt(this,u),n=d.size;return d.set(u,e),this.size+=d.size==n?0:1,this},Bd.prototype.add=Bd.prototype.push=function(u){return this.__data__.set(u,"__lodash_hash_undefined__"),this},Bd.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.clear=function(){this.__data__=new $d,this.size=0},Ld.prototype.delete=function(u){var e=this.__data__,d=e.delete(u);return this.size=e.size,d},Ld.prototype.get=function(u){return this.__data__.get(u)},Ld.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.set=function(u,e){var d=this.__data__;if(d instanceof $d){var n=d.__data__;if(!sd||n.length<199)return n.push([u,e]),this.size=++d.size,this;d=this.__data__=new Nd(n)}return d.set(u,e),this.size=d.size,this};var Xd=yt(cn),un=yt(fn,!0);function en(u,e){var d=!0;return Xd(u,(function(u,n,t){return d=!!e(u,n,t)})),d}function dn(u,e,d){for(var n=-1,t=u.length;++n0&&d(c)?e>1?tn(c,e-1,d,n,t):me(t,c):n||(t[t.length]=c)}return t}var rn=Et(),an=Et(!0);function cn(u,e){return u&&rn(u,e,gc)}function fn(u,e){return u&&an(u,e,gc)}function on(u,e){return oe(e,(function(e){return Ta(u[e])}))}function ln(u,e){for(var d=0,n=(e=ct(e,u)).length;null!=u&&de}function hn(u,e){return null!=u&&Iu.call(u,e)}function bn(u,e){return null!=u&&e in hu(u)}function vn(u,e,d){for(var t=d?se:le,r=u[0].length,a=u.length,c=a,f=n(a),i=1/0,o=[];c--;){var l=u[c];c&&e&&(l=pe(l,Se(e))),i=ad(l.length,i),f[c]=!d&&(e||r>=120&&l.length>=120)?new Bd(c&&l):void 0}l=u[0];var s=-1,p=f[0];u:for(;++s=c)return f;var i=d[n];return f*("desc"==i?-1:1)}}return u.index-e.index}(u,e,d)}))}function $n(u,e,d){for(var n=-1,t=e.length,r={};++n-1;)c!==u&&Zu.call(c,f,1),Zu.call(u,f,1);return u}function Bn(u,e){for(var d=u?e.length:0,n=d-1;d--;){var t=e[d];if(d==n||t!==r){var r=t;ar(t)?Zu.call(u,t,1):Xn(u,t)}}return u}function Ln(u,e){return u+Xe(id()*(e-u+1))}function Pn(u,e){var d="";if(!u||e<1||e>9007199254740991)return d;do{e%2&&(d+=u),(e=Xe(e/2))&&(u+=u)}while(e);return d}function Mn(u,e){return Dr(mr(u,e,Gc),u+"")}function Tn(u){return Md(Ac(u))}function Rn(u,e){var d=Ac(u);return xr(d,Jd(e,0,d.length))}function Un(u,e,d,n){if(!za(u))return u;for(var t=-1,r=(e=ct(e,u)).length,a=r-1,c=u;null!=c&&++tr?0:r+e),(d=d>r?r:d)<0&&(d+=r),r=e>d?0:d-e>>>0,e>>>=0;for(var a=n(r);++t>>1,a=u[r];null!==a&&!Va(a)&&(d?a<=e:a=200){var i=e?null:Pt(u);if(i)return Ke(i);a=!1,t=je,f=new Bd}else f=e?[]:c;u:for(;++n=n?u:Gn(u,e,d)}var ot=Ze||function(u){return qu.clearTimeout(u)};function lt(u,e){if(e)return u.slice();var d=u.length,n=zu?zu(d):new u.constructor(d);return u.copy(n),n}function st(u){var e=new u.constructor(u.byteLength);return new Lu(e).set(new Lu(u)),e}function pt(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.length)}function mt(u,e){if(u!==e){var d=void 0!==u,n=null===u,t=u==u,r=Va(u),a=void 0!==e,c=null===e,f=e==e,i=Va(e);if(!c&&!i&&!r&&u>e||r&&a&&f&&!c&&!i||n&&a&&f||!d&&f||!t)return 1;if(!n&&!r&&!i&&u1?d[t-1]:void 0,a=t>2?d[2]:void 0;for(r=u.length>3&&"function"==typeof r?(t--,r):void 0,a&&cr(d[0],d[1],a)&&(r=t<3?void 0:r,t=1),e=hu(e);++n-1?t[r?e[a]:a]:void 0}}function Ft(u){return Wt((function(e){var d=e.length,n=d,t=Sd.prototype.thru;for(u&&e.reverse();n--;){var a=e[n];if("function"!=typeof a)throw new _u(r);if(t&&!c&&"wrapper"==Jt(a))var c=new Sd([],!0)}for(n=c?n:d;++n1&&g.reverse(),l&&i<_&&(g.length=i),this&&this!==qu&&this instanceof v&&(w=b||wt(w)),w.apply(I,g)}}function kt(u,e){return function(d,n){return function(u,e,d,n){return cn(u,(function(u,t,r){e(n,d(u),t,r)})),n}(d,u,e(n),{})}}function St(u,e){return function(d,n){var t;if(void 0===d&&void 0===n)return e;if(void 0!==d&&(t=d),void 0!==n){if(void 0===t)return n;"string"==typeof d||"string"==typeof n?(d=Yn(d),n=Yn(n)):(d=Vn(d),n=Vn(n)),t=u(d,n)}return t}}function Ot(u){return Wt((function(e){return e=pe(e,Se(Vt())),Mn((function(d){var n=this;return u(e,(function(u){return re(u,n,d)}))}))}))}function jt(u,e){var d=(e=void 0===e?" ":Yn(e)).length;if(d<2)return d?Pn(e,u):e;var n=Pn(e,Qe(u/Ge(e)));return Te(e)?it(He(n),0,u).join(""):n.slice(0,u)}function $t(u){return function(e,d,t){return t&&"number"!=typeof t&&cr(e,d,t)&&(d=t=void 0),e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d,t){for(var r=-1,a=rd(Qe((e-u)/(d||1)),0),c=n(a);a--;)c[t?a:++r]=u,u+=d;return c}(e,d,t=void 0===t?ec))return!1;var i=r.get(u);if(i&&r.get(e))return i==e;var o=-1,l=!0,s=2&d?new Bd:void 0;for(r.set(u,e),r.set(e,u);++o-1&&u%1==0&&u1?"& ":"")+e[n],e=e.join(d>2?", ":" "),u.replace(Y,"{\n/* [wrapped with "+e+"] */\n")}(n,function(u,e){return ce(c,(function(d){var n="_."+d[0];e&d[1]&&!le(u,n)&&u.push(n)})),u.sort()}(function(u){var e=u.match(Q);return e?e[1].split(X):[]}(n),d)))}function Er(u){var e=0,d=0;return function(){var n=cd(),t=16-(n-d);if(d=n,t>0){if(++e>=800)return arguments[0]}else e=0;return u.apply(void 0,arguments)}}function xr(u,e){var d=-1,n=u.length,t=n-1;for(e=void 0===e?n:e;++d1?u[e-1]:void 0;return d="function"==typeof d?(u.pop(),d):void 0,qr(u,d)}));function ua(u){var e=Fd(u);return e.__chain__=!0,e}function ea(u,e){return e(u)}var da=Wt((function(u){var e=u.length,d=e?u[0]:0,n=this.__wrapped__,t=function(e){return qd(e,u)};return!(e>1||this.__actions__.length)&&n instanceof Od&&ar(d)?((n=n.slice(d,+d+(e?1:0))).__actions__.push({func:ea,args:[t],thisArg:void 0}),new Sd(n,this.__chain__).thru((function(u){return e&&!u.length&&u.push(void 0),u}))):this.thru(t)}));var na=gt((function(u,e,d){Iu.call(u,d)?++u[d]:Hd(u,d,1)}));var ta=Ct(Or),ra=Ct(jr);function aa(u,e){return(ja(u)?ce:Xd)(u,Vt(e,3))}function ca(u,e){return(ja(u)?fe:un)(u,Vt(e,3))}var fa=gt((function(u,e,d){Iu.call(u,d)?u[d].push(e):Hd(u,d,[e])}));var ia=Mn((function(u,e,d){var t=-1,r="function"==typeof e,a=Na(u)?n(u.length):[];return Xd(u,(function(u){a[++t]=r?re(e,u,d):_n(u,e,d)})),a})),oa=gt((function(u,e,d){Hd(u,d,e)}));function la(u,e){return(ja(u)?pe:Fn)(u,Vt(e,3))}var sa=gt((function(u,e,d){u[d?0:1].push(e)}),(function(){return[[],[]]}));var pa=Mn((function(u,e){if(null==u)return[];var d=e.length;return d>1&&cr(u,e[0],e[1])?e=[]:d>2&&cr(e[0],e[1],e[2])&&(e=[e[0]]),jn(u,tn(e,1),[])})),ma=Ve||function(){return qu.Date.now()};function ha(u,e,d){return e=d?void 0:e,Tt(u,128,void 0,void 0,void 0,void 0,e=u&&null==e?u.length:e)}function ba(u,e){var d;if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){return--u>0&&(d=e.apply(this,arguments)),u<=1&&(e=void 0),d}}var va=Mn((function(u,e,d){var n=1;if(d.length){var t=ze(d,Zt(va));n|=32}return Tt(u,n,e,d,t)})),_a=Mn((function(u,e,d){var n=3;if(d.length){var t=ze(d,Zt(_a));n|=32}return Tt(e,n,u,d,t)}));function ga(u,e,d){var n,t,a,c,f,i,o=0,l=!1,s=!1,p=!0;if("function"!=typeof u)throw new _u(r);function m(e){var d=n,r=t;return n=t=void 0,o=e,c=u.apply(r,d)}function h(u){return o=u,f=gr(v,e),l?m(u):c}function b(u){var d=u-i;return void 0===i||d>=e||d<0||s&&u-o>=a}function v(){var u=ma();if(b(u))return _(u);f=gr(v,function(u){var d=e-(u-i);return s?ad(d,a-(u-o)):d}(u))}function _(u){return f=void 0,p&&n?m(u):(n=t=void 0,c)}function g(){var u=ma(),d=b(u);if(n=arguments,t=this,i=u,d){if(void 0===f)return h(i);if(s)return ot(f),f=gr(v,e),m(i)}return void 0===f&&(f=gr(v,e)),c}return e=tc(e)||0,za(d)&&(l=!!d.leading,a=(s="maxWait"in d)?rd(tc(d.maxWait)||0,e):a,p="trailing"in d?!!d.trailing:p),g.cancel=function(){void 0!==f&&ot(f),o=0,n=i=t=f=void 0},g.flush=function(){return void 0===f?c:_(ma())},g}var Da=Mn((function(u,e){return Yd(u,1,e)})),ya=Mn((function(u,e,d){return Yd(u,tc(e)||0,d)}));function Ea(u,e){if("function"!=typeof u||null!=e&&"function"!=typeof e)throw new _u(r);var d=function(){var n=arguments,t=e?e.apply(this,n):n[0],r=d.cache;if(r.has(t))return r.get(t);var a=u.apply(this,n);return d.cache=r.set(t,a)||r,a};return d.cache=new(Ea.Cache||Nd),d}function xa(u){if("function"!=typeof u)throw new _u(r);return function(){var e=arguments;switch(e.length){case 0:return!u.call(this);case 1:return!u.call(this,e[0]);case 2:return!u.call(this,e[0],e[1]);case 3:return!u.call(this,e[0],e[1],e[2])}return!u.apply(this,e)}}Ea.Cache=Nd;var Ia=ft((function(u,e){var d=(e=1==e.length&&ja(e[0])?pe(e[0],Se(Vt())):pe(tn(e,1),Se(Vt()))).length;return Mn((function(n){for(var t=-1,r=ad(n.length,d);++t=e})),Oa=gn(function(){return arguments}())?gn:function(u){return Ka(u)&&Iu.call(u,"callee")&&!Ju.call(u,"callee")},ja=n.isArray,$a=Xu?Se(Xu):function(u){return Ka(u)&&pn(u)==x};function Na(u){return null!=u&&Ua(u.length)&&!Ta(u)}function Ba(u){return Ka(u)&&Na(u)}var La=ed||tf,Pa=ue?Se(ue):function(u){return Ka(u)&&pn(u)==l};function Ma(u){if(!Ka(u))return!1;var e=pn(u);return e==s||"[object DOMException]"==e||"string"==typeof u.message&&"string"==typeof u.name&&!Ha(u)}function Ta(u){if(!za(u))return!1;var e=pn(u);return e==p||e==m||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Ra(u){return"number"==typeof u&&u==dc(u)}function Ua(u){return"number"==typeof u&&u>-1&&u%1==0&&u<=9007199254740991}function za(u){var e=typeof u;return null!=u&&("object"==e||"function"==e)}function Ka(u){return null!=u&&"object"==typeof u}var Wa=ee?Se(ee):function(u){return Ka(u)&&dr(u)==h};function Ga(u){return"number"==typeof u||Ka(u)&&pn(u)==b}function Ha(u){if(!Ka(u)||pn(u)!=v)return!1;var e=Gu(u);if(null===e)return!0;var d=Iu.call(e,"constructor")&&e.constructor;return"function"==typeof d&&d instanceof d&&xu.call(d)==Au}var qa=de?Se(de):function(u){return Ka(u)&&pn(u)==_};var Ja=ne?Se(ne):function(u){return Ka(u)&&dr(u)==g};function Za(u){return"string"==typeof u||!ja(u)&&Ka(u)&&pn(u)==D}function Va(u){return"symbol"==typeof u||Ka(u)&&pn(u)==y}var Ya=te?Se(te):function(u){return Ka(u)&&Ua(u.length)&&!!Ru[pn(u)]};var Qa=Nt(Cn),Xa=Nt((function(u,e){return u<=e}));function uc(u){if(!u)return[];if(Na(u))return Za(u)?He(u):vt(u);if(Qu&&u[Qu])return function(u){for(var e,d=[];!(e=u.next()).done;)d.push(e.value);return d}(u[Qu]());var e=dr(u);return(e==h?Re:e==g?Ke:Ac)(u)}function ec(u){return u?(u=tc(u))===1/0||u===-1/0?17976931348623157e292*(u<0?-1:1):u==u?u:0:0===u?u:0}function dc(u){var e=ec(u),d=e%1;return e==e?d?e-d:e:0}function nc(u){return u?Jd(dc(u),0,4294967295):0}function tc(u){if("number"==typeof u)return u;if(Va(u))return NaN;if(za(u)){var e="function"==typeof u.valueOf?u.valueOf():u;u=za(e)?e+"":e}if("string"!=typeof u)return 0===u?u:+u;u=u.replace(J,"");var d=ru.test(u);return d||cu.test(u)?Wu(u.slice(2),d?2:8):tu.test(u)?NaN:+u}function rc(u){return _t(u,Dc(u))}function ac(u){return null==u?"":Yn(u)}var cc=Dt((function(u,e){if(lr(e)||Na(e))_t(e,gc(e),u);else for(var d in e)Iu.call(e,d)&&zd(u,d,e[d])})),fc=Dt((function(u,e){_t(e,Dc(e),u)})),ic=Dt((function(u,e,d,n){_t(e,Dc(e),u,n)})),oc=Dt((function(u,e,d,n){_t(e,gc(e),u,n)})),lc=Wt(qd);var sc=Mn((function(u,e){u=hu(u);var d=-1,n=e.length,t=n>2?e[2]:void 0;for(t&&cr(e[0],e[1],t)&&(n=1);++d1),e})),_t(u,Ht(u),d),n&&(d=Zd(d,7,zt));for(var t=e.length;t--;)Xn(d,e[t]);return d}));var Ic=Wt((function(u,e){return null==u?{}:function(u,e){return $n(u,e,(function(e,d){return hc(u,d)}))}(u,e)}));function wc(u,e){if(null==u)return{};var d=pe(Ht(u),(function(u){return[u]}));return e=Vt(e),$n(u,d,(function(u,d){return e(u,d[0])}))}var Cc=Mt(gc),Fc=Mt(Dc);function Ac(u){return null==u?[]:Oe(u,gc(u))}var kc=It((function(u,e,d){return e=e.toLowerCase(),u+(d?Sc(e):e)}));function Sc(u){return Mc(ac(u).toLowerCase())}function Oc(u){return(u=ac(u))&&u.replace(iu,Le).replace($u,"")}var jc=It((function(u,e,d){return u+(d?"-":"")+e.toLowerCase()})),$c=It((function(u,e,d){return u+(d?" ":"")+e.toLowerCase()})),Nc=xt("toLowerCase");var Bc=It((function(u,e,d){return u+(d?"_":"")+e.toLowerCase()}));var Lc=It((function(u,e,d){return u+(d?" ":"")+Mc(e)}));var Pc=It((function(u,e,d){return u+(d?" ":"")+e.toUpperCase()})),Mc=xt("toUpperCase");function Tc(u,e,d){return u=ac(u),void 0===(e=d?void 0:e)?function(u){return Pu.test(u)}(u)?function(u){return u.match(Bu)||[]}(u):function(u){return u.match(uu)||[]}(u):u.match(e)||[]}var Rc=Mn((function(u,e){try{return re(u,void 0,e)}catch(d){return Ma(d)?d:new su(d)}})),Uc=Wt((function(u,e){return ce(e,(function(e){e=wr(e),Hd(u,e,va(u[e],u))})),u}));function zc(u){return function(){return u}}var Kc=Ft(),Wc=Ft(!0);function Gc(u){return u}function Hc(u){return xn("function"==typeof u?u:Zd(u,1))}var qc=Mn((function(u,e){return function(d){return _n(d,u,e)}})),Jc=Mn((function(u,e){return function(d){return _n(u,d,e)}}));function Zc(u,e,d){var n=gc(e),t=on(e,n);null!=d||za(e)&&(t.length||!n.length)||(d=e,e=u,u=this,t=on(e,gc(e)));var r=!(za(d)&&"chain"in d&&!d.chain),a=Ta(u);return ce(t,(function(d){var n=e[d];u[d]=n,a&&(u.prototype[d]=function(){var e=this.__chain__;if(r||e){var d=u(this.__wrapped__),t=d.__actions__=vt(this.__actions__);return t.push({func:n,args:arguments,thisArg:u}),d.__chain__=e,d}return n.apply(u,me([this.value()],arguments))})})),u}function Vc(){}var Yc=Ot(pe),Qc=Ot(ie),Xc=Ot(ve);function uf(u){return fr(u)?we(wr(u)):function(u){return function(e){return ln(e,u)}}(u)}var ef=$t(),df=$t(!0);function nf(){return[]}function tf(){return!1}var rf=St((function(u,e){return u+e}),0),af=Lt("ceil"),cf=St((function(u,e){return u/e}),1),ff=Lt("floor");var of,lf=St((function(u,e){return u*e}),1),sf=Lt("round"),pf=St((function(u,e){return u-e}),0);return Fd.after=function(u,e){if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){if(--u<1)return e.apply(this,arguments)}},Fd.ary=ha,Fd.assign=cc,Fd.assignIn=fc,Fd.assignInWith=ic,Fd.assignWith=oc,Fd.at=lc,Fd.before=ba,Fd.bind=va,Fd.bindAll=Uc,Fd.bindKey=_a,Fd.castArray=function(){if(!arguments.length)return[];var u=arguments[0];return ja(u)?u:[u]},Fd.chain=ua,Fd.chunk=function(u,e,d){e=(d?cr(u,e,d):void 0===e)?1:rd(dc(e),0);var t=null==u?0:u.length;if(!t||e<1)return[];for(var r=0,a=0,c=n(Qe(t/e));rt?0:t+d),(n=void 0===n||n>t?t:dc(n))<0&&(n+=t),n=d>n?0:nc(n);d>>0)?(u=ac(u))&&("string"==typeof e||null!=e&&!qa(e))&&!(e=Yn(e))&&Te(u)?it(He(u),0,d):u.split(e,d):[]},Fd.spread=function(u,e){if("function"!=typeof u)throw new _u(r);return e=null==e?0:rd(dc(e),0),Mn((function(d){var n=d[e],t=it(d,0,e);return n&&me(t,n),re(u,this,t)}))},Fd.tail=function(u){var e=null==u?0:u.length;return e?Gn(u,1,e):[]},Fd.take=function(u,e,d){return u&&u.length?Gn(u,0,(e=d||void 0===e?1:dc(e))<0?0:e):[]},Fd.takeRight=function(u,e,d){var n=null==u?0:u.length;return n?Gn(u,(e=n-(e=d||void 0===e?1:dc(e)))<0?0:e,n):[]},Fd.takeRightWhile=function(u,e){return u&&u.length?et(u,Vt(e,3),!1,!0):[]},Fd.takeWhile=function(u,e){return u&&u.length?et(u,Vt(e,3)):[]},Fd.tap=function(u,e){return e(u),u},Fd.throttle=function(u,e,d){var n=!0,t=!0;if("function"!=typeof u)throw new _u(r);return za(d)&&(n="leading"in d?!!d.leading:n,t="trailing"in d?!!d.trailing:t),ga(u,e,{leading:n,maxWait:e,trailing:t})},Fd.thru=ea,Fd.toArray=uc,Fd.toPairs=Cc,Fd.toPairsIn=Fc,Fd.toPath=function(u){return ja(u)?pe(u,wr):Va(u)?[u]:vt(Ir(ac(u)))},Fd.toPlainObject=rc,Fd.transform=function(u,e,d){var n=ja(u),t=n||La(u)||Ya(u);if(e=Vt(e,4),null==d){var r=u&&u.constructor;d=t?n?new r:[]:za(u)&&Ta(r)?Ad(Gu(u)):{}}return(t?ce:cn)(u,(function(u,n,t){return e(d,u,n,t)})),d},Fd.unary=function(u){return ha(u,1)},Fd.union=Kr,Fd.unionBy=Wr,Fd.unionWith=Gr,Fd.uniq=function(u){return u&&u.length?Qn(u):[]},Fd.uniqBy=function(u,e){return u&&u.length?Qn(u,Vt(e,2)):[]},Fd.uniqWith=function(u,e){return e="function"==typeof e?e:void 0,u&&u.length?Qn(u,void 0,e):[]},Fd.unset=function(u,e){return null==u||Xn(u,e)},Fd.unzip=Hr,Fd.unzipWith=qr,Fd.update=function(u,e,d){return null==u?u:ut(u,e,at(d))},Fd.updateWith=function(u,e,d,n){return n="function"==typeof n?n:void 0,null==u?u:ut(u,e,at(d),n)},Fd.values=Ac,Fd.valuesIn=function(u){return null==u?[]:Oe(u,Dc(u))},Fd.without=Jr,Fd.words=Tc,Fd.wrap=function(u,e){return wa(at(e),u)},Fd.xor=Zr,Fd.xorBy=Vr,Fd.xorWith=Yr,Fd.zip=Qr,Fd.zipObject=function(u,e){return tt(u||[],e||[],zd)},Fd.zipObjectDeep=function(u,e){return tt(u||[],e||[],Un)},Fd.zipWith=Xr,Fd.entries=Cc,Fd.entriesIn=Fc,Fd.extend=fc,Fd.extendWith=ic,Zc(Fd,Fd),Fd.add=rf,Fd.attempt=Rc,Fd.camelCase=kc,Fd.capitalize=Sc,Fd.ceil=af,Fd.clamp=function(u,e,d){return void 0===d&&(d=e,e=void 0),void 0!==d&&(d=(d=tc(d))==d?d:0),void 0!==e&&(e=(e=tc(e))==e?e:0),Jd(tc(u),e,d)},Fd.clone=function(u){return Zd(u,4)},Fd.cloneDeep=function(u){return Zd(u,5)},Fd.cloneDeepWith=function(u,e){return Zd(u,5,e="function"==typeof e?e:void 0)},Fd.cloneWith=function(u,e){return Zd(u,4,e="function"==typeof e?e:void 0)},Fd.conformsTo=function(u,e){return null==e||Vd(u,e,gc(e))},Fd.deburr=Oc,Fd.defaultTo=function(u,e){return null==u||u!=u?e:u},Fd.divide=cf,Fd.endsWith=function(u,e,d){u=ac(u),e=Yn(e);var n=u.length,t=d=void 0===d?n:Jd(dc(d),0,n);return(d-=e.length)>=0&&u.slice(d,t)==e},Fd.eq=Aa,Fd.escape=function(u){return(u=ac(u))&&T.test(u)?u.replace(P,Pe):u},Fd.escapeRegExp=function(u){return(u=ac(u))&&q.test(u)?u.replace(H,"\\$&"):u},Fd.every=function(u,e,d){var n=ja(u)?ie:en;return d&&cr(u,e,d)&&(e=void 0),n(u,Vt(e,3))},Fd.find=ta,Fd.findIndex=Or,Fd.findKey=function(u,e){return ge(u,Vt(e,3),cn)},Fd.findLast=ra,Fd.findLastIndex=jr,Fd.findLastKey=function(u,e){return ge(u,Vt(e,3),fn)},Fd.floor=ff,Fd.forEach=aa,Fd.forEachRight=ca,Fd.forIn=function(u,e){return null==u?u:rn(u,Vt(e,3),Dc)},Fd.forInRight=function(u,e){return null==u?u:an(u,Vt(e,3),Dc)},Fd.forOwn=function(u,e){return u&&cn(u,Vt(e,3))},Fd.forOwnRight=function(u,e){return u&&fn(u,Vt(e,3))},Fd.get=mc,Fd.gt=ka,Fd.gte=Sa,Fd.has=function(u,e){return null!=u&&nr(u,e,hn)},Fd.hasIn=hc,Fd.head=Nr,Fd.identity=Gc,Fd.includes=function(u,e,d,n){u=Na(u)?u:Ac(u),d=d&&!n?dc(d):0;var t=u.length;return d<0&&(d=rd(t+d,0)),Za(u)?d<=t&&u.indexOf(e,d)>-1:!!t&&ye(u,e,d)>-1},Fd.indexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=null==d?0:dc(d);return t<0&&(t=rd(n+t,0)),ye(u,e,t)},Fd.inRange=function(u,e,d){return e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d){return u>=ad(e,d)&&u=-9007199254740991&&u<=9007199254740991},Fd.isSet=Ja,Fd.isString=Za,Fd.isSymbol=Va,Fd.isTypedArray=Ya,Fd.isUndefined=function(u){return void 0===u},Fd.isWeakMap=function(u){return Ka(u)&&dr(u)==E},Fd.isWeakSet=function(u){return Ka(u)&&"[object WeakSet]"==pn(u)},Fd.join=function(u,e){return null==u?"":nd.call(u,e)},Fd.kebabCase=jc,Fd.last=Mr,Fd.lastIndexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=n;return void 0!==d&&(t=(t=dc(d))<0?rd(n+t,0):ad(t,n-1)),e==e?function(u,e,d){for(var n=d+1;n--;)if(u[n]===e)return n;return n}(u,e,t):De(u,xe,t,!0)},Fd.lowerCase=$c,Fd.lowerFirst=Nc,Fd.lt=Qa,Fd.lte=Xa,Fd.max=function(u){return u&&u.length?dn(u,Gc,mn):void 0},Fd.maxBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),mn):void 0},Fd.mean=function(u){return Ie(u,Gc)},Fd.meanBy=function(u,e){return Ie(u,Vt(e,2))},Fd.min=function(u){return u&&u.length?dn(u,Gc,Cn):void 0},Fd.minBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),Cn):void 0},Fd.stubArray=nf,Fd.stubFalse=tf,Fd.stubObject=function(){return{}},Fd.stubString=function(){return""},Fd.stubTrue=function(){return!0},Fd.multiply=lf,Fd.nth=function(u,e){return u&&u.length?On(u,dc(e)):void 0},Fd.noConflict=function(){return qu._===this&&(qu._=ku),this},Fd.noop=Vc,Fd.now=ma,Fd.pad=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;if(!e||n>=e)return u;var t=(e-n)/2;return jt(Xe(t),d)+u+jt(Qe(t),d)},Fd.padEnd=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;return e&&ne){var n=u;u=e,e=n}if(d||u%1||e%1){var t=id();return ad(u+t*(e-u+Ku("1e-"+((t+"").length-1))),e)}return Ln(u,e)},Fd.reduce=function(u,e,d){var n=ja(u)?he:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,Xd)},Fd.reduceRight=function(u,e,d){var n=ja(u)?be:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,un)},Fd.repeat=function(u,e,d){return e=(d?cr(u,e,d):void 0===e)?1:dc(e),Pn(ac(u),e)},Fd.replace=function(){var u=arguments,e=ac(u[0]);return u.length<3?e:e.replace(u[1],u[2])},Fd.result=function(u,e,d){var n=-1,t=(e=ct(e,u)).length;for(t||(t=1,u=void 0);++n9007199254740991)return[];var d=4294967295,n=ad(u,4294967295);u-=4294967295;for(var t=ke(n,e=Vt(e));++d=r)return u;var c=d-Ge(n);if(c<1)return n;var f=a?it(a,0,c).join(""):u.slice(0,c);if(void 0===t)return f+n;if(a&&(c+=f.length-c),qa(t)){if(u.slice(c).search(t)){var i,o=f;for(t.global||(t=bu(t.source,ac(nu.exec(t))+"g")),t.lastIndex=0;i=t.exec(o);)var l=i.index;f=f.slice(0,void 0===l?c:l)}}else if(u.indexOf(Yn(t),c)!=c){var s=f.lastIndexOf(t);s>-1&&(f=f.slice(0,s))}return f+n},Fd.unescape=function(u){return(u=ac(u))&&M.test(u)?u.replace(L,qe):u},Fd.uniqueId=function(u){var e=++wu;return ac(u)+e},Fd.upperCase=Pc,Fd.upperFirst=Mc,Fd.each=aa,Fd.eachRight=ca,Fd.first=Nr,Zc(Fd,(of={},cn(Fd,(function(u,e){Iu.call(Fd.prototype,e)||(of[e]=u)})),of),{chain:!1}),Fd.VERSION="4.17.15",ce(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(u){Fd[u].placeholder=Fd})),ce(["drop","take"],(function(u,e){Od.prototype[u]=function(d){d=void 0===d?1:rd(dc(d),0);var n=this.__filtered__&&!e?new Od(this):this.clone();return n.__filtered__?n.__takeCount__=ad(d,n.__takeCount__):n.__views__.push({size:ad(d,4294967295),type:u+(n.__dir__<0?"Right":"")}),n},Od.prototype[u+"Right"]=function(e){return this.reverse()[u](e).reverse()}})),ce(["filter","map","takeWhile"],(function(u,e){var d=e+1,n=1==d||3==d;Od.prototype[u]=function(u){var e=this.clone();return e.__iteratees__.push({iteratee:Vt(u,3),type:d}),e.__filtered__=e.__filtered__||n,e}})),ce(["head","last"],(function(u,e){var d="take"+(e?"Right":"");Od.prototype[u]=function(){return this[d](1).value()[0]}})),ce(["initial","tail"],(function(u,e){var d="drop"+(e?"":"Right");Od.prototype[u]=function(){return this.__filtered__?new Od(this):this[d](1)}})),Od.prototype.compact=function(){return this.filter(Gc)},Od.prototype.find=function(u){return this.filter(u).head()},Od.prototype.findLast=function(u){return this.reverse().find(u)},Od.prototype.invokeMap=Mn((function(u,e){return"function"==typeof u?new Od(this):this.map((function(d){return _n(d,u,e)}))})),Od.prototype.reject=function(u){return this.filter(xa(Vt(u)))},Od.prototype.slice=function(u,e){u=dc(u);var d=this;return d.__filtered__&&(u>0||e<0)?new Od(d):(u<0?d=d.takeRight(-u):u&&(d=d.drop(u)),void 0!==e&&(d=(e=dc(e))<0?d.dropRight(-e):d.take(e-u)),d)},Od.prototype.takeRightWhile=function(u){return this.reverse().takeWhile(u).reverse()},Od.prototype.toArray=function(){return this.take(4294967295)},cn(Od.prototype,(function(u,e){var d=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),t=Fd[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);t&&(Fd.prototype[e]=function(){var e=this.__wrapped__,a=n?[1]:arguments,c=e instanceof Od,f=a[0],i=c||ja(e),o=function(u){var e=t.apply(Fd,me([u],a));return n&&l?e[0]:e};i&&d&&"function"==typeof f&&1!=f.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){e=m?e:new Od(this);var h=u.apply(e,a);return h.__actions__.push({func:ea,args:[o],thisArg:void 0}),new Sd(h,l)}return p&&m?u.apply(this,a):(h=this.thru(o),p?n?h.value()[0]:h.value():h)})})),ce(["pop","push","shift","sort","splice","unshift"],(function(u){var e=gu[u],d=/^(?:push|sort|unshift)$/.test(u)?"tap":"thru",n=/^(?:pop|shift)$/.test(u);Fd.prototype[u]=function(){var u=arguments;if(n&&!this.__chain__){var t=this.value();return e.apply(ja(t)?t:[],u)}return this[d]((function(d){return e.apply(ja(d)?d:[],u)}))}})),cn(Od.prototype,(function(u,e){var d=Fd[e];if(d){var n=d.name+"";Iu.call(_d,n)||(_d[n]=[]),_d[n].push({name:e,func:d})}})),_d[At(void 0,2).name]=[{name:"wrapper",func:void 0}],Od.prototype.clone=function(){var u=new Od(this.__wrapped__);return u.__actions__=vt(this.__actions__),u.__dir__=this.__dir__,u.__filtered__=this.__filtered__,u.__iteratees__=vt(this.__iteratees__),u.__takeCount__=this.__takeCount__,u.__views__=vt(this.__views__),u},Od.prototype.reverse=function(){if(this.__filtered__){var u=new Od(this);u.__dir__=-1,u.__filtered__=!0}else(u=this.clone()).__dir__*=-1;return u},Od.prototype.value=function(){var u=this.__wrapped__.value(),e=this.__dir__,d=ja(u),n=e<0,t=d?u.length:0,r=function(u,e,d){var n=-1,t=d.length;for(;++n=this.__values__.length;return{done:u,value:u?void 0:this.__values__[this.__index__++]}},Fd.prototype.plant=function(u){for(var e,d=this;d instanceof kd;){var n=Fr(d);n.__index__=0,n.__values__=void 0,e?t.__wrapped__=n:e=n;var t=n;d=d.__wrapped__}return t.__wrapped__=u,e},Fd.prototype.reverse=function(){var u=this.__wrapped__;if(u instanceof Od){var e=u;return this.__actions__.length&&(e=new Od(this)),(e=e.reverse()).__actions__.push({func:ea,args:[zr],thisArg:void 0}),new Sd(e,this.__chain__)}return this.thru(zr)},Fd.prototype.toJSON=Fd.prototype.valueOf=Fd.prototype.value=function(){return dt(this.__wrapped__,this.__actions__)},Fd.prototype.first=Fd.prototype.head,Qu&&(Fd.prototype[Qu]=function(){return this}),Fd}();qu._=Je,void 0===(t=function(){return Je}.call(e,d,e,n))||(n.exports=t)}).call(this)}).call(this,d(76),d(456)(u))},454:function(u,e,d){"use strict";var n=d(0),t=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=t},455:function(u,e,d){"use strict";d.d(e,"a",(function(){return r}));d(77),d(473),d(439),d(78);var n=d(475),t=d.n(n);function r(u,e){var d=new t.a;return u.map((function(u){var n=u;return"string"==typeof u&&(n={label:u,permalink:"/blog/tags/"+d.slug(u)}),function(u,e){var d=u.label.split(": ",2),n=d[0],t=d[1],r="primary";switch(e){case"blog":case"guides":r=function(u){switch(u){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:u.count,label:u.label,permalink:u.permalink,style:r,value:t}}(n,e)}))}},456:function(u,e){u.exports=function(u){return u.webpackPolyfill||(u.deprecate=function(){},u.paths=[],u.children||(u.children=[]),Object.defineProperty(u,"loaded",{enumerable:!0,get:function(){return u.l}}),Object.defineProperty(u,"id",{enumerable:!0,get:function(){return u.i}}),u.webpackPolyfill=1),u}},465:function(u,e,d){var n=d(30),t=d(54),r=d(27),a=d(26),c=d(466);u.exports=function(u,e){var d=1==u,f=2==u,i=3==u,o=4==u,l=6==u,s=5==u||l,p=e||c;return function(e,c,m){for(var h,b,v=r(e),_=t(v),g=n(c,m,3),D=a(_.length),y=0,E=d?p(e,D):f?p(e,0):void 0;D>y;y++)if((s||y in _)&&(b=g(h=_[y],y,v),u))if(d)E[y]=b;else if(b)switch(u){case 3:return!0;case 5:return h;case 6:return y;case 2:E.push(h)}else if(o)return!1;return l?-1:i||o?o:E}}},466:function(u,e,d){var n=d(467);u.exports=function(u,e){return new(n(u))(e)}},467:function(u,e,d){var n=d(13),t=d(468),r=d(2)("species");u.exports=function(u){var e;return t(u)&&("function"!=typeof(e=u.constructor)||e!==Array&&!t(e.prototype)||(e=void 0),n(e)&&null===(e=e[r])&&(e=void 0)),void 0===e?Array:e}},468:function(u,e,d){var n=d(23);u.exports=Array.isArray||function(u){return"Array"==n(u)}},474:function(u,e,d){"use strict";var n=d(0),t=d.n(n),r=d(430),a=d(423),c=d.n(a);e.a=function(u){var e=u.count,d=u.label,n=u.permalink,a=u.style,f=u.value,i=u.valueOnly;return t.a.createElement(r.a,{to:n+"/",className:c()("badge","badge--rounded","badge--"+a)},i?f:d,e&&t.a.createElement(t.a.Fragment,null," (",e,")"))}},475:function(u,e,d){var n=d(476);u.exports=c;var t=Object.hasOwnProperty,r=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function c(){if(!(this instanceof c))return new c;this.reset()}function f(u,e){return"string"!=typeof u?"":(e||(u=u.toLowerCase()),u.trim().replace(a,"").replace(n(),"").replace(r,"-"))}c.prototype.slug=function(u,e){for(var d=f(u,!0===e),n=d;t.call(this.occurrences,d);)this.occurrences[n]++,d=n+"-"+this.occurrences[n];return this.occurrences[d]=0,d},c.prototype.reset=function(){this.occurrences=Object.create(null)},c.slug=f},476:function(u,e){u.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},481:function(u,e,d){"use strict";const n=d(493),t=u=>{if("string"!=typeof u)throw new TypeError("Expected a string");return u=(u=(u=n(u)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+u.slice(1)};u.exports=t,u.exports.default=t},493:function(u,e,d){"use strict";const n=d(494);u.exports=(u,e)=>{if("string"!=typeof u)throw new TypeError("Expected a string");e=void 0===e?"_":e;const d=n("([\\p{Ll}\\d])(\\p{Lu})","g"),t=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return u.replace(d,`$1${e}$2`).replace(t,`$1${e}$2`).toLowerCase()}},494:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=l(d(495)),t=l(d(496)),r=l(d(497)),a=l(d(498)),c=l(d(499)),f=l(d(500)),i=l(d(501)),o=l(d(502));function l(u){return u&&u.__esModule?u:{default:u}}(0,t.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,f.default)(n.default),(0,i.default)(n.default),(0,o.default)(n.default),e.default=n.default,u.exports=e.default},495:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={astral:!1},t={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},f=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},o=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===t.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(u){var e=!0;try{new RegExp("",u)}catch(d){e=!1}return e}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function _(u,e,d,n,t){var r=void 0;if(u.xregexp={captureNames:e},t)return u;if(u.__proto__)u.__proto__=O.prototype;else for(r in O.prototype)u[r]=O.prototype[r];return u.xregexp.source=d,u.xregexp.flags=n?n.split("").sort().join(""):n,u}function g(u){return t.replace.call(u,/([\s\S])(?=[\s\S]*\1)/g,"")}function D(u,e){if(!O.isRegExp(u))throw new TypeError("Type RegExp expected");var d=u.xregexp||{},n=function(u){return s?u.flags:t.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(u))[1]}(u),r="",a="",c=null,f=null;return(e=e||{}).removeG&&(a+="g"),e.removeY&&(a+="y"),a&&(n=t.replace.call(n,new RegExp("["+a+"]+","g"),"")),e.addG&&(r+="g"),e.addY&&(r+="y"),r&&(n=g(n+r)),e.isInternalOnly||(void 0!==d.source&&(c=d.source),null!=d.flags&&(f=r?g(d.flags+r):d.flags)),u=_(new RegExp(e.source||u.source,n),function(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?d.captureNames.slice(0):null,c,f,e.isInternalOnly)}function y(u){return parseInt(u,16)}function E(u,e,d){return"("===u.input[u.index-1]||")"===u.input[u.index+u[0].length]||function(u,e,d){return t.test.call(-1!==d.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,u.slice(e))}(u.input,u.index+u[0].length,d)?"":"(?:)"}function x(u){return parseInt(u,10).toString(16)}function I(u,e){return p.call(u)==="[object "+e+"]"}function w(u){for(;u.length<4;)u="0"+u;return u}function C(u){var e={};return I(u,"String")?(O.forEach(u,/[^\s,]+/,(function(u){e[u]=!0})),e):u}function F(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");v[u]=!0}function A(u,e,d,n,t){for(var r=f.length,a=u[d],c=null,i=void 0,o=void 0;r--;)if(!((o=f[r]).leadChar&&o.leadChar!==a||o.scope!==n&&"all"!==o.scope||o.flag&&-1===e.indexOf(o.flag))&&(i=O.exec(u,o.regex,d,"sticky"))){c={matchLength:i[0].length,output:o.handler.call(t,i,n,e),reparse:o.reparse};break}return c}function k(u){n.astral=u}function S(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function O(u,e){if(O.isRegExp(u)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return D(u)}if(u=void 0===u?"":String(u),e=void 0===e?"":String(e),O.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A"),c[u]||(c[u]={}),!c[u][e]){for(var d={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,f=void 0,o=function(u,e){var d=void 0;if(g(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);for(u=t.replace.call(u,/^\(\?([\w$]+)\)/,(function(u,d){if(t.test.call(/[gy]/,d))throw new SyntaxError("Cannot use flag g or y in mode modifier "+u);return e=g(e+d),""})),d=0;d"}else if(d)return"\\"+(+d+a);return u}if(!I(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,o=[],l=void 0,s=0;s1&&-1!==d.indexOf("")){var n=D(this,{removeG:!0,isInternalOnly:!0});t.replace.call(String(u).slice(d.index),n,(function(){for(var u=arguments.length,e=Array(u),n=0;nd.index&&(this.lastIndex=d.index)}return this.global||(this.lastIndex=e),d},r.test=function(u){return!!r.exec.call(this,u)},r.match=function(u){if(O.isRegExp(u)){if(u.global){var e=t.match.apply(this,arguments);return u.lastIndex=0,e}}else u=new RegExp(u);return r.exec.call(u,S(this))},r.replace=function(u,e){var d=O.isRegExp(u),n=void 0,r=void 0,a=void 0;return d?(u.xregexp&&(r=u.xregexp.captureNames),n=u.lastIndex):u+="",a=I(e,"Function")?t.replace.call(String(this),u,(function(){for(var n=arguments.length,t=Array(n),a=0;ad.length-3)throw new SyntaxError("Backreference to undefined group "+u);return d[t]||""}throw new SyntaxError("Invalid token "+u)}})),d&&(u.global?u.lastIndex=0:u.lastIndex=n),a},r.split=function(u,e){if(!O.isRegExp(u))return t.split.apply(this,arguments);var d=String(this),n=[],r=u.lastIndex,a=0,c=void 0;return e=(void 0===e?-1:e)>>>0,O.forEach(d,u,(function(u){u.index+u[0].length>a&&(n.push(d.slice(a,u.index)),u.length>1&&u.indexe?n.slice(0,e):n},O.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,e){if("B"===u[1]&&"default"===e)return u[0];throw new SyntaxError("Invalid escape "+u[0])}),{scope:"all",leadChar:"\\"}),O.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,e,d){var n=y(u[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+u[0]);if(n<=65535)return"\\u"+w(x(n));if(h&&-1!==d.indexOf("u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),O.addToken(/\[(\^?)\]/,(function(u){return u[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),O.addToken(/\(\?#[^)]*\)/,E,{leadChar:"("}),O.addToken(/\s+|#[^\n]*\n?/,E,{flag:"x"}),O.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),O.addToken(/\\k<([\w$]+)>/,(function(u){var e=isNaN(u[1])?this.captureNames.indexOf(u[1])+1:+u[1],d=u.index+u[0].length;if(!e||e>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+u[0]);return"\\"+e+(d===u.input.length||isNaN(u.input[d])?"":"(?:)")}),{leadChar:"\\"}),O.addToken(/\\(\d+)/,(function(u,e){if(!("default"===e&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+u[0]);return u[0]}),{scope:"all",leadChar:"\\"}),O.addToken(/\(\?P?<([\w$]+)>/,(function(u){if(!isNaN(u[1]))throw new SyntaxError("Cannot use integer as capture name "+u[0]);if("length"===u[1]||"__proto__"===u[1])throw new SyntaxError("Cannot use reserved word as capture name "+u[0]);if(-1!==this.captureNames.indexOf(u[1]))throw new SyntaxError("Cannot use same name for multiple groups "+u[0]);return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),O.addToken(/\((?!\?)/,(function(u,e,d){return-1!==d.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),e.default=O,u.exports=e.default},496:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,d=u.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,e],"g",{conjunction:"or"});function n(u){var e=/^(?:\(\?:\))*\^/,d=/\$(?:\(\?:\))*$/;return e.test(u)&&d.test(u)&&d.test(u.replace(/\\[\s\S]/g,""))?u.replace(e,"").replace(d,""):u}function t(e,d){var n=d?"x":"";return u.isRegExp(e)?e.xregexp&&e.xregexp.captureNames?e:u(e.source,n):u(e,n)}function r(e){return e instanceof RegExp?e:u.escape(e)}function a(u,e,d){return u["subpattern"+d]=e,u}function c(u,e,d){return u+(e1?n-1:0),f=1;f"):f="(?:",h=m,""+f+o[a].pattern.replace(e,(function(u,e,d){if(e){if(c=o[a].names[m-h],++m,c)return"(?<"+c+">"}else if(d)return i=+d-1,o[a].names[i]?"\\k<"+o[a].names[i]+">":"\\"+(+d+h);return u}))+")"}if(t){if(c=_[b],v[++b]=++m,c)return"(?<"+c+">"}else if(r)return _[i=+r-1]?"\\k<"+_[i]+">":"\\"+v[+r];return u}));return u(g,c)}},u.exports=e.default},497:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){function e(u,e,d,n){return{name:u,value:e,start:d,end:n}}u.matchRecursive=function(d,n,t,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),f=-1!==r.indexOf("y"),i=r.replace(/y/g,""),o=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,_=void 0,g=void 0,D=void 0,y=void 0;if(n=u(n,i),t=u(t,i),o){if(o.length>1)throw new Error("Cannot use more than one escape character");o=u.escape(o),y=new RegExp("(?:"+o+"[\\S\\s]|(?:(?!"+u.union([n,t],"",{conjunction:"or"}).source+")[^"+o+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(o&&(h+=(u.exec(d,y,h,"sticky")||[""])[0].length),g=u.exec(d,n,h),D=u.exec(d,t,h),g&&D&&(g.index<=D.index?D=null:g=null),g||D)h=(m=(g||D).index)+(g||D)[0].length;else if(!p)break;if(f&&!p&&m>b)break;if(g)p||(v=m,_=h),++p;else{if(!D||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&v>b&&s.push(e(l[0],d.slice(b,v),b,v)),l[1]&&s.push(e(l[1],d.slice(v,_),v,_)),l[2]&&s.push(e(l[2],d.slice(_,m),_,m)),l[3]&&s.push(e(l[3],d.slice(m,h),m,h))):s.push(d.slice(_,m)),b=h,!c))break}m===h&&++h}return c&&!f&&l&&l[0]&&d.length>b&&s.push(e(l[0],d.slice(b),b,d.length)),s}},u.exports=e.default},498:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e={},d=u._dec,n=u._hex,t=u._pad4;function r(u){return u.replace(/[- _]+/g,"").toLowerCase()}function a(u){var e=/^\\[xu](.+)/.exec(u);return e?d(e[1]):u.charCodeAt("\\"===u[0]?1:0)}function c(d){var r,c,f;return e[d]["b!"]||(e[d]["b!"]=(r=e[d].bmp,c="",f=-1,u.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var e=a(u[1]);e>f+1&&(c+="\\u"+t(n(f+1)),e>f+2&&(c+="-\\u"+t(n(e-1)))),f=a(u[2]||u[1])})),f<65535&&(c+="\\u"+t(n(f+1)),f<65534&&(c+="-\\uFFFF")),c))}function f(u,d){var n=d?"a!":"a=";return e[u][n]||(e[u][n]=function(u,d){var n=e[u],t="";return n.bmp&&!n.isBmpLast&&(t="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(t+=n.astral),n.isBmpLast&&n.bmp&&(t+=(n.astral?"|":"")+"["+n.bmp+"]"),d?"(?:(?!"+t+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+t+")"}(u,d))}u.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(u,d,n){var t="P"===u[1]||!!u[2],a=-1!==n.indexOf("A"),i=r(u[4]||u[3]),o=e[i];if("P"===u[1]&&u[2])throw new SyntaxError("Invalid double negation "+u[0]);if(!e.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+u[0]);if(o.inverseOf){if(i=r(o.inverseOf),!e.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+u[0]+" -> "+o.inverseOf);o=e[i],t=!t}if(!o.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+u[0]);if(a){if("class"===d)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return f(i,t)}return"class"===d?t?c(i):o.bmp:(t?"[^":"[")+o.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(d){for(var n=void 0,t=0;t\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},u.exports=e.default},501:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var e=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];e.push({name:"Assigned",inverseOf:"Cn"}),u.addUnicodeData(e)},u.exports=e.default},502:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");u.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},u.exports=e.default},598:function(u,e,d){u.exports=function(){var u=[],e=[],d={},n={},t={};function r(u){return"string"==typeof u?new RegExp("^"+u+"$","i"):u}function a(u,e){return u===e?e:u===u.toLowerCase()?e.toLowerCase():u===u.toUpperCase()?e.toUpperCase():u[0]===u[0].toUpperCase()?e.charAt(0).toUpperCase()+e.substr(1).toLowerCase():e.toLowerCase()}function c(u,e){return u.replace(/\$(\d{1,2})/g,(function(u,d){return e[d]||""}))}function f(u,e){return u.replace(e[0],(function(d,n){var t=c(e[1],arguments);return a(""===d?u[n-1]:d,t)}))}function i(u,e,n){if(!u.length||d.hasOwnProperty(u))return e;for(var t=n.length;t--;){var r=n[t];if(r[0].test(e))return f(e,r)}return e}function o(u,e,d){return function(n){var t=n.toLowerCase();return e.hasOwnProperty(t)?a(n,t):u.hasOwnProperty(t)?a(n,u[t]):i(t,n,d)}}function l(u,e,d,n){return function(n){var t=n.toLowerCase();return!!e.hasOwnProperty(t)||!u.hasOwnProperty(t)&&i(t,t,d)===t}}function s(u,e,d){return(d?e+" ":"")+(1===e?s.singular(u):s.plural(u))}return s.plural=o(t,n,u),s.isPlural=l(t,n,u),s.singular=o(n,t,e),s.isSingular=l(n,t,e),s.addPluralRule=function(e,d){u.push([r(e),d])},s.addSingularRule=function(u,d){e.push([r(u),d])},s.addUncountableRule=function(u){"string"!=typeof u?(s.addPluralRule(u,"$0"),s.addSingularRule(u,"$0")):d[u.toLowerCase()]=!0},s.addIrregularRule=function(u,e){e=e.toLowerCase(),u=u.toLowerCase(),t[u]=e,n[e]=u},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(u){return s.addIrregularRule(u[0],u[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(u){return s.addPluralRule(u[0],u[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(u){return s.addSingularRule(u[0],u[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\xe9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(s.addUncountableRule),s}()}}]); \ No newline at end of file +/*! For license information please see 3116c1fa.d79d732c.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{209:function(u,e,d){"use strict";d.r(e);var n=d(1),t=(d(52),d(428),d(29),d(22),d(21),d(85),d(0)),r=d.n(t),a=d(450),c=d(445),f=(d(430),d(474)),i=d(451),o=d.n(i),l=d(455),s=d(481),p=d.n(s),m=d(598),h=d.n(m),b=Object(a.a)("h2");e.default=function(u){var e=u.tags,d=Object.values(e).map((function(u){return{count:u.count,label:u.name,permalink:u.permalink}})),t=Object(l.a)(d,"guides"),a=o.a.groupBy(t,"category");return r.a.createElement(c.a,{title:"Tags",description:"Qovery guide tags"},r.a.createElement("header",{className:"hero hero--clean"},r.a.createElement("div",{className:"container"},r.a.createElement("h1",null,"All Guide Tags"))),r.a.createElement("main",{className:"container container--xs"},Object.keys(a).map((function(u,e){var d=a[u];return r.a.createElement("section",null,r.a.createElement(b,{id:u.name},h()(p()(u))),d.map((function(u,e){return r.a.createElement("div",null,r.a.createElement(f.a,Object(n.a)({key:e,valueOnly:!0},u)))})))}))))}},423:function(u,e,d){var n;!function(){"use strict";var d={}.hasOwnProperty;function t(){for(var u=[],e=0;e1?arguments[1]:void 0)}}),d(74)("find")},445:function(u,e,d){"use strict";d(457);var n=d(0),t=d.n(n),r=d(458),a=d(444),c=d(1),f=(d(448),d(449),d(459),d(430)),i=d(460),o=d(440),l=d.n(o),s=d(461),p=d.n(s),m=d(436),h=d(423),b=d.n(h),v=d(135),_=d.n(v),g=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.moon)})},D=function(){return t.a.createElement("span",{className:b()(_.a.toggle,_.a.sun)})},y=function(u){var e=Object(m.a)().isClient;return t.a.createElement(p.a,Object(c.a)({disabled:!e,icons:{checked:t.a.createElement(g,null),unchecked:t.a.createElement(D,null)}},u))};function E(){var u=Object(m.a)().siteConfig,e=(void 0===u?{}:u).customFields.metadata.latest_post,d=Date.parse(e.date),n=new Date,t=Math.abs(n-d),r=Math.ceil(t/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&t.a.createElement("div",{className:"row footer__links"},t.a.createElement("div",{className:"col col--5 footer__col"},t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),t.a.createElement("div",{className:"margin-bottom--md"},t.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),t.a.createElement("div",null,t.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},t.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},t.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},t.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",t.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},t.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),f.map((function(u,e){return t.a.createElement("div",{key:e,className:"col footer__col"},null!=u.title?t.a.createElement("h4",{className:"footer__title"},u.title):null,null!=u.items&&Array.isArray(u.items)&&u.items.length>0?t.a.createElement("ul",{className:"footer__items"},u.items.map((function(u,e){return u.html?t.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:u.html}}):t.a.createElement("li",{key:u.href||u.to,className:"footer__item"},t.a.createElement(L,u))}))):null)}))),(o||a)&&t.a.createElement("div",{className:"text--center"},o&&o.src&&t.a.createElement("div",{className:"margin-bottom--sm"},o.href?t.a.createElement("a",{href:o.href,target:"_blank",rel:"noopener noreferrer",className:B.a.footerLogoLink},t.a.createElement(P,{alt:o.alt,url:s})):t.a.createElement(P,{alt:o.alt,url:s})),t.a.createElement("small",null,a),t.a.createElement("br",null))))},T=d(462),R=d(463),U=d(3);d(138);e.a=function(u){var e=Object(m.a)().siteConfig,d=void 0===e?{}:e,n=d.favicon,c=(d.tagline,d.title),f=d.themeConfig.image,i=d.url,o=u.children,l=u.title,s=u.noFooter,p=u.description,h=u.image,b=u.keywords,v=(u.permalink,u.version),_=l?l+" | "+c:c,g=h||f,D=i+Object(I.a)(g),y=Object(I.a)(n),E=Object(U.h)(),x=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return t.a.createElement(R.a,null,t.a.createElement(T.a,null,t.a.createElement(a.a,null,t.a.createElement("html",{lang:"en"}),t.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&t.a.createElement("title",null,_),_&&t.a.createElement("meta",{property:"og:title",content:_}),n&&t.a.createElement("link",{rel:"shortcut icon",href:y}),p&&t.a.createElement("meta",{name:"description",content:p}),p&&t.a.createElement("meta",{property:"og:description",content:p}),v&&t.a.createElement("meta",{name:"docsearch:version",content:v}),b&&b.length&&t.a.createElement("meta",{name:"keywords",content:b.join(",")}),g&&t.a.createElement("meta",{property:"og:image",content:D}),g&&t.a.createElement("meta",{property:"twitter:image",content:D}),g&&t.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),x&&t.a.createElement("meta",{property:"og:url",content:x}),t.a.createElement("meta",{name:"twitter:card",content:"summary"}),x&&t.a.createElement("link",{rel:"canonical",href:x})),t.a.createElement(r.a,null),t.a.createElement(j,null),t.a.createElement("div",{className:"main-wrapper"},o),!s&&t.a.createElement(M,null)))}},450:function(u,e,d){"use strict";var n=d(9),t=d(0),r=d.n(t),a=d(423),c=d.n(a),f=d(436),i=(d(139),d(140)),o=d.n(i);e.a=function(u){return function(e){var d,t=e.id,a=Object(n.a)(e,["id"]),i=Object(f.a)().siteConfig,l=(i=void 0===i?{}:i).themeConfig,s=(l=void 0===l?{}:l).navbar,p=(s=void 0===s?{}:s).hideOnScroll,m=void 0!==p&&p;return t?r.a.createElement(u,a,r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:c()("anchor",(d={},d[o.a.enhancedAnchor]=!m,d)),id:t}),r.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+t,title:"Direct link to heading"},"#"),a.children):r.a.createElement(u,a)}}},451:function(u,e,d){(function(u,n){var t;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],f="[object Arguments]",i="[object Array]",o="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",b="[object Number]",v="[object Object]",_="[object RegExp]",g="[object Set]",D="[object String]",y="[object Symbol]",E="[object WeakMap]",x="[object ArrayBuffer]",I="[object DataView]",w="[object Float32Array]",C="[object Float64Array]",F="[object Int8Array]",A="[object Int16Array]",k="[object Int32Array]",S="[object Uint8Array]",O="[object Uint16Array]",j="[object Uint32Array]",$=/\b__p \+= '';/g,N=/\b(__p \+=) '' \+/g,B=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,P=/[&<>"']/g,M=RegExp(L.source),T=RegExp(P.source),R=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,K=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,W=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,q=RegExp(H.source),J=/^\s+|\s+$/g,Z=/^\s+/,V=/\s+$/,Y=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Q=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,uu=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,eu=/\\(\\)?/g,du=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nu=/\w*$/,tu=/^[-+]0x[0-9a-f]+$/i,ru=/^0b[01]+$/i,au=/^\[object .+?Constructor\]$/,cu=/^0o[0-7]+$/i,fu=/^(?:0|[1-9]\d*)$/,iu=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ou=/($^)/,lu=/['\n\r\u2028\u2029\\]/g,su="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pu="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",mu="[\\ud800-\\udfff]",hu="["+pu+"]",bu="["+su+"]",vu="\\d+",_u="[\\u2700-\\u27bf]",gu="[a-z\\xdf-\\xf6\\xf8-\\xff]",Du="[^\\ud800-\\udfff"+pu+vu+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",yu="\\ud83c[\\udffb-\\udfff]",Eu="[^\\ud800-\\udfff]",xu="(?:\\ud83c[\\udde6-\\uddff]){2}",Iu="[\\ud800-\\udbff][\\udc00-\\udfff]",wu="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Cu="(?:"+gu+"|"+Du+")",Fu="(?:"+wu+"|"+Du+")",Au="(?:"+bu+"|"+yu+")"+"?",ku="[\\ufe0e\\ufe0f]?"+Au+("(?:\\u200d(?:"+[Eu,xu,Iu].join("|")+")[\\ufe0e\\ufe0f]?"+Au+")*"),Su="(?:"+[_u,xu,Iu].join("|")+")"+ku,Ou="(?:"+[Eu+bu+"?",bu,xu,Iu,mu].join("|")+")",ju=RegExp("['\u2019]","g"),$u=RegExp(bu,"g"),Nu=RegExp(yu+"(?="+yu+")|"+Ou+ku,"g"),Bu=RegExp([wu+"?"+gu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[hu,wu,"$"].join("|")+")",Fu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[hu,wu+Cu,"$"].join("|")+")",wu+"?"+Cu+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",wu+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",vu,Su].join("|"),"g"),Lu=RegExp("[\\u200d\\ud800-\\udfff"+su+"\\ufe0e\\ufe0f]"),Pu=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Mu=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Tu=-1,Ru={};Ru[w]=Ru[C]=Ru[F]=Ru[A]=Ru[k]=Ru[S]=Ru["[object Uint8ClampedArray]"]=Ru[O]=Ru[j]=!0,Ru[f]=Ru[i]=Ru[x]=Ru[o]=Ru[I]=Ru[l]=Ru[s]=Ru[p]=Ru[h]=Ru[b]=Ru[v]=Ru[_]=Ru[g]=Ru[D]=Ru[E]=!1;var Uu={};Uu[f]=Uu[i]=Uu[x]=Uu[I]=Uu[o]=Uu[l]=Uu[w]=Uu[C]=Uu[F]=Uu[A]=Uu[k]=Uu[h]=Uu[b]=Uu[v]=Uu[_]=Uu[g]=Uu[D]=Uu[y]=Uu[S]=Uu["[object Uint8ClampedArray]"]=Uu[O]=Uu[j]=!0,Uu[s]=Uu[p]=Uu[E]=!1;var zu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ku=parseFloat,Wu=parseInt,Gu="object"==typeof u&&u&&u.Object===Object&&u,Hu="object"==typeof self&&self&&self.Object===Object&&self,qu=Gu||Hu||Function("return this")(),Ju=e&&!e.nodeType&&e,Zu=Ju&&"object"==typeof n&&n&&!n.nodeType&&n,Vu=Zu&&Zu.exports===Ju,Yu=Vu&&Gu.process,Qu=function(){try{var u=Zu&&Zu.require&&Zu.require("util").types;return u||Yu&&Yu.binding&&Yu.binding("util")}catch(e){}}(),Xu=Qu&&Qu.isArrayBuffer,ue=Qu&&Qu.isDate,ee=Qu&&Qu.isMap,de=Qu&&Qu.isRegExp,ne=Qu&&Qu.isSet,te=Qu&&Qu.isTypedArray;function re(u,e,d){switch(d.length){case 0:return u.call(e);case 1:return u.call(e,d[0]);case 2:return u.call(e,d[0],d[1]);case 3:return u.call(e,d[0],d[1],d[2])}return u.apply(e,d)}function ae(u,e,d,n){for(var t=-1,r=null==u?0:u.length;++t-1}function se(u,e,d){for(var n=-1,t=null==u?0:u.length;++n-1;);return d}function Ne(u,e){for(var d=u.length;d--&&ye(e,u[d],0)>-1;);return d}function Be(u,e){for(var d=u.length,n=0;d--;)u[d]===e&&++n;return n}var Le=Ce({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Pe=Ce({"&":"&","<":"<",">":">",'"':""","'":"'"});function Me(u){return"\\"+zu[u]}function Te(u){return Lu.test(u)}function Re(u){var e=-1,d=Array(u.size);return u.forEach((function(u,n){d[++e]=[n,u]})),d}function Ue(u,e){return function(d){return u(e(d))}}function ze(u,e){for(var d=-1,n=u.length,t=0,r=[];++d",""":'"',"'":"'"});var Je=function u(e){var d,n=(e=null==e?qu:Je.defaults(qu.Object(),e,Je.pick(qu,Mu))).Array,t=e.Date,su=e.Error,pu=e.Function,mu=e.Math,hu=e.Object,bu=e.RegExp,vu=e.String,_u=e.TypeError,gu=n.prototype,Du=pu.prototype,yu=hu.prototype,Eu=e["__core-js_shared__"],xu=Du.toString,Iu=yu.hasOwnProperty,wu=0,Cu=(d=/[^.]+$/.exec(Eu&&Eu.keys&&Eu.keys.IE_PROTO||""))?"Symbol(src)_1."+d:"",Fu=yu.toString,Au=xu.call(hu),ku=qu._,Su=bu("^"+xu.call(Iu).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ou=Vu?e.Buffer:void 0,Nu=e.Symbol,Lu=e.Uint8Array,zu=Ou?Ou.allocUnsafe:void 0,Gu=Ue(hu.getPrototypeOf,hu),Hu=hu.create,Ju=yu.propertyIsEnumerable,Zu=gu.splice,Yu=Nu?Nu.isConcatSpreadable:void 0,Qu=Nu?Nu.iterator:void 0,_e=Nu?Nu.toStringTag:void 0,Ce=function(){try{var u=Xt(hu,"defineProperty");return u({},"",{}),u}catch(e){}}(),Ze=e.clearTimeout!==qu.clearTimeout&&e.clearTimeout,Ve=t&&t.now!==qu.Date.now&&t.now,Ye=e.setTimeout!==qu.setTimeout&&e.setTimeout,Qe=mu.ceil,Xe=mu.floor,ud=hu.getOwnPropertySymbols,ed=Ou?Ou.isBuffer:void 0,dd=e.isFinite,nd=gu.join,td=Ue(hu.keys,hu),rd=mu.max,ad=mu.min,cd=t.now,fd=e.parseInt,id=mu.random,od=gu.reverse,ld=Xt(e,"DataView"),sd=Xt(e,"Map"),pd=Xt(e,"Promise"),md=Xt(e,"Set"),hd=Xt(e,"WeakMap"),bd=Xt(hu,"create"),vd=hd&&new hd,_d={},gd=Cr(ld),Dd=Cr(sd),yd=Cr(pd),Ed=Cr(md),xd=Cr(hd),Id=Nu?Nu.prototype:void 0,wd=Id?Id.valueOf:void 0,Cd=Id?Id.toString:void 0;function Fd(u){if(Ka(u)&&!ja(u)&&!(u instanceof Od)){if(u instanceof Sd)return u;if(Iu.call(u,"__wrapped__"))return Fr(u)}return new Sd(u)}var Ad=function(){function u(){}return function(e){if(!za(e))return{};if(Hu)return Hu(e);u.prototype=e;var d=new u;return u.prototype=void 0,d}}();function kd(){}function Sd(u,e){this.__wrapped__=u,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Od(u){this.__wrapped__=u,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function jd(u){var e=-1,d=null==u?0:u.length;for(this.clear();++e=e?u:e)),u}function Zd(u,e,d,n,t,r){var a,c=1&e,i=2&e,s=4&e;if(d&&(a=t?d(u,n,t,r):d(u)),void 0!==a)return a;if(!za(u))return u;var E=ja(u);if(E){if(a=function(u){var e=u.length,d=new u.constructor(e);e&&"string"==typeof u[0]&&Iu.call(u,"index")&&(d.index=u.index,d.input=u.input);return d}(u),!c)return vt(u,a)}else{var $=dr(u),N=$==p||$==m;if(La(u))return lt(u,c);if($==v||$==f||N&&!t){if(a=i||N?{}:tr(u),!c)return i?function(u,e){return _t(u,er(u),e)}(u,function(u,e){return u&&_t(e,Dc(e),u)}(a,u)):function(u,e){return _t(u,ur(u),e)}(u,Gd(a,u))}else{if(!Uu[$])return t?u:{};a=function(u,e,d){var n=u.constructor;switch(e){case x:return st(u);case o:case l:return new n(+u);case I:return function(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.byteLength)}(u,d);case w:case C:case F:case A:case k:case S:case"[object Uint8ClampedArray]":case O:case j:return pt(u,d);case h:return new n;case b:case D:return new n(u);case _:return function(u){var e=new u.constructor(u.source,nu.exec(u));return e.lastIndex=u.lastIndex,e}(u);case g:return new n;case y:return t=u,wd?hu(wd.call(t)):{}}var t}(u,$,c)}}r||(r=new Ld);var B=r.get(u);if(B)return B;r.set(u,a),Ja(u)?u.forEach((function(n){a.add(Zd(n,e,d,n,u,r))})):Wa(u)&&u.forEach((function(n,t){a.set(t,Zd(n,e,d,t,u,r))}));var L=E?void 0:(s?i?Ht:Gt:i?Dc:gc)(u);return ce(L||u,(function(n,t){L&&(n=u[t=n]),zd(a,t,Zd(n,e,d,t,u,r))})),a}function Vd(u,e,d){var n=d.length;if(null==u)return!n;for(u=hu(u);n--;){var t=d[n],r=e[t],a=u[t];if(void 0===a&&!(t in u)||!r(a))return!1}return!0}function Yd(u,e,d){if("function"!=typeof u)throw new _u(r);return gr((function(){u.apply(void 0,d)}),e)}function Qd(u,e,d,n){var t=-1,r=le,a=!0,c=u.length,f=[],i=e.length;if(!c)return f;d&&(e=pe(e,Se(d))),n?(r=se,a=!1):e.length>=200&&(r=je,a=!1,e=new Bd(e));u:for(;++t-1},$d.prototype.set=function(u,e){var d=this.__data__,n=Kd(d,u);return n<0?(++this.size,d.push([u,e])):d[n][1]=e,this},Nd.prototype.clear=function(){this.size=0,this.__data__={hash:new jd,map:new(sd||$d),string:new jd}},Nd.prototype.delete=function(u){var e=Yt(this,u).delete(u);return this.size-=e?1:0,e},Nd.prototype.get=function(u){return Yt(this,u).get(u)},Nd.prototype.has=function(u){return Yt(this,u).has(u)},Nd.prototype.set=function(u,e){var d=Yt(this,u),n=d.size;return d.set(u,e),this.size+=d.size==n?0:1,this},Bd.prototype.add=Bd.prototype.push=function(u){return this.__data__.set(u,"__lodash_hash_undefined__"),this},Bd.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.clear=function(){this.__data__=new $d,this.size=0},Ld.prototype.delete=function(u){var e=this.__data__,d=e.delete(u);return this.size=e.size,d},Ld.prototype.get=function(u){return this.__data__.get(u)},Ld.prototype.has=function(u){return this.__data__.has(u)},Ld.prototype.set=function(u,e){var d=this.__data__;if(d instanceof $d){var n=d.__data__;if(!sd||n.length<199)return n.push([u,e]),this.size=++d.size,this;d=this.__data__=new Nd(n)}return d.set(u,e),this.size=d.size,this};var Xd=yt(cn),un=yt(fn,!0);function en(u,e){var d=!0;return Xd(u,(function(u,n,t){return d=!!e(u,n,t)})),d}function dn(u,e,d){for(var n=-1,t=u.length;++n0&&d(c)?e>1?tn(c,e-1,d,n,t):me(t,c):n||(t[t.length]=c)}return t}var rn=Et(),an=Et(!0);function cn(u,e){return u&&rn(u,e,gc)}function fn(u,e){return u&&an(u,e,gc)}function on(u,e){return oe(e,(function(e){return Ta(u[e])}))}function ln(u,e){for(var d=0,n=(e=ct(e,u)).length;null!=u&&de}function hn(u,e){return null!=u&&Iu.call(u,e)}function bn(u,e){return null!=u&&e in hu(u)}function vn(u,e,d){for(var t=d?se:le,r=u[0].length,a=u.length,c=a,f=n(a),i=1/0,o=[];c--;){var l=u[c];c&&e&&(l=pe(l,Se(e))),i=ad(l.length,i),f[c]=!d&&(e||r>=120&&l.length>=120)?new Bd(c&&l):void 0}l=u[0];var s=-1,p=f[0];u:for(;++s=c)return f;var i=d[n];return f*("desc"==i?-1:1)}}return u.index-e.index}(u,e,d)}))}function $n(u,e,d){for(var n=-1,t=e.length,r={};++n-1;)c!==u&&Zu.call(c,f,1),Zu.call(u,f,1);return u}function Bn(u,e){for(var d=u?e.length:0,n=d-1;d--;){var t=e[d];if(d==n||t!==r){var r=t;ar(t)?Zu.call(u,t,1):Xn(u,t)}}return u}function Ln(u,e){return u+Xe(id()*(e-u+1))}function Pn(u,e){var d="";if(!u||e<1||e>9007199254740991)return d;do{e%2&&(d+=u),(e=Xe(e/2))&&(u+=u)}while(e);return d}function Mn(u,e){return Dr(mr(u,e,Gc),u+"")}function Tn(u){return Md(Ac(u))}function Rn(u,e){var d=Ac(u);return xr(d,Jd(e,0,d.length))}function Un(u,e,d,n){if(!za(u))return u;for(var t=-1,r=(e=ct(e,u)).length,a=r-1,c=u;null!=c&&++tr?0:r+e),(d=d>r?r:d)<0&&(d+=r),r=e>d?0:d-e>>>0,e>>>=0;for(var a=n(r);++t>>1,a=u[r];null!==a&&!Va(a)&&(d?a<=e:a=200){var i=e?null:Pt(u);if(i)return Ke(i);a=!1,t=je,f=new Bd}else f=e?[]:c;u:for(;++n=n?u:Gn(u,e,d)}var ot=Ze||function(u){return qu.clearTimeout(u)};function lt(u,e){if(e)return u.slice();var d=u.length,n=zu?zu(d):new u.constructor(d);return u.copy(n),n}function st(u){var e=new u.constructor(u.byteLength);return new Lu(e).set(new Lu(u)),e}function pt(u,e){var d=e?st(u.buffer):u.buffer;return new u.constructor(d,u.byteOffset,u.length)}function mt(u,e){if(u!==e){var d=void 0!==u,n=null===u,t=u==u,r=Va(u),a=void 0!==e,c=null===e,f=e==e,i=Va(e);if(!c&&!i&&!r&&u>e||r&&a&&f&&!c&&!i||n&&a&&f||!d&&f||!t)return 1;if(!n&&!r&&!i&&u1?d[t-1]:void 0,a=t>2?d[2]:void 0;for(r=u.length>3&&"function"==typeof r?(t--,r):void 0,a&&cr(d[0],d[1],a)&&(r=t<3?void 0:r,t=1),e=hu(e);++n-1?t[r?e[a]:a]:void 0}}function Ft(u){return Wt((function(e){var d=e.length,n=d,t=Sd.prototype.thru;for(u&&e.reverse();n--;){var a=e[n];if("function"!=typeof a)throw new _u(r);if(t&&!c&&"wrapper"==Jt(a))var c=new Sd([],!0)}for(n=c?n:d;++n1&&g.reverse(),l&&i<_&&(g.length=i),this&&this!==qu&&this instanceof v&&(w=b||wt(w)),w.apply(I,g)}}function kt(u,e){return function(d,n){return function(u,e,d,n){return cn(u,(function(u,t,r){e(n,d(u),t,r)})),n}(d,u,e(n),{})}}function St(u,e){return function(d,n){var t;if(void 0===d&&void 0===n)return e;if(void 0!==d&&(t=d),void 0!==n){if(void 0===t)return n;"string"==typeof d||"string"==typeof n?(d=Yn(d),n=Yn(n)):(d=Vn(d),n=Vn(n)),t=u(d,n)}return t}}function Ot(u){return Wt((function(e){return e=pe(e,Se(Vt())),Mn((function(d){var n=this;return u(e,(function(u){return re(u,n,d)}))}))}))}function jt(u,e){var d=(e=void 0===e?" ":Yn(e)).length;if(d<2)return d?Pn(e,u):e;var n=Pn(e,Qe(u/Ge(e)));return Te(e)?it(He(n),0,u).join(""):n.slice(0,u)}function $t(u){return function(e,d,t){return t&&"number"!=typeof t&&cr(e,d,t)&&(d=t=void 0),e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d,t){for(var r=-1,a=rd(Qe((e-u)/(d||1)),0),c=n(a);a--;)c[t?a:++r]=u,u+=d;return c}(e,d,t=void 0===t?ec))return!1;var i=r.get(u);if(i&&r.get(e))return i==e;var o=-1,l=!0,s=2&d?new Bd:void 0;for(r.set(u,e),r.set(e,u);++o-1&&u%1==0&&u1?"& ":"")+e[n],e=e.join(d>2?", ":" "),u.replace(Y,"{\n/* [wrapped with "+e+"] */\n")}(n,function(u,e){return ce(c,(function(d){var n="_."+d[0];e&d[1]&&!le(u,n)&&u.push(n)})),u.sort()}(function(u){var e=u.match(Q);return e?e[1].split(X):[]}(n),d)))}function Er(u){var e=0,d=0;return function(){var n=cd(),t=16-(n-d);if(d=n,t>0){if(++e>=800)return arguments[0]}else e=0;return u.apply(void 0,arguments)}}function xr(u,e){var d=-1,n=u.length,t=n-1;for(e=void 0===e?n:e;++d1?u[e-1]:void 0;return d="function"==typeof d?(u.pop(),d):void 0,qr(u,d)}));function ua(u){var e=Fd(u);return e.__chain__=!0,e}function ea(u,e){return e(u)}var da=Wt((function(u){var e=u.length,d=e?u[0]:0,n=this.__wrapped__,t=function(e){return qd(e,u)};return!(e>1||this.__actions__.length)&&n instanceof Od&&ar(d)?((n=n.slice(d,+d+(e?1:0))).__actions__.push({func:ea,args:[t],thisArg:void 0}),new Sd(n,this.__chain__).thru((function(u){return e&&!u.length&&u.push(void 0),u}))):this.thru(t)}));var na=gt((function(u,e,d){Iu.call(u,d)?++u[d]:Hd(u,d,1)}));var ta=Ct(Or),ra=Ct(jr);function aa(u,e){return(ja(u)?ce:Xd)(u,Vt(e,3))}function ca(u,e){return(ja(u)?fe:un)(u,Vt(e,3))}var fa=gt((function(u,e,d){Iu.call(u,d)?u[d].push(e):Hd(u,d,[e])}));var ia=Mn((function(u,e,d){var t=-1,r="function"==typeof e,a=Na(u)?n(u.length):[];return Xd(u,(function(u){a[++t]=r?re(e,u,d):_n(u,e,d)})),a})),oa=gt((function(u,e,d){Hd(u,d,e)}));function la(u,e){return(ja(u)?pe:Fn)(u,Vt(e,3))}var sa=gt((function(u,e,d){u[d?0:1].push(e)}),(function(){return[[],[]]}));var pa=Mn((function(u,e){if(null==u)return[];var d=e.length;return d>1&&cr(u,e[0],e[1])?e=[]:d>2&&cr(e[0],e[1],e[2])&&(e=[e[0]]),jn(u,tn(e,1),[])})),ma=Ve||function(){return qu.Date.now()};function ha(u,e,d){return e=d?void 0:e,Tt(u,128,void 0,void 0,void 0,void 0,e=u&&null==e?u.length:e)}function ba(u,e){var d;if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){return--u>0&&(d=e.apply(this,arguments)),u<=1&&(e=void 0),d}}var va=Mn((function(u,e,d){var n=1;if(d.length){var t=ze(d,Zt(va));n|=32}return Tt(u,n,e,d,t)})),_a=Mn((function(u,e,d){var n=3;if(d.length){var t=ze(d,Zt(_a));n|=32}return Tt(e,n,u,d,t)}));function ga(u,e,d){var n,t,a,c,f,i,o=0,l=!1,s=!1,p=!0;if("function"!=typeof u)throw new _u(r);function m(e){var d=n,r=t;return n=t=void 0,o=e,c=u.apply(r,d)}function h(u){return o=u,f=gr(v,e),l?m(u):c}function b(u){var d=u-i;return void 0===i||d>=e||d<0||s&&u-o>=a}function v(){var u=ma();if(b(u))return _(u);f=gr(v,function(u){var d=e-(u-i);return s?ad(d,a-(u-o)):d}(u))}function _(u){return f=void 0,p&&n?m(u):(n=t=void 0,c)}function g(){var u=ma(),d=b(u);if(n=arguments,t=this,i=u,d){if(void 0===f)return h(i);if(s)return ot(f),f=gr(v,e),m(i)}return void 0===f&&(f=gr(v,e)),c}return e=tc(e)||0,za(d)&&(l=!!d.leading,a=(s="maxWait"in d)?rd(tc(d.maxWait)||0,e):a,p="trailing"in d?!!d.trailing:p),g.cancel=function(){void 0!==f&&ot(f),o=0,n=i=t=f=void 0},g.flush=function(){return void 0===f?c:_(ma())},g}var Da=Mn((function(u,e){return Yd(u,1,e)})),ya=Mn((function(u,e,d){return Yd(u,tc(e)||0,d)}));function Ea(u,e){if("function"!=typeof u||null!=e&&"function"!=typeof e)throw new _u(r);var d=function(){var n=arguments,t=e?e.apply(this,n):n[0],r=d.cache;if(r.has(t))return r.get(t);var a=u.apply(this,n);return d.cache=r.set(t,a)||r,a};return d.cache=new(Ea.Cache||Nd),d}function xa(u){if("function"!=typeof u)throw new _u(r);return function(){var e=arguments;switch(e.length){case 0:return!u.call(this);case 1:return!u.call(this,e[0]);case 2:return!u.call(this,e[0],e[1]);case 3:return!u.call(this,e[0],e[1],e[2])}return!u.apply(this,e)}}Ea.Cache=Nd;var Ia=ft((function(u,e){var d=(e=1==e.length&&ja(e[0])?pe(e[0],Se(Vt())):pe(tn(e,1),Se(Vt()))).length;return Mn((function(n){for(var t=-1,r=ad(n.length,d);++t=e})),Oa=gn(function(){return arguments}())?gn:function(u){return Ka(u)&&Iu.call(u,"callee")&&!Ju.call(u,"callee")},ja=n.isArray,$a=Xu?Se(Xu):function(u){return Ka(u)&&pn(u)==x};function Na(u){return null!=u&&Ua(u.length)&&!Ta(u)}function Ba(u){return Ka(u)&&Na(u)}var La=ed||tf,Pa=ue?Se(ue):function(u){return Ka(u)&&pn(u)==l};function Ma(u){if(!Ka(u))return!1;var e=pn(u);return e==s||"[object DOMException]"==e||"string"==typeof u.message&&"string"==typeof u.name&&!Ha(u)}function Ta(u){if(!za(u))return!1;var e=pn(u);return e==p||e==m||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Ra(u){return"number"==typeof u&&u==dc(u)}function Ua(u){return"number"==typeof u&&u>-1&&u%1==0&&u<=9007199254740991}function za(u){var e=typeof u;return null!=u&&("object"==e||"function"==e)}function Ka(u){return null!=u&&"object"==typeof u}var Wa=ee?Se(ee):function(u){return Ka(u)&&dr(u)==h};function Ga(u){return"number"==typeof u||Ka(u)&&pn(u)==b}function Ha(u){if(!Ka(u)||pn(u)!=v)return!1;var e=Gu(u);if(null===e)return!0;var d=Iu.call(e,"constructor")&&e.constructor;return"function"==typeof d&&d instanceof d&&xu.call(d)==Au}var qa=de?Se(de):function(u){return Ka(u)&&pn(u)==_};var Ja=ne?Se(ne):function(u){return Ka(u)&&dr(u)==g};function Za(u){return"string"==typeof u||!ja(u)&&Ka(u)&&pn(u)==D}function Va(u){return"symbol"==typeof u||Ka(u)&&pn(u)==y}var Ya=te?Se(te):function(u){return Ka(u)&&Ua(u.length)&&!!Ru[pn(u)]};var Qa=Nt(Cn),Xa=Nt((function(u,e){return u<=e}));function uc(u){if(!u)return[];if(Na(u))return Za(u)?He(u):vt(u);if(Qu&&u[Qu])return function(u){for(var e,d=[];!(e=u.next()).done;)d.push(e.value);return d}(u[Qu]());var e=dr(u);return(e==h?Re:e==g?Ke:Ac)(u)}function ec(u){return u?(u=tc(u))===1/0||u===-1/0?17976931348623157e292*(u<0?-1:1):u==u?u:0:0===u?u:0}function dc(u){var e=ec(u),d=e%1;return e==e?d?e-d:e:0}function nc(u){return u?Jd(dc(u),0,4294967295):0}function tc(u){if("number"==typeof u)return u;if(Va(u))return NaN;if(za(u)){var e="function"==typeof u.valueOf?u.valueOf():u;u=za(e)?e+"":e}if("string"!=typeof u)return 0===u?u:+u;u=u.replace(J,"");var d=ru.test(u);return d||cu.test(u)?Wu(u.slice(2),d?2:8):tu.test(u)?NaN:+u}function rc(u){return _t(u,Dc(u))}function ac(u){return null==u?"":Yn(u)}var cc=Dt((function(u,e){if(lr(e)||Na(e))_t(e,gc(e),u);else for(var d in e)Iu.call(e,d)&&zd(u,d,e[d])})),fc=Dt((function(u,e){_t(e,Dc(e),u)})),ic=Dt((function(u,e,d,n){_t(e,Dc(e),u,n)})),oc=Dt((function(u,e,d,n){_t(e,gc(e),u,n)})),lc=Wt(qd);var sc=Mn((function(u,e){u=hu(u);var d=-1,n=e.length,t=n>2?e[2]:void 0;for(t&&cr(e[0],e[1],t)&&(n=1);++d1),e})),_t(u,Ht(u),d),n&&(d=Zd(d,7,zt));for(var t=e.length;t--;)Xn(d,e[t]);return d}));var Ic=Wt((function(u,e){return null==u?{}:function(u,e){return $n(u,e,(function(e,d){return hc(u,d)}))}(u,e)}));function wc(u,e){if(null==u)return{};var d=pe(Ht(u),(function(u){return[u]}));return e=Vt(e),$n(u,d,(function(u,d){return e(u,d[0])}))}var Cc=Mt(gc),Fc=Mt(Dc);function Ac(u){return null==u?[]:Oe(u,gc(u))}var kc=It((function(u,e,d){return e=e.toLowerCase(),u+(d?Sc(e):e)}));function Sc(u){return Mc(ac(u).toLowerCase())}function Oc(u){return(u=ac(u))&&u.replace(iu,Le).replace($u,"")}var jc=It((function(u,e,d){return u+(d?"-":"")+e.toLowerCase()})),$c=It((function(u,e,d){return u+(d?" ":"")+e.toLowerCase()})),Nc=xt("toLowerCase");var Bc=It((function(u,e,d){return u+(d?"_":"")+e.toLowerCase()}));var Lc=It((function(u,e,d){return u+(d?" ":"")+Mc(e)}));var Pc=It((function(u,e,d){return u+(d?" ":"")+e.toUpperCase()})),Mc=xt("toUpperCase");function Tc(u,e,d){return u=ac(u),void 0===(e=d?void 0:e)?function(u){return Pu.test(u)}(u)?function(u){return u.match(Bu)||[]}(u):function(u){return u.match(uu)||[]}(u):u.match(e)||[]}var Rc=Mn((function(u,e){try{return re(u,void 0,e)}catch(d){return Ma(d)?d:new su(d)}})),Uc=Wt((function(u,e){return ce(e,(function(e){e=wr(e),Hd(u,e,va(u[e],u))})),u}));function zc(u){return function(){return u}}var Kc=Ft(),Wc=Ft(!0);function Gc(u){return u}function Hc(u){return xn("function"==typeof u?u:Zd(u,1))}var qc=Mn((function(u,e){return function(d){return _n(d,u,e)}})),Jc=Mn((function(u,e){return function(d){return _n(u,d,e)}}));function Zc(u,e,d){var n=gc(e),t=on(e,n);null!=d||za(e)&&(t.length||!n.length)||(d=e,e=u,u=this,t=on(e,gc(e)));var r=!(za(d)&&"chain"in d&&!d.chain),a=Ta(u);return ce(t,(function(d){var n=e[d];u[d]=n,a&&(u.prototype[d]=function(){var e=this.__chain__;if(r||e){var d=u(this.__wrapped__),t=d.__actions__=vt(this.__actions__);return t.push({func:n,args:arguments,thisArg:u}),d.__chain__=e,d}return n.apply(u,me([this.value()],arguments))})})),u}function Vc(){}var Yc=Ot(pe),Qc=Ot(ie),Xc=Ot(ve);function uf(u){return fr(u)?we(wr(u)):function(u){return function(e){return ln(e,u)}}(u)}var ef=$t(),df=$t(!0);function nf(){return[]}function tf(){return!1}var rf=St((function(u,e){return u+e}),0),af=Lt("ceil"),cf=St((function(u,e){return u/e}),1),ff=Lt("floor");var of,lf=St((function(u,e){return u*e}),1),sf=Lt("round"),pf=St((function(u,e){return u-e}),0);return Fd.after=function(u,e){if("function"!=typeof e)throw new _u(r);return u=dc(u),function(){if(--u<1)return e.apply(this,arguments)}},Fd.ary=ha,Fd.assign=cc,Fd.assignIn=fc,Fd.assignInWith=ic,Fd.assignWith=oc,Fd.at=lc,Fd.before=ba,Fd.bind=va,Fd.bindAll=Uc,Fd.bindKey=_a,Fd.castArray=function(){if(!arguments.length)return[];var u=arguments[0];return ja(u)?u:[u]},Fd.chain=ua,Fd.chunk=function(u,e,d){e=(d?cr(u,e,d):void 0===e)?1:rd(dc(e),0);var t=null==u?0:u.length;if(!t||e<1)return[];for(var r=0,a=0,c=n(Qe(t/e));rt?0:t+d),(n=void 0===n||n>t?t:dc(n))<0&&(n+=t),n=d>n?0:nc(n);d>>0)?(u=ac(u))&&("string"==typeof e||null!=e&&!qa(e))&&!(e=Yn(e))&&Te(u)?it(He(u),0,d):u.split(e,d):[]},Fd.spread=function(u,e){if("function"!=typeof u)throw new _u(r);return e=null==e?0:rd(dc(e),0),Mn((function(d){var n=d[e],t=it(d,0,e);return n&&me(t,n),re(u,this,t)}))},Fd.tail=function(u){var e=null==u?0:u.length;return e?Gn(u,1,e):[]},Fd.take=function(u,e,d){return u&&u.length?Gn(u,0,(e=d||void 0===e?1:dc(e))<0?0:e):[]},Fd.takeRight=function(u,e,d){var n=null==u?0:u.length;return n?Gn(u,(e=n-(e=d||void 0===e?1:dc(e)))<0?0:e,n):[]},Fd.takeRightWhile=function(u,e){return u&&u.length?et(u,Vt(e,3),!1,!0):[]},Fd.takeWhile=function(u,e){return u&&u.length?et(u,Vt(e,3)):[]},Fd.tap=function(u,e){return e(u),u},Fd.throttle=function(u,e,d){var n=!0,t=!0;if("function"!=typeof u)throw new _u(r);return za(d)&&(n="leading"in d?!!d.leading:n,t="trailing"in d?!!d.trailing:t),ga(u,e,{leading:n,maxWait:e,trailing:t})},Fd.thru=ea,Fd.toArray=uc,Fd.toPairs=Cc,Fd.toPairsIn=Fc,Fd.toPath=function(u){return ja(u)?pe(u,wr):Va(u)?[u]:vt(Ir(ac(u)))},Fd.toPlainObject=rc,Fd.transform=function(u,e,d){var n=ja(u),t=n||La(u)||Ya(u);if(e=Vt(e,4),null==d){var r=u&&u.constructor;d=t?n?new r:[]:za(u)&&Ta(r)?Ad(Gu(u)):{}}return(t?ce:cn)(u,(function(u,n,t){return e(d,u,n,t)})),d},Fd.unary=function(u){return ha(u,1)},Fd.union=Kr,Fd.unionBy=Wr,Fd.unionWith=Gr,Fd.uniq=function(u){return u&&u.length?Qn(u):[]},Fd.uniqBy=function(u,e){return u&&u.length?Qn(u,Vt(e,2)):[]},Fd.uniqWith=function(u,e){return e="function"==typeof e?e:void 0,u&&u.length?Qn(u,void 0,e):[]},Fd.unset=function(u,e){return null==u||Xn(u,e)},Fd.unzip=Hr,Fd.unzipWith=qr,Fd.update=function(u,e,d){return null==u?u:ut(u,e,at(d))},Fd.updateWith=function(u,e,d,n){return n="function"==typeof n?n:void 0,null==u?u:ut(u,e,at(d),n)},Fd.values=Ac,Fd.valuesIn=function(u){return null==u?[]:Oe(u,Dc(u))},Fd.without=Jr,Fd.words=Tc,Fd.wrap=function(u,e){return wa(at(e),u)},Fd.xor=Zr,Fd.xorBy=Vr,Fd.xorWith=Yr,Fd.zip=Qr,Fd.zipObject=function(u,e){return tt(u||[],e||[],zd)},Fd.zipObjectDeep=function(u,e){return tt(u||[],e||[],Un)},Fd.zipWith=Xr,Fd.entries=Cc,Fd.entriesIn=Fc,Fd.extend=fc,Fd.extendWith=ic,Zc(Fd,Fd),Fd.add=rf,Fd.attempt=Rc,Fd.camelCase=kc,Fd.capitalize=Sc,Fd.ceil=af,Fd.clamp=function(u,e,d){return void 0===d&&(d=e,e=void 0),void 0!==d&&(d=(d=tc(d))==d?d:0),void 0!==e&&(e=(e=tc(e))==e?e:0),Jd(tc(u),e,d)},Fd.clone=function(u){return Zd(u,4)},Fd.cloneDeep=function(u){return Zd(u,5)},Fd.cloneDeepWith=function(u,e){return Zd(u,5,e="function"==typeof e?e:void 0)},Fd.cloneWith=function(u,e){return Zd(u,4,e="function"==typeof e?e:void 0)},Fd.conformsTo=function(u,e){return null==e||Vd(u,e,gc(e))},Fd.deburr=Oc,Fd.defaultTo=function(u,e){return null==u||u!=u?e:u},Fd.divide=cf,Fd.endsWith=function(u,e,d){u=ac(u),e=Yn(e);var n=u.length,t=d=void 0===d?n:Jd(dc(d),0,n);return(d-=e.length)>=0&&u.slice(d,t)==e},Fd.eq=Aa,Fd.escape=function(u){return(u=ac(u))&&T.test(u)?u.replace(P,Pe):u},Fd.escapeRegExp=function(u){return(u=ac(u))&&q.test(u)?u.replace(H,"\\$&"):u},Fd.every=function(u,e,d){var n=ja(u)?ie:en;return d&&cr(u,e,d)&&(e=void 0),n(u,Vt(e,3))},Fd.find=ta,Fd.findIndex=Or,Fd.findKey=function(u,e){return ge(u,Vt(e,3),cn)},Fd.findLast=ra,Fd.findLastIndex=jr,Fd.findLastKey=function(u,e){return ge(u,Vt(e,3),fn)},Fd.floor=ff,Fd.forEach=aa,Fd.forEachRight=ca,Fd.forIn=function(u,e){return null==u?u:rn(u,Vt(e,3),Dc)},Fd.forInRight=function(u,e){return null==u?u:an(u,Vt(e,3),Dc)},Fd.forOwn=function(u,e){return u&&cn(u,Vt(e,3))},Fd.forOwnRight=function(u,e){return u&&fn(u,Vt(e,3))},Fd.get=mc,Fd.gt=ka,Fd.gte=Sa,Fd.has=function(u,e){return null!=u&&nr(u,e,hn)},Fd.hasIn=hc,Fd.head=Nr,Fd.identity=Gc,Fd.includes=function(u,e,d,n){u=Na(u)?u:Ac(u),d=d&&!n?dc(d):0;var t=u.length;return d<0&&(d=rd(t+d,0)),Za(u)?d<=t&&u.indexOf(e,d)>-1:!!t&&ye(u,e,d)>-1},Fd.indexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=null==d?0:dc(d);return t<0&&(t=rd(n+t,0)),ye(u,e,t)},Fd.inRange=function(u,e,d){return e=ec(e),void 0===d?(d=e,e=0):d=ec(d),function(u,e,d){return u>=ad(e,d)&&u=-9007199254740991&&u<=9007199254740991},Fd.isSet=Ja,Fd.isString=Za,Fd.isSymbol=Va,Fd.isTypedArray=Ya,Fd.isUndefined=function(u){return void 0===u},Fd.isWeakMap=function(u){return Ka(u)&&dr(u)==E},Fd.isWeakSet=function(u){return Ka(u)&&"[object WeakSet]"==pn(u)},Fd.join=function(u,e){return null==u?"":nd.call(u,e)},Fd.kebabCase=jc,Fd.last=Mr,Fd.lastIndexOf=function(u,e,d){var n=null==u?0:u.length;if(!n)return-1;var t=n;return void 0!==d&&(t=(t=dc(d))<0?rd(n+t,0):ad(t,n-1)),e==e?function(u,e,d){for(var n=d+1;n--;)if(u[n]===e)return n;return n}(u,e,t):De(u,xe,t,!0)},Fd.lowerCase=$c,Fd.lowerFirst=Nc,Fd.lt=Qa,Fd.lte=Xa,Fd.max=function(u){return u&&u.length?dn(u,Gc,mn):void 0},Fd.maxBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),mn):void 0},Fd.mean=function(u){return Ie(u,Gc)},Fd.meanBy=function(u,e){return Ie(u,Vt(e,2))},Fd.min=function(u){return u&&u.length?dn(u,Gc,Cn):void 0},Fd.minBy=function(u,e){return u&&u.length?dn(u,Vt(e,2),Cn):void 0},Fd.stubArray=nf,Fd.stubFalse=tf,Fd.stubObject=function(){return{}},Fd.stubString=function(){return""},Fd.stubTrue=function(){return!0},Fd.multiply=lf,Fd.nth=function(u,e){return u&&u.length?On(u,dc(e)):void 0},Fd.noConflict=function(){return qu._===this&&(qu._=ku),this},Fd.noop=Vc,Fd.now=ma,Fd.pad=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;if(!e||n>=e)return u;var t=(e-n)/2;return jt(Xe(t),d)+u+jt(Qe(t),d)},Fd.padEnd=function(u,e,d){u=ac(u);var n=(e=dc(e))?Ge(u):0;return e&&ne){var n=u;u=e,e=n}if(d||u%1||e%1){var t=id();return ad(u+t*(e-u+Ku("1e-"+((t+"").length-1))),e)}return Ln(u,e)},Fd.reduce=function(u,e,d){var n=ja(u)?he:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,Xd)},Fd.reduceRight=function(u,e,d){var n=ja(u)?be:Fe,t=arguments.length<3;return n(u,Vt(e,4),d,t,un)},Fd.repeat=function(u,e,d){return e=(d?cr(u,e,d):void 0===e)?1:dc(e),Pn(ac(u),e)},Fd.replace=function(){var u=arguments,e=ac(u[0]);return u.length<3?e:e.replace(u[1],u[2])},Fd.result=function(u,e,d){var n=-1,t=(e=ct(e,u)).length;for(t||(t=1,u=void 0);++n9007199254740991)return[];var d=4294967295,n=ad(u,4294967295);u-=4294967295;for(var t=ke(n,e=Vt(e));++d=r)return u;var c=d-Ge(n);if(c<1)return n;var f=a?it(a,0,c).join(""):u.slice(0,c);if(void 0===t)return f+n;if(a&&(c+=f.length-c),qa(t)){if(u.slice(c).search(t)){var i,o=f;for(t.global||(t=bu(t.source,ac(nu.exec(t))+"g")),t.lastIndex=0;i=t.exec(o);)var l=i.index;f=f.slice(0,void 0===l?c:l)}}else if(u.indexOf(Yn(t),c)!=c){var s=f.lastIndexOf(t);s>-1&&(f=f.slice(0,s))}return f+n},Fd.unescape=function(u){return(u=ac(u))&&M.test(u)?u.replace(L,qe):u},Fd.uniqueId=function(u){var e=++wu;return ac(u)+e},Fd.upperCase=Pc,Fd.upperFirst=Mc,Fd.each=aa,Fd.eachRight=ca,Fd.first=Nr,Zc(Fd,(of={},cn(Fd,(function(u,e){Iu.call(Fd.prototype,e)||(of[e]=u)})),of),{chain:!1}),Fd.VERSION="4.17.15",ce(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(u){Fd[u].placeholder=Fd})),ce(["drop","take"],(function(u,e){Od.prototype[u]=function(d){d=void 0===d?1:rd(dc(d),0);var n=this.__filtered__&&!e?new Od(this):this.clone();return n.__filtered__?n.__takeCount__=ad(d,n.__takeCount__):n.__views__.push({size:ad(d,4294967295),type:u+(n.__dir__<0?"Right":"")}),n},Od.prototype[u+"Right"]=function(e){return this.reverse()[u](e).reverse()}})),ce(["filter","map","takeWhile"],(function(u,e){var d=e+1,n=1==d||3==d;Od.prototype[u]=function(u){var e=this.clone();return e.__iteratees__.push({iteratee:Vt(u,3),type:d}),e.__filtered__=e.__filtered__||n,e}})),ce(["head","last"],(function(u,e){var d="take"+(e?"Right":"");Od.prototype[u]=function(){return this[d](1).value()[0]}})),ce(["initial","tail"],(function(u,e){var d="drop"+(e?"":"Right");Od.prototype[u]=function(){return this.__filtered__?new Od(this):this[d](1)}})),Od.prototype.compact=function(){return this.filter(Gc)},Od.prototype.find=function(u){return this.filter(u).head()},Od.prototype.findLast=function(u){return this.reverse().find(u)},Od.prototype.invokeMap=Mn((function(u,e){return"function"==typeof u?new Od(this):this.map((function(d){return _n(d,u,e)}))})),Od.prototype.reject=function(u){return this.filter(xa(Vt(u)))},Od.prototype.slice=function(u,e){u=dc(u);var d=this;return d.__filtered__&&(u>0||e<0)?new Od(d):(u<0?d=d.takeRight(-u):u&&(d=d.drop(u)),void 0!==e&&(d=(e=dc(e))<0?d.dropRight(-e):d.take(e-u)),d)},Od.prototype.takeRightWhile=function(u){return this.reverse().takeWhile(u).reverse()},Od.prototype.toArray=function(){return this.take(4294967295)},cn(Od.prototype,(function(u,e){var d=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),t=Fd[n?"take"+("last"==e?"Right":""):e],r=n||/^find/.test(e);t&&(Fd.prototype[e]=function(){var e=this.__wrapped__,a=n?[1]:arguments,c=e instanceof Od,f=a[0],i=c||ja(e),o=function(u){var e=t.apply(Fd,me([u],a));return n&&l?e[0]:e};i&&d&&"function"==typeof f&&1!=f.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){e=m?e:new Od(this);var h=u.apply(e,a);return h.__actions__.push({func:ea,args:[o],thisArg:void 0}),new Sd(h,l)}return p&&m?u.apply(this,a):(h=this.thru(o),p?n?h.value()[0]:h.value():h)})})),ce(["pop","push","shift","sort","splice","unshift"],(function(u){var e=gu[u],d=/^(?:push|sort|unshift)$/.test(u)?"tap":"thru",n=/^(?:pop|shift)$/.test(u);Fd.prototype[u]=function(){var u=arguments;if(n&&!this.__chain__){var t=this.value();return e.apply(ja(t)?t:[],u)}return this[d]((function(d){return e.apply(ja(d)?d:[],u)}))}})),cn(Od.prototype,(function(u,e){var d=Fd[e];if(d){var n=d.name+"";Iu.call(_d,n)||(_d[n]=[]),_d[n].push({name:e,func:d})}})),_d[At(void 0,2).name]=[{name:"wrapper",func:void 0}],Od.prototype.clone=function(){var u=new Od(this.__wrapped__);return u.__actions__=vt(this.__actions__),u.__dir__=this.__dir__,u.__filtered__=this.__filtered__,u.__iteratees__=vt(this.__iteratees__),u.__takeCount__=this.__takeCount__,u.__views__=vt(this.__views__),u},Od.prototype.reverse=function(){if(this.__filtered__){var u=new Od(this);u.__dir__=-1,u.__filtered__=!0}else(u=this.clone()).__dir__*=-1;return u},Od.prototype.value=function(){var u=this.__wrapped__.value(),e=this.__dir__,d=ja(u),n=e<0,t=d?u.length:0,r=function(u,e,d){var n=-1,t=d.length;for(;++n=this.__values__.length;return{done:u,value:u?void 0:this.__values__[this.__index__++]}},Fd.prototype.plant=function(u){for(var e,d=this;d instanceof kd;){var n=Fr(d);n.__index__=0,n.__values__=void 0,e?t.__wrapped__=n:e=n;var t=n;d=d.__wrapped__}return t.__wrapped__=u,e},Fd.prototype.reverse=function(){var u=this.__wrapped__;if(u instanceof Od){var e=u;return this.__actions__.length&&(e=new Od(this)),(e=e.reverse()).__actions__.push({func:ea,args:[zr],thisArg:void 0}),new Sd(e,this.__chain__)}return this.thru(zr)},Fd.prototype.toJSON=Fd.prototype.valueOf=Fd.prototype.value=function(){return dt(this.__wrapped__,this.__actions__)},Fd.prototype.first=Fd.prototype.head,Qu&&(Fd.prototype[Qu]=function(){return this}),Fd}();qu._=Je,void 0===(t=function(){return Je}.call(e,d,e,n))||(n.exports=t)}).call(this)}).call(this,d(76),d(456)(u))},454:function(u,e,d){"use strict";var n=d(0),t=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=t},455:function(u,e,d){"use strict";d.d(e,"a",(function(){return r}));d(77),d(473),d(439),d(78);var n=d(475),t=d.n(n);function r(u,e){var d=new t.a;return u.map((function(u){var n=u;return"string"==typeof u&&(n={label:u,permalink:"/blog/tags/"+d.slug(u)}),function(u,e){var d=u.label.split(": ",2),n=d[0],t=d[1],r="primary";switch(e){case"blog":case"guides":r=function(u){switch(u){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:u.count,label:u.label,permalink:u.permalink,style:r,value:t}}(n,e)}))}},456:function(u,e){u.exports=function(u){return u.webpackPolyfill||(u.deprecate=function(){},u.paths=[],u.children||(u.children=[]),Object.defineProperty(u,"loaded",{enumerable:!0,get:function(){return u.l}}),Object.defineProperty(u,"id",{enumerable:!0,get:function(){return u.i}}),u.webpackPolyfill=1),u}},465:function(u,e,d){var n=d(30),t=d(54),r=d(27),a=d(26),c=d(466);u.exports=function(u,e){var d=1==u,f=2==u,i=3==u,o=4==u,l=6==u,s=5==u||l,p=e||c;return function(e,c,m){for(var h,b,v=r(e),_=t(v),g=n(c,m,3),D=a(_.length),y=0,E=d?p(e,D):f?p(e,0):void 0;D>y;y++)if((s||y in _)&&(b=g(h=_[y],y,v),u))if(d)E[y]=b;else if(b)switch(u){case 3:return!0;case 5:return h;case 6:return y;case 2:E.push(h)}else if(o)return!1;return l?-1:i||o?o:E}}},466:function(u,e,d){var n=d(467);u.exports=function(u,e){return new(n(u))(e)}},467:function(u,e,d){var n=d(13),t=d(468),r=d(2)("species");u.exports=function(u){var e;return t(u)&&("function"!=typeof(e=u.constructor)||e!==Array&&!t(e.prototype)||(e=void 0),n(e)&&null===(e=e[r])&&(e=void 0)),void 0===e?Array:e}},468:function(u,e,d){var n=d(23);u.exports=Array.isArray||function(u){return"Array"==n(u)}},474:function(u,e,d){"use strict";var n=d(0),t=d.n(n),r=d(430),a=d(423),c=d.n(a);e.a=function(u){var e=u.count,d=u.label,n=u.permalink,a=u.style,f=u.value,i=u.valueOnly;return t.a.createElement(r.a,{to:n+"/",className:c()("badge","badge--rounded","badge--"+a)},i?f:d,e&&t.a.createElement(t.a.Fragment,null," (",e,")"))}},475:function(u,e,d){var n=d(476);u.exports=c;var t=Object.hasOwnProperty,r=/\s/g,a=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function c(){if(!(this instanceof c))return new c;this.reset()}function f(u,e){return"string"!=typeof u?"":(e||(u=u.toLowerCase()),u.trim().replace(a,"").replace(n(),"").replace(r,"-"))}c.prototype.slug=function(u,e){for(var d=f(u,!0===e),n=d;t.call(this.occurrences,d);)this.occurrences[n]++,d=n+"-"+this.occurrences[n];return this.occurrences[d]=0,d},c.prototype.reset=function(){this.occurrences=Object.create(null)},c.slug=f},476:function(u,e){u.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},481:function(u,e,d){"use strict";const n=d(493),t=u=>{if("string"!=typeof u)throw new TypeError("Expected a string");return u=(u=(u=n(u)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+u.slice(1)};u.exports=t,u.exports.default=t},493:function(u,e,d){"use strict";const n=d(494);u.exports=(u,e)=>{if("string"!=typeof u)throw new TypeError("Expected a string");e=void 0===e?"_":e;const d=n("([\\p{Ll}\\d])(\\p{Lu})","g"),t=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return u.replace(d,`$1${e}$2`).replace(t,`$1${e}$2`).toLowerCase()}},494:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=l(d(495)),t=l(d(496)),r=l(d(497)),a=l(d(498)),c=l(d(499)),f=l(d(500)),i=l(d(501)),o=l(d(502));function l(u){return u&&u.__esModule?u:{default:u}}(0,t.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,f.default)(n.default),(0,i.default)(n.default),(0,o.default)(n.default),e.default=n.default,u.exports=e.default},495:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={astral:!1},t={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},f=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},o=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===t.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(u){var e=!0;try{new RegExp("",u)}catch(d){e=!1}return e}var h=m("u"),b=m("y"),v={g:!0,i:!0,m:!0,u:h,y:b};function _(u,e,d,n,t){var r=void 0;if(u.xregexp={captureNames:e},t)return u;if(u.__proto__)u.__proto__=O.prototype;else for(r in O.prototype)u[r]=O.prototype[r];return u.xregexp.source=d,u.xregexp.flags=n?n.split("").sort().join(""):n,u}function g(u){return t.replace.call(u,/([\s\S])(?=[\s\S]*\1)/g,"")}function D(u,e){if(!O.isRegExp(u))throw new TypeError("Type RegExp expected");var d=u.xregexp||{},n=function(u){return s?u.flags:t.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(u))[1]}(u),r="",a="",c=null,f=null;return(e=e||{}).removeG&&(a+="g"),e.removeY&&(a+="y"),a&&(n=t.replace.call(n,new RegExp("["+a+"]+","g"),"")),e.addG&&(r+="g"),e.addY&&(r+="y"),r&&(n=g(n+r)),e.isInternalOnly||(void 0!==d.source&&(c=d.source),null!=d.flags&&(f=r?g(d.flags+r):d.flags)),u=_(new RegExp(e.source||u.source,n),function(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?d.captureNames.slice(0):null,c,f,e.isInternalOnly)}function y(u){return parseInt(u,16)}function E(u,e,d){return"("===u.input[u.index-1]||")"===u.input[u.index+u[0].length]||function(u,e,d){return t.test.call(-1!==d.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,u.slice(e))}(u.input,u.index+u[0].length,d)?"":"(?:)"}function x(u){return parseInt(u,10).toString(16)}function I(u,e){return p.call(u)==="[object "+e+"]"}function w(u){for(;u.length<4;)u="0"+u;return u}function C(u){var e={};return I(u,"String")?(O.forEach(u,/[^\s,]+/,(function(u){e[u]=!0})),e):u}function F(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");v[u]=!0}function A(u,e,d,n,t){for(var r=f.length,a=u[d],c=null,i=void 0,o=void 0;r--;)if(!((o=f[r]).leadChar&&o.leadChar!==a||o.scope!==n&&"all"!==o.scope||o.flag&&-1===e.indexOf(o.flag))&&(i=O.exec(u,o.regex,d,"sticky"))){c={matchLength:i[0].length,output:o.handler.call(t,i,n,e),reparse:o.reparse};break}return c}function k(u){n.astral=u}function S(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function O(u,e){if(O.isRegExp(u)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return D(u)}if(u=void 0===u?"":String(u),e=void 0===e?"":String(e),O.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A"),c[u]||(c[u]={}),!c[u][e]){for(var d={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,f=void 0,o=function(u,e){var d=void 0;if(g(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);for(u=t.replace.call(u,/^\(\?([\w$]+)\)/,(function(u,d){if(t.test.call(/[gy]/,d))throw new SyntaxError("Cannot use flag g or y in mode modifier "+u);return e=g(e+d),""})),d=0;d"}else if(d)return"\\"+(+d+a);return u}if(!I(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,o=[],l=void 0,s=0;s1&&-1!==d.indexOf("")){var n=D(this,{removeG:!0,isInternalOnly:!0});t.replace.call(String(u).slice(d.index),n,(function(){for(var u=arguments.length,e=Array(u),n=0;nd.index&&(this.lastIndex=d.index)}return this.global||(this.lastIndex=e),d},r.test=function(u){return!!r.exec.call(this,u)},r.match=function(u){if(O.isRegExp(u)){if(u.global){var e=t.match.apply(this,arguments);return u.lastIndex=0,e}}else u=new RegExp(u);return r.exec.call(u,S(this))},r.replace=function(u,e){var d=O.isRegExp(u),n=void 0,r=void 0,a=void 0;return d?(u.xregexp&&(r=u.xregexp.captureNames),n=u.lastIndex):u+="",a=I(e,"Function")?t.replace.call(String(this),u,(function(){for(var n=arguments.length,t=Array(n),a=0;ad.length-3)throw new SyntaxError("Backreference to undefined group "+u);return d[t]||""}throw new SyntaxError("Invalid token "+u)}})),d&&(u.global?u.lastIndex=0:u.lastIndex=n),a},r.split=function(u,e){if(!O.isRegExp(u))return t.split.apply(this,arguments);var d=String(this),n=[],r=u.lastIndex,a=0,c=void 0;return e=(void 0===e?-1:e)>>>0,O.forEach(d,u,(function(u){u.index+u[0].length>a&&(n.push(d.slice(a,u.index)),u.length>1&&u.indexe?n.slice(0,e):n},O.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,e){if("B"===u[1]&&"default"===e)return u[0];throw new SyntaxError("Invalid escape "+u[0])}),{scope:"all",leadChar:"\\"}),O.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,e,d){var n=y(u[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+u[0]);if(n<=65535)return"\\u"+w(x(n));if(h&&-1!==d.indexOf("u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),O.addToken(/\[(\^?)\]/,(function(u){return u[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),O.addToken(/\(\?#[^)]*\)/,E,{leadChar:"("}),O.addToken(/\s+|#[^\n]*\n?/,E,{flag:"x"}),O.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),O.addToken(/\\k<([\w$]+)>/,(function(u){var e=isNaN(u[1])?this.captureNames.indexOf(u[1])+1:+u[1],d=u.index+u[0].length;if(!e||e>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+u[0]);return"\\"+e+(d===u.input.length||isNaN(u.input[d])?"":"(?:)")}),{leadChar:"\\"}),O.addToken(/\\(\d+)/,(function(u,e){if(!("default"===e&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+u[0]);return u[0]}),{scope:"all",leadChar:"\\"}),O.addToken(/\(\?P?<([\w$]+)>/,(function(u){if(!isNaN(u[1]))throw new SyntaxError("Cannot use integer as capture name "+u[0]);if("length"===u[1]||"__proto__"===u[1])throw new SyntaxError("Cannot use reserved word as capture name "+u[0]);if(-1!==this.captureNames.indexOf(u[1]))throw new SyntaxError("Cannot use same name for multiple groups "+u[0]);return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),O.addToken(/\((?!\?)/,(function(u,e,d){return-1!==d.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),e.default=O,u.exports=e.default},496:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,d=u.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,e],"g",{conjunction:"or"});function n(u){var e=/^(?:\(\?:\))*\^/,d=/\$(?:\(\?:\))*$/;return e.test(u)&&d.test(u)&&d.test(u.replace(/\\[\s\S]/g,""))?u.replace(e,"").replace(d,""):u}function t(e,d){var n=d?"x":"";return u.isRegExp(e)?e.xregexp&&e.xregexp.captureNames?e:u(e.source,n):u(e,n)}function r(e){return e instanceof RegExp?e:u.escape(e)}function a(u,e,d){return u["subpattern"+d]=e,u}function c(u,e,d){return u+(e1?n-1:0),f=1;f"):f="(?:",h=m,""+f+o[a].pattern.replace(e,(function(u,e,d){if(e){if(c=o[a].names[m-h],++m,c)return"(?<"+c+">"}else if(d)return i=+d-1,o[a].names[i]?"\\k<"+o[a].names[i]+">":"\\"+(+d+h);return u}))+")"}if(t){if(c=_[b],v[++b]=++m,c)return"(?<"+c+">"}else if(r)return _[i=+r-1]?"\\k<"+_[i]+">":"\\"+v[+r];return u}));return u(g,c)}},u.exports=e.default},497:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){function e(u,e,d,n){return{name:u,value:e,start:d,end:n}}u.matchRecursive=function(d,n,t,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),f=-1!==r.indexOf("y"),i=r.replace(/y/g,""),o=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,b=0,v=void 0,_=void 0,g=void 0,D=void 0,y=void 0;if(n=u(n,i),t=u(t,i),o){if(o.length>1)throw new Error("Cannot use more than one escape character");o=u.escape(o),y=new RegExp("(?:"+o+"[\\S\\s]|(?:(?!"+u.union([n,t],"",{conjunction:"or"}).source+")[^"+o+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(o&&(h+=(u.exec(d,y,h,"sticky")||[""])[0].length),g=u.exec(d,n,h),D=u.exec(d,t,h),g&&D&&(g.index<=D.index?D=null:g=null),g||D)h=(m=(g||D).index)+(g||D)[0].length;else if(!p)break;if(f&&!p&&m>b)break;if(g)p||(v=m,_=h),++p;else{if(!D||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&v>b&&s.push(e(l[0],d.slice(b,v),b,v)),l[1]&&s.push(e(l[1],d.slice(v,_),v,_)),l[2]&&s.push(e(l[2],d.slice(_,m),_,m)),l[3]&&s.push(e(l[3],d.slice(m,h),m,h))):s.push(d.slice(_,m)),b=h,!c))break}m===h&&++h}return c&&!f&&l&&l[0]&&d.length>b&&s.push(e(l[0],d.slice(b),b,d.length)),s}},u.exports=e.default},498:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){var e={},d=u._dec,n=u._hex,t=u._pad4;function r(u){return u.replace(/[- _]+/g,"").toLowerCase()}function a(u){var e=/^\\[xu](.+)/.exec(u);return e?d(e[1]):u.charCodeAt("\\"===u[0]?1:0)}function c(d){var r,c,f;return e[d]["b!"]||(e[d]["b!"]=(r=e[d].bmp,c="",f=-1,u.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var e=a(u[1]);e>f+1&&(c+="\\u"+t(n(f+1)),e>f+2&&(c+="-\\u"+t(n(e-1)))),f=a(u[2]||u[1])})),f<65535&&(c+="\\u"+t(n(f+1)),f<65534&&(c+="-\\uFFFF")),c))}function f(u,d){var n=d?"a!":"a=";return e[u][n]||(e[u][n]=function(u,d){var n=e[u],t="";return n.bmp&&!n.isBmpLast&&(t="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(t+=n.astral),n.isBmpLast&&n.bmp&&(t+=(n.astral?"|":"")+"["+n.bmp+"]"),d?"(?:(?!"+t+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+t+")"}(u,d))}u.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(u,d,n){var t="P"===u[1]||!!u[2],a=-1!==n.indexOf("A"),i=r(u[4]||u[3]),o=e[i];if("P"===u[1]&&u[2])throw new SyntaxError("Invalid double negation "+u[0]);if(!e.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+u[0]);if(o.inverseOf){if(i=r(o.inverseOf),!e.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+u[0]+" -> "+o.inverseOf);o=e[i],t=!t}if(!o.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+u[0]);if(a){if("class"===d)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return f(i,t)}return"class"===d?t?c(i):o.bmp:(t?"[^":"[")+o.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(d){for(var n=void 0,t=0;t\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},u.exports=e.default},501:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var e=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];e.push({name:"Assigned",inverseOf:"Cn"}),u.addUnicodeData(e)},u.exports=e.default},502:function(u,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");u.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},u.exports=e.default},598:function(u,e,d){u.exports=function(){var u=[],e=[],d={},n={},t={};function r(u){return"string"==typeof u?new RegExp("^"+u+"$","i"):u}function a(u,e){return u===e?e:u===u.toLowerCase()?e.toLowerCase():u===u.toUpperCase()?e.toUpperCase():u[0]===u[0].toUpperCase()?e.charAt(0).toUpperCase()+e.substr(1).toLowerCase():e.toLowerCase()}function c(u,e){return u.replace(/\$(\d{1,2})/g,(function(u,d){return e[d]||""}))}function f(u,e){return u.replace(e[0],(function(d,n){var t=c(e[1],arguments);return a(""===d?u[n-1]:d,t)}))}function i(u,e,n){if(!u.length||d.hasOwnProperty(u))return e;for(var t=n.length;t--;){var r=n[t];if(r[0].test(e))return f(e,r)}return e}function o(u,e,d){return function(n){var t=n.toLowerCase();return e.hasOwnProperty(t)?a(n,t):u.hasOwnProperty(t)?a(n,u[t]):i(t,n,d)}}function l(u,e,d,n){return function(n){var t=n.toLowerCase();return!!e.hasOwnProperty(t)||!u.hasOwnProperty(t)&&i(t,t,d)===t}}function s(u,e,d){return(d?e+" ":"")+(1===e?s.singular(u):s.plural(u))}return s.plural=o(t,n,u),s.isPlural=l(t,n,u),s.singular=o(n,t,e),s.isSingular=l(n,t,e),s.addPluralRule=function(e,d){u.push([r(e),d])},s.addSingularRule=function(u,d){e.push([r(u),d])},s.addUncountableRule=function(u){"string"!=typeof u?(s.addPluralRule(u,"$0"),s.addSingularRule(u,"$0")):d[u.toLowerCase()]=!0},s.addIrregularRule=function(u,e){e=e.toLowerCase(),u=u.toLowerCase(),t[u]=e,n[e]=u},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(u){return s.addIrregularRule(u[0],u[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(u){return s.addPluralRule(u[0],u[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(u){return s.addSingularRule(u[0],u[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[e\xe9]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(s.addUncountableRule),s}()}}]); \ No newline at end of file diff --git a/3116c1fa.e25c73d7.js.LICENSE.txt b/3116c1fa.d79d732c.js.LICENSE.txt similarity index 100% rename from 3116c1fa.e25c73d7.js.LICENSE.txt rename to 3116c1fa.d79d732c.js.LICENSE.txt diff --git a/3da71a70.faa6d352.js b/3da71a70.243cb025.js similarity index 99% rename from 3da71a70.faa6d352.js rename to 3da71a70.243cb025.js index 78cafdb098..0faac49639 100644 --- a/3da71a70.faa6d352.js +++ b/3da71a70.243cb025.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{221:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(425)),l=a(437),i=a(444),c=a(424),s=a(429),u=a(431),b={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to deploy Helm charts",permalink:"/guides/tutorial/how-to-deploy-helm-charts"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),r=a.n(n),o=a(423),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),r=a.n(n),o=a(424);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(432),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},431:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(430),l=a(423),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),r=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(449),i=a(423),c=a.n(i),s=a(433),u=a.n(s),b=a(448),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,y=Object(b.a)(),f=y.tabGroupChoices,v=y.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=f[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{221:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(425)),l=a(437),i=a(443),c=a(424),s=a(429),u=a(431),b={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to deploy Helm charts",permalink:"/guides/tutorial/how-to-deploy-helm-charts"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),r=a.n(n),o=a(423),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),r=a.n(n),o=a(424);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(432),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},431:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(430),l=a(423),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),r=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(447),i=a(423),c=a.n(i),s=a(433),u=a.n(s),b=a(446),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,y=Object(b.a)(),f=y.tabGroupChoices,v=y.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=f[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/404.html b/404.html index 07fc8cd1a7..f3e748487d 100644 --- a/404.html +++ b/404.html @@ -26,9 +26,9 @@ - + - + @@ -39,9 +39,9 @@ - + - + diff --git a/410a9ba0.5c3bfd65.js b/410a9ba0.5da3baf5.js similarity index 99% rename from 410a9ba0.5c3bfd65.js rename to 410a9ba0.5da3baf5.js index 53c78c1e2e..098dd8aacc 100644 --- a/410a9ba0.5c3bfd65.js +++ b/410a9ba0.5da3baf5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{226:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(449),l=n(423),c=n.n(l),s=n(433),u=n.n(s),b=n(448),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{226:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),c={last_modified_on:"2022-07-25",$schema:"/.meta/.schemas/guides.json",title:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create your Staging environment from your Production environment on AWS",description:"Step-by-step guide to create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",readingTime:"4 min read",source:"@site/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create your Staging environment from your Production environment on AWS",truncated:!1,prevItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"},nextItem:{title:"Creating API clients using OpenAPI Tools",permalink:"/guides/tutorial/generate-qovery-api-client"}},u=[{value:"Create a Staging cluster",id:"create-a-staging-cluster",children:[]},{value:"Create your Staging environment from your Production environment",id:"create-your-staging-environment-from-your-production-environment",children:[]},{value:"Update your Staging applications",id:"update-your-staging-applications",children:[]},{value:"Override your environment variables and secrets",id:"override-your-environment-variables-and-secrets",children:[]},{value:"Deploy your Staging environment",id:"deploy-your-staging-environment",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Let's say you have your production environment deployed, and you want to create a staging environment. You have two options:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Create a staging environment from scratch."),Object(r.b)("li",{parentName:"ol"},"Clone your production environment and create a staging environment from it.")),Object(r.b)("p",null,"This is where the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature of Qovery is useful. No need to create a new environment, just clone your production environment and create a staging environment from it."),Object(r.b)("p",null,"In this guide, we will go through the steps to create a staging environment from your production environment. While applying the best practices by isolating the staging and production environments on two separated clusters and VPCs."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/staging-from-production/complete_schema.jpg",alt:"Complete Production and Staging infrastructure"})),Object(r.b)(l.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/5a76704a196341deb5384b2883113adf",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-a-staging-cluster"},"Create a Staging cluster"),Object(r.b)("p",null,"Isolating the staging and production environments on two separate clusters and VPCs is a good practice to avoid any potential issues on your production caused by your staging. This is not a mandatory step, but it is well recommended."),Object(r.b)("p",null,"To create your staging cluster it's also recommended creating a new AWS IAM access key and secret access key in a dedicated subaccount. Then you are sure that both environment are also isolated at the AWS level:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your Organization cluster settings"),Object(r.b)("li",{parentName:"ol"},'Add a cluster with a name "staging"'),Object(r.b)("li",{parentName:"ol"},"Deploy your staging cluster")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/6f77172ae27f41a5a7c0e3114398b13c",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"create-your-staging-environment-from-your-production-environment"},"Create your Staging environment from your Production environment"),Object(r.b)("p",null,"Now, to create your staging environment from your production environment, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Go inside your production environment and click on the "Clone" button.'),Object(r.b)("li",{parentName:"ol"},'Give a name to your staging environment (E.g "staging")'),Object(r.b)("li",{parentName:"ol"},'Set the mode to "Staging"'),Object(r.b)("li",{parentName:"ol"},'Set the cluster to "staging"'),Object(r.b)("li",{parentName:"ol"},'Click on "Create"'),Object(r.b)("li",{parentName:"ol"},"That's it!")),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Cloning your database does not copy the data (yet). To copy your data in Staging consider using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.replibyte.com"}),"Replibyte")," in standalone. It will be integrated in Qovery soon.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/614844644cc34211853de19dafe79343",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Your environment has been created, but it's not deployed yet. Before we will make some adjustment to change the branch of our applications."),Object(r.b)("h2",{id:"update-your-staging-applications"},"Update your Staging applications"),Object(r.b)("p",null,"Your Staging applications have the same branch as your Production applications. To update your Staging applications branch, you need to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go into the settings of each of your applications."),Object(r.b)("li",{parentName:"ol"},"Update the branch to your Staging branch."),Object(r.b)("li",{parentName:"ol"},'Click on "Save"')),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/2f4f2a22062a4840ae077285a891e573",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"We are almost done, now we need to smartly change our environment variables and secrets to not use the one used in production."),Object(r.b)("h2",{id:"override-your-environment-variables-and-secrets"},"Override your environment variables and secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Qovery makes the distinction between ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Environment Variables")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Secrets")," even if for your app both will be used as Environment Variables. Check out ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"this documentation")," to learn more about Environment Variables and Secrets.")),Object(r.b)("p",null,"Let's say you have a production environment with the following environment variables:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"NODE_ENV=production"),Object(r.b)("li",{parentName:"ul"},"STRIPE_API_KEY=a-secret-production-key")),Object(r.b)("p",null,"You might need to keep the same keys but change the values. That's exactly what Qovery makes you do with the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#override-environment-variable"}),"Environment Variable Override feature"),". You can keep the same keys but change the values."),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/3d5d37dd9a954500aa559afead5b3981",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"deploy-your-staging-environment"},"Deploy your Staging environment"),Object(r.b)("p",null,'Finally, your Staging environment has been created and set up correctly. To deploy your Staging environment, you just need to go to your Staging environment and click on the "Deploy" button.'),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/04709bb4039447c699477ce01a1aa19b",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,c=null;switch(l){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||c))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(447),l=n(423),c=n.n(l),s=n(433),u=n.n(s),b=n(446),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",o,{"tabs--block":t}),style:l},s.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return i(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,c=l;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,c=e.placeholder,s=e.select,v=e.size,h=(e.style,e.values),y=e.urlKey,f=Object(b.a)(),w=f.tabGroupChoices,O=f.setTabGroupChoices,j=Object(o.useState)(n),k=j[0],S=j[1];if(null!=i){var N=w[i];null!=N&&N!==k&&S(N)}var C=function(e){S(e),null!=i&&O(i,e)},E=[],T=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&y){var e=u.a.parse(window.location.search);e[y]&&S(e[y])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(v||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),h.length>1&&(s?r.a.createElement(g,Object(a.a)({changeSelectedValue:C,handleKeydown:T,placeholder:c,selectedValue:k,size:v,tabRefs:E},e)):r.a.createElement(p,Object(a.a)({changeSelectedValue:C,handleKeydown:T,selectedValue:k,tabRefs:E},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}}}]); \ No newline at end of file diff --git a/54e7632e.c06ee927.js b/54e7632e.f37d554b.js similarity index 99% rename from 54e7632e.c06ee927.js rename to 54e7632e.f37d554b.js index 21504ceb0a..e6d1be000e 100644 --- a/54e7632e.c06ee927.js +++ b/54e7632e.f37d554b.js @@ -1,2 +1,2 @@ -/*! For license information please see 54e7632e.c06ee927.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{419:function(e,u,t){"use strict";t.r(u);var n={};t.r(n),t.d(n,"now",(function(){return g})),t.d(n,"timer",(function(){return w})),t.d(n,"timerFlush",(function(){return E})),t.d(n,"timeout",(function(){return k})),t.d(n,"interval",(function(){return j}));var d,r,a=t(0),c=t.n(a),o=t(561),i=t(445),f=t(430),l=(t(426),t(84),0),s=0,p=0,m=0,h=0,v=0,b="object"==typeof performance&&performance.now?performance:Date,y="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function g(){return h||(y(_),h=b.now()+v)}function _(){h=0}function x(){this._call=this._time=this._next=null}function w(e,u,t){var n=new x;return n.restart(e,u,t),n}function E(){g(),++l;for(var e,u=d;u;)(e=h-u._time)>=0&&u._call.call(null,e),u=u._next;--l}function I(){h=(m=b.now())+v,l=s=0;try{E()}finally{l=0,function(){var e,u,t=d,n=1/0;for(;t;)t._call?(n>t._time&&(n=t._time),e=t,t=t._next):(u=t._next,t._next=null,t=e?e._next=u:d=u);r=e,A(n)}(),h=0}}function S(){var e=b.now(),u=e-m;u>1e3&&(v-=u,m=e)}function A(e){l||(s&&(s=clearTimeout(s)),e-h>24?(e<1/0&&(s=setTimeout(I,e-b.now()-v)),p&&(p=clearInterval(p))):(p||(m=b.now(),p=setInterval(S,1e3)),l=1,y(I)))}x.prototype=w.prototype={constructor:x,restart:function(e,u,t){if("function"!=typeof e)throw new TypeError("callback is not a function");t=(null==t?g():+t)+(null==u?0:+u),this._next||r===this||(r?r._next=this:d=this,r=this),this._call=e,this._time=t,A()},stop:function(){this._call&&(this._call=null,this._time=1/0,A())}};var k=function(e,u,t){var n=new x;return u=null==u?0:+u,n.restart((function(t){n.stop(),e(t+u)}),u,t),n},j=function(e,u,t){var n=new x,d=u;return null==u?(n.restart(e,u,t),n):(u=+u,t=null==t?g():+t,n.restart((function r(a){a+=d,n.restart(r,d+=u,t),e(a)}),u,t),n)},O=Object.assign({},n);t(436);u.default=function(e){return Object(a.useEffect)((function(){if("undefined"!=typeof document){var e=function(e){for(var u=e.getContext("2d"),t=e.width,n=e.height,d=2*Math.PI,r=200,a=new Array(r),c=0;ct+45&&(o.x-=t+90),o.y+=o.vy,o.y<-45?o.y+=n+90:o.y>n+45&&(o.y-=n+90),o.vx+=.2*(Math.random()-.5)-.01*o.vx,o.vy+=.2*(Math.random()-.5)-.01*o.vy,u.beginPath(),u.arc(o.x,o.y,3,0,d),u.fillStyle="rgba(40,217,242,0.4)",u.fill()}for(c=0;c3600?(2025-m)/-1575:1,u.beginPath(),u.moveTo(f.x,f.y),u.lineTo(l.x,l.y),u.strokeStyle="rgba(40,217,242,0.3)",u.stroke())}u.restore()}))}(document.querySelector("canvas"));return function(){e.stop()}}}),[]),c.a.createElement(i.a,{title:"Components - Sources, Transforms, & Sinks",description:"Browse and search all of Qovery's components: sources, transforms, and sinks. Filter by event type, guarantee, function, operating system, and provider."},c.a.createElement("header",{className:"hero hero--animated-graph"},c.a.createElement("div",{className:"container container--fluid container--flush"},c.a.createElement("canvas",{width:"2000",height:"200"}),c.a.createElement("div",{className:"overlay"},c.a.createElement("h1",null,"Qovery Components"),c.a.createElement("div",{className:"hero--subtitle"},"Components allow you to collect, transform, and route data with ease. ",c.a.createElement(f.a,{to:"/docs/getting-started/concepts/"},"Learn more"),".")))),c.a.createElement("main",{className:"container"},c.a.createElement(o.a,{filterColumn:!0,headingLevel:2,location:e.location})))}},423:function(e,u,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function d(){for(var e=[],u=0;u1?arguments[1]:void 0,t),o=a>2?arguments[2]:void 0,i=void 0===o?t:d(o,t);i>c;)u[c++]=e;return u}},428:function(e,u,t){var n=t(28).f,d=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in d||t(10)&&n(d,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},431:function(e,u,t){"use strict";var n=t(0),d=t.n(n),r=t(430),a=t(423),c=t.n(a);t(133);u.a=function(e){var u=e.children,t=e.className,n=e.badge,a=e.leftIcon,o=e.rightIcon,i=e.size,f=e.target,l=e.to,s=c()("jump-to","jump-to--"+i,t),p=d.a.createElement("div",{className:"jump-to--inner"},d.a.createElement("div",{className:"jump-to--inner-2"},a&&d.a.createElement("div",{className:"jump-to--left"},d.a.createElement("i",{className:"feather icon-"+a})),d.a.createElement("div",{className:"jump-to--main"},n?d.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",u),d.a.createElement("div",{className:"jump-to--right"},d.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return f?d.a.createElement("a",{href:l,target:f,className:s},p):d.a.createElement(r.a,{to:l,className:s},p)}},442:function(e,u,t){"use strict";var n=t(8),d=t(486),r=t(55);t(56)("search",1,(function(e,u,t,a){return[function(t){var n=e(this),d=null==t?void 0:t[u];return void 0!==d?d.call(t,n):new RegExp(t)[u](String(n))},function(e){var u=a(t,e,this);if(u.done)return u.value;var c=n(e),o=String(this),i=c.lastIndex;d(i,0)||(c.lastIndex=0);var f=r(c,o);return d(c.lastIndex,i)||(c.lastIndex=i),null===f?-1:f.index}]}))},445:function(e,u,t){"use strict";t(457);var n=t(0),d=t.n(n),r=t(458),a=t(443),c=t(1),o=(t(446),t(447),t(459),t(430)),i=t(460),f=t(440),l=t.n(f),s=t(461),p=t.n(s),m=t(436),h=t(423),v=t.n(h),b=t(135),y=t.n(b),g=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.moon)})},_=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.sun)})},x=function(e){var u=Object(m.a)().isClient;return d.a.createElement(p.a,Object(c.a)({disabled:!u,icons:{checked:d.a.createElement(g,null),unchecked:d.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,u=(void 0===e?{}:e).customFields.metadata.latest_post,t=Date.parse(u.date),n=new Date,d=Math.abs(n-t),r=Math.ceil(d/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&d.a.createElement("div",{className:"row footer__links"},d.a.createElement("div",{className:"col col--5 footer__col"},d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),d.a.createElement("div",null,d.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},d.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},d.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},d.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},d.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),o.map((function(e,u){return d.a.createElement("div",{key:u,className:"col footer__col"},null!=e.title?d.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?d.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,u){return e.html?d.a.createElement("li",{key:u,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):d.a.createElement("li",{key:e.href||e.to,className:"footer__item"},d.a.createElement(L,e))}))):null)}))),(f||a)&&d.a.createElement("div",{className:"text--center"},f&&f.src&&d.a.createElement("div",{className:"margin-bottom--sm"},f.href?d.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},d.a.createElement(F,{alt:f.alt,url:s})):d.a.createElement(F,{alt:f.alt,url:s})),d.a.createElement("small",null,a),d.a.createElement("br",null))))},D=t(462),U=t(463),z=t(3);t(138);u.a=function(e){var u=Object(m.a)().siteConfig,t=void 0===u?{}:u,n=t.favicon,c=(t.tagline,t.title),o=t.themeConfig.image,i=t.url,f=e.children,l=e.title,s=e.noFooter,p=e.description,h=e.image,v=e.keywords,b=(e.permalink,e.version),y=l?l+" | "+c:c,g=h||o,_=i+Object(I.a)(g),x=Object(I.a)(n),w=Object(z.h)(),E=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return d.a.createElement(U.a,null,d.a.createElement(D.a,null,d.a.createElement(a.a,null,d.a.createElement("html",{lang:"en"}),d.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),y&&d.a.createElement("title",null,y),y&&d.a.createElement("meta",{property:"og:title",content:y}),n&&d.a.createElement("link",{rel:"shortcut icon",href:x}),p&&d.a.createElement("meta",{name:"description",content:p}),p&&d.a.createElement("meta",{property:"og:description",content:p}),b&&d.a.createElement("meta",{name:"docsearch:version",content:b}),v&&v.length&&d.a.createElement("meta",{name:"keywords",content:v.join(",")}),g&&d.a.createElement("meta",{property:"og:image",content:_}),g&&d.a.createElement("meta",{property:"twitter:image",content:_}),g&&d.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+y}),E&&d.a.createElement("meta",{property:"og:url",content:E}),d.a.createElement("meta",{name:"twitter:card",content:"summary"}),E&&d.a.createElement("link",{rel:"canonical",href:E})),d.a.createElement(r.a,null),d.a.createElement(P,null),d.a.createElement("div",{className:"main-wrapper"},f),!s&&d.a.createElement(B,null)))}},451:function(e,u,t){(function(e,n){var d;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],o="[object Arguments]",i="[object Array]",f="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",v="[object Number]",b="[object Object]",y="[object RegExp]",g="[object Set]",_="[object String]",x="[object Symbol]",w="[object WeakMap]",E="[object ArrayBuffer]",I="[object DataView]",S="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",j="[object Int16Array]",O="[object Int32Array]",N="[object Uint8Array]",C="[object Uint16Array]",P="[object Uint32Array]",T=/\b__p \+= '';/g,M=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,F=/[&<>"']/g,B=RegExp(L.source),D=RegExp(F.source),U=/<%-([\s\S]+?)%>/g,z=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,G=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,K=RegExp(H.source),V=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ue=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ne=/\w*$/,de=/^[-+]0x[0-9a-f]+$/i,re=/^0b[01]+$/i,ae=/^\[object .+?Constructor\]$/,ce=/^0o[0-7]+$/i,oe=/^(?:0|[1-9]\d*)$/,ie=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,fe=/($^)/,le=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",ve="["+se+"]",be="\\d+",ye="[\\u2700-\\u27bf]",ge="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+be+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",xe="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",Ie="[\\ud800-\\udbff][\\udc00-\\udfff]",Se="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+ge+"|"+_e+")",ke="(?:"+Se+"|"+_e+")",je="(?:"+ve+"|"+xe+")"+"?",Oe="[\\ufe0e\\ufe0f]?"+je+("(?:\\u200d(?:"+[we,Ee,Ie].join("|")+")[\\ufe0e\\ufe0f]?"+je+")*"),Ne="(?:"+[ye,Ee,Ie].join("|")+")"+Oe,Ce="(?:"+[we+ve+"?",ve,Ee,Ie,me].join("|")+")",Pe=RegExp("['\u2019]","g"),Te=RegExp(ve,"g"),Me=RegExp(xe+"(?="+xe+")|"+Ce+Oe,"g"),Re=RegExp([Se+"?"+ge+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,Se,"$"].join("|")+")",ke+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,Se+Ae,"$"].join("|")+")",Se+"?"+Ae+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Se+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",be,Ne].join("|"),"g"),Le=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Fe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Be=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],De=-1,Ue={};Ue[S]=Ue[A]=Ue[k]=Ue[j]=Ue[O]=Ue[N]=Ue["[object Uint8ClampedArray]"]=Ue[C]=Ue[P]=!0,Ue[o]=Ue[i]=Ue[E]=Ue[f]=Ue[I]=Ue[l]=Ue[s]=Ue[p]=Ue[h]=Ue[v]=Ue[b]=Ue[y]=Ue[g]=Ue[_]=Ue[w]=!1;var ze={};ze[o]=ze[i]=ze[E]=ze[I]=ze[f]=ze[l]=ze[S]=ze[A]=ze[k]=ze[j]=ze[O]=ze[h]=ze[v]=ze[b]=ze[y]=ze[g]=ze[_]=ze[x]=ze[N]=ze["[object Uint8ClampedArray]"]=ze[C]=ze[P]=!0,ze[s]=ze[p]=ze[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$e=parseFloat,Ge=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,He="object"==typeof self&&self&&self.Object===Object&&self,Ke=qe||He||Function("return this")(),Ve=u&&!u.nodeType&&u,Je=Ve&&"object"==typeof n&&n&&!n.nodeType&&n,Ze=Je&&Je.exports===Ve,Qe=Ze&&qe.process,Ye=function(){try{var e=Je&&Je.require&&Je.require("util").types;return e||Qe&&Qe.binding&&Qe.binding("util")}catch(u){}}(),Xe=Ye&&Ye.isArrayBuffer,eu=Ye&&Ye.isDate,uu=Ye&&Ye.isMap,tu=Ye&&Ye.isRegExp,nu=Ye&&Ye.isSet,du=Ye&&Ye.isTypedArray;function ru(e,u,t){switch(t.length){case 0:return e.call(u);case 1:return e.call(u,t[0]);case 2:return e.call(u,t[0],t[1]);case 3:return e.call(u,t[0],t[1],t[2])}return e.apply(u,t)}function au(e,u,t,n){for(var d=-1,r=null==e?0:e.length;++d-1}function su(e,u,t){for(var n=-1,d=null==e?0:e.length;++n-1;);return t}function Mu(e,u){for(var t=e.length;t--&&xu(u,e[t],0)>-1;);return t}function Ru(e,u){for(var t=e.length,n=0;t--;)e[t]===u&&++n;return n}var Lu=Au({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Fu=Au({"&":"&","<":"<",">":">",'"':""","'":"'"});function Bu(e){return"\\"+We[e]}function Du(e){return Le.test(e)}function Uu(e){var u=-1,t=Array(e.size);return e.forEach((function(e,n){t[++u]=[n,e]})),t}function zu(e,u){return function(t){return e(u(t))}}function Wu(e,u){for(var t=-1,n=e.length,d=0,r=[];++t",""":'"',"'":"'"});var Vu=function e(u){var t,n=(u=null==u?Ke:Vu.defaults(Ke.Object(),u,Vu.pick(Ke,Be))).Array,d=u.Date,se=u.Error,pe=u.Function,me=u.Math,he=u.Object,ve=u.RegExp,be=u.String,ye=u.TypeError,ge=n.prototype,_e=pe.prototype,xe=he.prototype,we=u["__core-js_shared__"],Ee=_e.toString,Ie=xe.hasOwnProperty,Se=0,Ae=(t=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",ke=xe.toString,je=Ee.call(he),Oe=Ke._,Ne=ve("^"+Ee.call(Ie).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ce=Ze?u.Buffer:void 0,Me=u.Symbol,Le=u.Uint8Array,We=Ce?Ce.allocUnsafe:void 0,qe=zu(he.getPrototypeOf,he),He=he.create,Ve=xe.propertyIsEnumerable,Je=ge.splice,Qe=Me?Me.isConcatSpreadable:void 0,Ye=Me?Me.iterator:void 0,yu=Me?Me.toStringTag:void 0,Au=function(){try{var e=Xd(he,"defineProperty");return e({},"",{}),e}catch(u){}}(),Ju=u.clearTimeout!==Ke.clearTimeout&&u.clearTimeout,Zu=d&&d.now!==Ke.Date.now&&d.now,Qu=u.setTimeout!==Ke.setTimeout&&u.setTimeout,Yu=me.ceil,Xu=me.floor,et=he.getOwnPropertySymbols,ut=Ce?Ce.isBuffer:void 0,tt=u.isFinite,nt=ge.join,dt=zu(he.keys,he),rt=me.max,at=me.min,ct=d.now,ot=u.parseInt,it=me.random,ft=ge.reverse,lt=Xd(u,"DataView"),st=Xd(u,"Map"),pt=Xd(u,"Promise"),mt=Xd(u,"Set"),ht=Xd(u,"WeakMap"),vt=Xd(he,"create"),bt=ht&&new ht,yt={},gt=Ar(lt),_t=Ar(st),xt=Ar(pt),wt=Ar(mt),Et=Ar(ht),It=Me?Me.prototype:void 0,St=It?It.valueOf:void 0,At=It?It.toString:void 0;function kt(e){if($a(e)&&!Pa(e)&&!(e instanceof Ct)){if(e instanceof Nt)return e;if(Ie.call(e,"__wrapped__"))return kr(e)}return new Nt(e)}var jt=function(){function e(){}return function(u){if(!Wa(u))return{};if(He)return He(u);e.prototype=u;var t=new e;return e.prototype=void 0,t}}();function Ot(){}function Nt(e,u){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!u,this.__index__=0,this.__values__=void 0}function Ct(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pt(e){var u=-1,t=null==e?0:e.length;for(this.clear();++u=u?e:u)),e}function Jt(e,u,t,n,d,r){var a,c=1&u,i=2&u,s=4&u;if(t&&(a=d?t(e,n,d,r):t(e)),void 0!==a)return a;if(!Wa(e))return e;var w=Pa(e);if(w){if(a=function(e){var u=e.length,t=new e.constructor(u);u&&"string"==typeof e[0]&&Ie.call(e,"index")&&(t.index=e.index,t.input=e.input);return t}(e),!c)return bd(e,a)}else{var T=tr(e),M=T==p||T==m;if(La(e))return ld(e,c);if(T==b||T==o||M&&!d){if(a=i||M?{}:dr(e),!c)return i?function(e,u){return yd(e,ur(e),u)}(e,function(e,u){return e&&yd(u,_c(u),e)}(a,e)):function(e,u){return yd(e,er(e),u)}(e,qt(a,e))}else{if(!ze[T])return d?e:{};a=function(e,u,t){var n=e.constructor;switch(u){case E:return sd(e);case f:case l:return new n(+e);case I:return function(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}(e,t);case S:case A:case k:case j:case O:case N:case"[object Uint8ClampedArray]":case C:case P:return pd(e,t);case h:return new n;case v:case _:return new n(e);case y:return function(e){var u=new e.constructor(e.source,ne.exec(e));return u.lastIndex=e.lastIndex,u}(e);case g:return new n;case x:return d=e,St?he(St.call(d)):{}}var d}(e,T,c)}}r||(r=new Lt);var R=r.get(e);if(R)return R;r.set(e,a),Va(e)?e.forEach((function(n){a.add(Jt(n,u,t,n,e,r))})):Ga(e)&&e.forEach((function(n,d){a.set(d,Jt(n,u,t,d,e,r))}));var L=w?void 0:(s?i?Hd:qd:i?_c:gc)(e);return cu(L||e,(function(n,d){L&&(n=e[d=n]),Wt(a,d,Jt(n,u,t,d,e,r))})),a}function Zt(e,u,t){var n=t.length;if(null==e)return!n;for(e=he(e);n--;){var d=t[n],r=u[d],a=e[d];if(void 0===a&&!(d in e)||!r(a))return!1}return!0}function Qt(e,u,t){if("function"!=typeof e)throw new ye(r);return gr((function(){e.apply(void 0,t)}),u)}function Yt(e,u,t,n){var d=-1,r=lu,a=!0,c=e.length,o=[],i=u.length;if(!c)return o;t&&(u=pu(u,Nu(t))),n?(r=su,a=!1):u.length>=200&&(r=Pu,a=!1,u=new Rt(u));e:for(;++d-1},Tt.prototype.set=function(e,u){var t=this.__data__,n=$t(t,e);return n<0?(++this.size,t.push([e,u])):t[n][1]=u,this},Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new Pt,map:new(st||Tt),string:new Pt}},Mt.prototype.delete=function(e){var u=Qd(this,e).delete(e);return this.size-=u?1:0,u},Mt.prototype.get=function(e){return Qd(this,e).get(e)},Mt.prototype.has=function(e){return Qd(this,e).has(e)},Mt.prototype.set=function(e,u){var t=Qd(this,e),n=t.size;return t.set(e,u),this.size+=t.size==n?0:1,this},Rt.prototype.add=Rt.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Rt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.clear=function(){this.__data__=new Tt,this.size=0},Lt.prototype.delete=function(e){var u=this.__data__,t=u.delete(e);return this.size=u.size,t},Lt.prototype.get=function(e){return this.__data__.get(e)},Lt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.set=function(e,u){var t=this.__data__;if(t instanceof Tt){var n=t.__data__;if(!st||n.length<199)return n.push([e,u]),this.size=++t.size,this;t=this.__data__=new Mt(n)}return t.set(e,u),this.size=t.size,this};var Xt=xd(cn),en=xd(on,!0);function un(e,u){var t=!0;return Xt(e,(function(e,n,d){return t=!!u(e,n,d)})),t}function tn(e,u,t){for(var n=-1,d=e.length;++n0&&t(c)?u>1?dn(c,u-1,t,n,d):mu(d,c):n||(d[d.length]=c)}return d}var rn=wd(),an=wd(!0);function cn(e,u){return e&&rn(e,u,gc)}function on(e,u){return e&&an(e,u,gc)}function fn(e,u){return fu(u,(function(u){return Da(e[u])}))}function ln(e,u){for(var t=0,n=(u=cd(u,e)).length;null!=e&&tu}function hn(e,u){return null!=e&&Ie.call(e,u)}function vn(e,u){return null!=e&&u in he(e)}function bn(e,u,t){for(var d=t?su:lu,r=e[0].length,a=e.length,c=a,o=n(a),i=1/0,f=[];c--;){var l=e[c];c&&u&&(l=pu(l,Nu(u))),i=at(l.length,i),o[c]=!t&&(u||r>=120&&l.length>=120)?new Rt(c&&l):void 0}l=e[0];var s=-1,p=o[0];e:for(;++s=c)return o;var i=t[n];return o*("desc"==i?-1:1)}}return e.index-u.index}(e,u,t)}))}function Tn(e,u,t){for(var n=-1,d=u.length,r={};++n-1;)c!==e&&Je.call(c,o,1),Je.call(e,o,1);return e}function Rn(e,u){for(var t=e?u.length:0,n=t-1;t--;){var d=u[t];if(t==n||d!==r){var r=d;ar(d)?Je.call(e,d,1):Xn(e,d)}}return e}function Ln(e,u){return e+Xu(it()*(u-e+1))}function Fn(e,u){var t="";if(!e||u<1||u>9007199254740991)return t;do{u%2&&(t+=e),(u=Xu(u/2))&&(e+=e)}while(u);return t}function Bn(e,u){return _r(mr(e,u,qc),e+"")}function Dn(e){return Bt(jc(e))}function Un(e,u){var t=jc(e);return Er(t,Vt(u,0,t.length))}function zn(e,u,t,n){if(!Wa(e))return e;for(var d=-1,r=(u=cd(u,e)).length,a=r-1,c=e;null!=c&&++dr?0:r+u),(t=t>r?r:t)<0&&(t+=r),r=u>t?0:t-u>>>0,u>>>=0;for(var a=n(r);++d>>1,a=e[r];null!==a&&!Za(a)&&(t?a<=u:a=200){var i=u?null:Fd(e);if(i)return $u(i);a=!1,d=Pu,o=new Rt}else o=u?[]:c;e:for(;++n=n?e:qn(e,u,t)}var fd=Ju||function(e){return Ke.clearTimeout(e)};function ld(e,u){if(u)return e.slice();var t=e.length,n=We?We(t):new e.constructor(t);return e.copy(n),n}function sd(e){var u=new e.constructor(e.byteLength);return new Le(u).set(new Le(e)),u}function pd(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}function md(e,u){if(e!==u){var t=void 0!==e,n=null===e,d=e==e,r=Za(e),a=void 0!==u,c=null===u,o=u==u,i=Za(u);if(!c&&!i&&!r&&e>u||r&&a&&o&&!c&&!i||n&&a&&o||!t&&o||!d)return 1;if(!n&&!r&&!i&&e1?t[d-1]:void 0,a=d>2?t[2]:void 0;for(r=e.length>3&&"function"==typeof r?(d--,r):void 0,a&&cr(t[0],t[1],a)&&(r=d<3?void 0:r,d=1),u=he(u);++n-1?d[r?u[a]:a]:void 0}}function kd(e){return Gd((function(u){var t=u.length,n=t,d=Nt.prototype.thru;for(e&&u.reverse();n--;){var a=u[n];if("function"!=typeof a)throw new ye(r);if(d&&!c&&"wrapper"==Vd(a))var c=new Nt([],!0)}for(n=c?n:t;++n1&&g.reverse(),l&&ic))return!1;var i=r.get(e);if(i&&r.get(u))return i==u;var f=-1,l=!0,s=2&t?new Rt:void 0;for(r.set(e,u),r.set(u,e);++f-1&&e%1==0&&e1?"& ":"")+u[n],u=u.join(t>2?", ":" "),e.replace(Q,"{\n/* [wrapped with "+u+"] */\n")}(n,function(e,u){return cu(c,(function(t){var n="_."+t[0];u&t[1]&&!lu(e,n)&&e.push(n)})),e.sort()}(function(e){var u=e.match(Y);return u?u[1].split(X):[]}(n),t)))}function wr(e){var u=0,t=0;return function(){var n=ct(),d=16-(n-t);if(t=n,d>0){if(++u>=800)return arguments[0]}else u=0;return e.apply(void 0,arguments)}}function Er(e,u){var t=-1,n=e.length,d=n-1;for(u=void 0===u?n:u;++t1?e[u-1]:void 0;return t="function"==typeof t?(e.pop(),t):void 0,Kr(e,t)}));function ea(e){var u=kt(e);return u.__chain__=!0,u}function ua(e,u){return u(e)}var ta=Gd((function(e){var u=e.length,t=u?e[0]:0,n=this.__wrapped__,d=function(u){return Kt(u,e)};return!(u>1||this.__actions__.length)&&n instanceof Ct&&ar(t)?((n=n.slice(t,+t+(u?1:0))).__actions__.push({func:ua,args:[d],thisArg:void 0}),new Nt(n,this.__chain__).thru((function(e){return u&&!e.length&&e.push(void 0),e}))):this.thru(d)}));var na=gd((function(e,u,t){Ie.call(e,t)?++e[t]:Ht(e,t,1)}));var da=Ad(Cr),ra=Ad(Pr);function aa(e,u){return(Pa(e)?cu:Xt)(e,Zd(u,3))}function ca(e,u){return(Pa(e)?ou:en)(e,Zd(u,3))}var oa=gd((function(e,u,t){Ie.call(e,t)?e[t].push(u):Ht(e,t,[u])}));var ia=Bn((function(e,u,t){var d=-1,r="function"==typeof u,a=Ma(e)?n(e.length):[];return Xt(e,(function(e){a[++d]=r?ru(u,e,t):yn(e,u,t)})),a})),fa=gd((function(e,u,t){Ht(e,t,u)}));function la(e,u){return(Pa(e)?pu:kn)(e,Zd(u,3))}var sa=gd((function(e,u,t){e[t?0:1].push(u)}),(function(){return[[],[]]}));var pa=Bn((function(e,u){if(null==e)return[];var t=u.length;return t>1&&cr(e,u[0],u[1])?u=[]:t>2&&cr(u[0],u[1],u[2])&&(u=[u[0]]),Pn(e,dn(u,1),[])})),ma=Zu||function(){return Ke.Date.now()};function ha(e,u,t){return u=t?void 0:u,Dd(e,128,void 0,void 0,void 0,void 0,u=e&&null==u?e.length:u)}function va(e,u){var t;if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){return--e>0&&(t=u.apply(this,arguments)),e<=1&&(u=void 0),t}}var ba=Bn((function(e,u,t){var n=1;if(t.length){var d=Wu(t,Jd(ba));n|=32}return Dd(e,n,u,t,d)})),ya=Bn((function(e,u,t){var n=3;if(t.length){var d=Wu(t,Jd(ya));n|=32}return Dd(u,n,e,t,d)}));function ga(e,u,t){var n,d,a,c,o,i,f=0,l=!1,s=!1,p=!0;if("function"!=typeof e)throw new ye(r);function m(u){var t=n,r=d;return n=d=void 0,f=u,c=e.apply(r,t)}function h(e){return f=e,o=gr(b,u),l?m(e):c}function v(e){var t=e-i;return void 0===i||t>=u||t<0||s&&e-f>=a}function b(){var e=ma();if(v(e))return y(e);o=gr(b,function(e){var t=u-(e-i);return s?at(t,a-(e-f)):t}(e))}function y(e){return o=void 0,p&&n?m(e):(n=d=void 0,c)}function g(){var e=ma(),t=v(e);if(n=arguments,d=this,i=e,t){if(void 0===o)return h(i);if(s)return fd(o),o=gr(b,u),m(i)}return void 0===o&&(o=gr(b,u)),c}return u=dc(u)||0,Wa(t)&&(l=!!t.leading,a=(s="maxWait"in t)?rt(dc(t.maxWait)||0,u):a,p="trailing"in t?!!t.trailing:p),g.cancel=function(){void 0!==o&&fd(o),f=0,n=i=d=o=void 0},g.flush=function(){return void 0===o?c:y(ma())},g}var _a=Bn((function(e,u){return Qt(e,1,u)})),xa=Bn((function(e,u,t){return Qt(e,dc(u)||0,t)}));function wa(e,u){if("function"!=typeof e||null!=u&&"function"!=typeof u)throw new ye(r);var t=function(){var n=arguments,d=u?u.apply(this,n):n[0],r=t.cache;if(r.has(d))return r.get(d);var a=e.apply(this,n);return t.cache=r.set(d,a)||r,a};return t.cache=new(wa.Cache||Mt),t}function Ea(e){if("function"!=typeof e)throw new ye(r);return function(){var u=arguments;switch(u.length){case 0:return!e.call(this);case 1:return!e.call(this,u[0]);case 2:return!e.call(this,u[0],u[1]);case 3:return!e.call(this,u[0],u[1],u[2])}return!e.apply(this,u)}}wa.Cache=Mt;var Ia=od((function(e,u){var t=(u=1==u.length&&Pa(u[0])?pu(u[0],Nu(Zd())):pu(dn(u,1),Nu(Zd()))).length;return Bn((function(n){for(var d=-1,r=at(n.length,t);++d=u})),Ca=gn(function(){return arguments}())?gn:function(e){return $a(e)&&Ie.call(e,"callee")&&!Ve.call(e,"callee")},Pa=n.isArray,Ta=Xe?Nu(Xe):function(e){return $a(e)&&pn(e)==E};function Ma(e){return null!=e&&za(e.length)&&!Da(e)}function Ra(e){return $a(e)&&Ma(e)}var La=ut||ro,Fa=eu?Nu(eu):function(e){return $a(e)&&pn(e)==l};function Ba(e){if(!$a(e))return!1;var u=pn(e);return u==s||"[object DOMException]"==u||"string"==typeof e.message&&"string"==typeof e.name&&!Ha(e)}function Da(e){if(!Wa(e))return!1;var u=pn(e);return u==p||u==m||"[object AsyncFunction]"==u||"[object Proxy]"==u}function Ua(e){return"number"==typeof e&&e==tc(e)}function za(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wa(e){var u=typeof e;return null!=e&&("object"==u||"function"==u)}function $a(e){return null!=e&&"object"==typeof e}var Ga=uu?Nu(uu):function(e){return $a(e)&&tr(e)==h};function qa(e){return"number"==typeof e||$a(e)&&pn(e)==v}function Ha(e){if(!$a(e)||pn(e)!=b)return!1;var u=qe(e);if(null===u)return!0;var t=Ie.call(u,"constructor")&&u.constructor;return"function"==typeof t&&t instanceof t&&Ee.call(t)==je}var Ka=tu?Nu(tu):function(e){return $a(e)&&pn(e)==y};var Va=nu?Nu(nu):function(e){return $a(e)&&tr(e)==g};function Ja(e){return"string"==typeof e||!Pa(e)&&$a(e)&&pn(e)==_}function Za(e){return"symbol"==typeof e||$a(e)&&pn(e)==x}var Qa=du?Nu(du):function(e){return $a(e)&&za(e.length)&&!!Ue[pn(e)]};var Ya=Md(An),Xa=Md((function(e,u){return e<=u}));function ec(e){if(!e)return[];if(Ma(e))return Ja(e)?Hu(e):bd(e);if(Ye&&e[Ye])return function(e){for(var u,t=[];!(u=e.next()).done;)t.push(u.value);return t}(e[Ye]());var u=tr(e);return(u==h?Uu:u==g?$u:jc)(e)}function uc(e){return e?(e=dc(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function tc(e){var u=uc(e),t=u%1;return u==u?t?u-t:u:0}function nc(e){return e?Vt(tc(e),0,4294967295):0}function dc(e){if("number"==typeof e)return e;if(Za(e))return NaN;if(Wa(e)){var u="function"==typeof e.valueOf?e.valueOf():e;e=Wa(u)?u+"":u}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(V,"");var t=re.test(e);return t||ce.test(e)?Ge(e.slice(2),t?2:8):de.test(e)?NaN:+e}function rc(e){return yd(e,_c(e))}function ac(e){return null==e?"":Qn(e)}var cc=_d((function(e,u){if(lr(u)||Ma(u))yd(u,gc(u),e);else for(var t in u)Ie.call(u,t)&&Wt(e,t,u[t])})),oc=_d((function(e,u){yd(u,_c(u),e)})),ic=_d((function(e,u,t,n){yd(u,_c(u),e,n)})),fc=_d((function(e,u,t,n){yd(u,gc(u),e,n)})),lc=Gd(Kt);var sc=Bn((function(e,u){e=he(e);var t=-1,n=u.length,d=n>2?u[2]:void 0;for(d&&cr(u[0],u[1],d)&&(n=1);++t1),u})),yd(e,Hd(e),t),n&&(t=Jt(t,7,Wd));for(var d=u.length;d--;)Xn(t,u[d]);return t}));var Ic=Gd((function(e,u){return null==e?{}:function(e,u){return Tn(e,u,(function(u,t){return hc(e,t)}))}(e,u)}));function Sc(e,u){if(null==e)return{};var t=pu(Hd(e),(function(e){return[e]}));return u=Zd(u),Tn(e,t,(function(e,t){return u(e,t[0])}))}var Ac=Bd(gc),kc=Bd(_c);function jc(e){return null==e?[]:Cu(e,gc(e))}var Oc=Id((function(e,u,t){return u=u.toLowerCase(),e+(t?Nc(u):u)}));function Nc(e){return Bc(ac(e).toLowerCase())}function Cc(e){return(e=ac(e))&&e.replace(ie,Lu).replace(Te,"")}var Pc=Id((function(e,u,t){return e+(t?"-":"")+u.toLowerCase()})),Tc=Id((function(e,u,t){return e+(t?" ":"")+u.toLowerCase()})),Mc=Ed("toLowerCase");var Rc=Id((function(e,u,t){return e+(t?"_":"")+u.toLowerCase()}));var Lc=Id((function(e,u,t){return e+(t?" ":"")+Bc(u)}));var Fc=Id((function(e,u,t){return e+(t?" ":"")+u.toUpperCase()})),Bc=Ed("toUpperCase");function Dc(e,u,t){return e=ac(e),void 0===(u=t?void 0:u)?function(e){return Fe.test(e)}(e)?function(e){return e.match(Re)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(u)||[]}var Uc=Bn((function(e,u){try{return ru(e,void 0,u)}catch(t){return Ba(t)?t:new se(t)}})),zc=Gd((function(e,u){return cu(u,(function(u){u=Sr(u),Ht(e,u,ba(e[u],e))})),e}));function Wc(e){return function(){return e}}var $c=kd(),Gc=kd(!0);function qc(e){return e}function Hc(e){return En("function"==typeof e?e:Jt(e,1))}var Kc=Bn((function(e,u){return function(t){return yn(t,e,u)}})),Vc=Bn((function(e,u){return function(t){return yn(e,t,u)}}));function Jc(e,u,t){var n=gc(u),d=fn(u,n);null!=t||Wa(u)&&(d.length||!n.length)||(t=u,u=e,e=this,d=fn(u,gc(u)));var r=!(Wa(t)&&"chain"in t&&!t.chain),a=Da(e);return cu(d,(function(t){var n=u[t];e[t]=n,a&&(e.prototype[t]=function(){var u=this.__chain__;if(r||u){var t=e(this.__wrapped__),d=t.__actions__=bd(this.__actions__);return d.push({func:n,args:arguments,thisArg:e}),t.__chain__=u,t}return n.apply(e,mu([this.value()],arguments))})})),e}function Zc(){}var Qc=Cd(pu),Yc=Cd(iu),Xc=Cd(bu);function eo(e){return or(e)?Su(Sr(e)):function(e){return function(u){return ln(u,e)}}(e)}var uo=Td(),to=Td(!0);function no(){return[]}function ro(){return!1}var ao=Nd((function(e,u){return e+u}),0),co=Ld("ceil"),oo=Nd((function(e,u){return e/u}),1),io=Ld("floor");var fo,lo=Nd((function(e,u){return e*u}),1),so=Ld("round"),po=Nd((function(e,u){return e-u}),0);return kt.after=function(e,u){if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){if(--e<1)return u.apply(this,arguments)}},kt.ary=ha,kt.assign=cc,kt.assignIn=oc,kt.assignInWith=ic,kt.assignWith=fc,kt.at=lc,kt.before=va,kt.bind=ba,kt.bindAll=zc,kt.bindKey=ya,kt.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Pa(e)?e:[e]},kt.chain=ea,kt.chunk=function(e,u,t){u=(t?cr(e,u,t):void 0===u)?1:rt(tc(u),0);var d=null==e?0:e.length;if(!d||u<1)return[];for(var r=0,a=0,c=n(Yu(d/u));rd?0:d+t),(n=void 0===n||n>d?d:tc(n))<0&&(n+=d),n=t>n?0:nc(n);t>>0)?(e=ac(e))&&("string"==typeof u||null!=u&&!Ka(u))&&!(u=Qn(u))&&Du(e)?id(Hu(e),0,t):e.split(u,t):[]},kt.spread=function(e,u){if("function"!=typeof e)throw new ye(r);return u=null==u?0:rt(tc(u),0),Bn((function(t){var n=t[u],d=id(t,0,u);return n&&mu(d,n),ru(e,this,d)}))},kt.tail=function(e){var u=null==e?0:e.length;return u?qn(e,1,u):[]},kt.take=function(e,u,t){return e&&e.length?qn(e,0,(u=t||void 0===u?1:tc(u))<0?0:u):[]},kt.takeRight=function(e,u,t){var n=null==e?0:e.length;return n?qn(e,(u=n-(u=t||void 0===u?1:tc(u)))<0?0:u,n):[]},kt.takeRightWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3),!1,!0):[]},kt.takeWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3)):[]},kt.tap=function(e,u){return u(e),e},kt.throttle=function(e,u,t){var n=!0,d=!0;if("function"!=typeof e)throw new ye(r);return Wa(t)&&(n="leading"in t?!!t.leading:n,d="trailing"in t?!!t.trailing:d),ga(e,u,{leading:n,maxWait:u,trailing:d})},kt.thru=ua,kt.toArray=ec,kt.toPairs=Ac,kt.toPairsIn=kc,kt.toPath=function(e){return Pa(e)?pu(e,Sr):Za(e)?[e]:bd(Ir(ac(e)))},kt.toPlainObject=rc,kt.transform=function(e,u,t){var n=Pa(e),d=n||La(e)||Qa(e);if(u=Zd(u,4),null==t){var r=e&&e.constructor;t=d?n?new r:[]:Wa(e)&&Da(r)?jt(qe(e)):{}}return(d?cu:cn)(e,(function(e,n,d){return u(t,e,n,d)})),t},kt.unary=function(e){return ha(e,1)},kt.union=$r,kt.unionBy=Gr,kt.unionWith=qr,kt.uniq=function(e){return e&&e.length?Yn(e):[]},kt.uniqBy=function(e,u){return e&&e.length?Yn(e,Zd(u,2)):[]},kt.uniqWith=function(e,u){return u="function"==typeof u?u:void 0,e&&e.length?Yn(e,void 0,u):[]},kt.unset=function(e,u){return null==e||Xn(e,u)},kt.unzip=Hr,kt.unzipWith=Kr,kt.update=function(e,u,t){return null==e?e:ed(e,u,ad(t))},kt.updateWith=function(e,u,t,n){return n="function"==typeof n?n:void 0,null==e?e:ed(e,u,ad(t),n)},kt.values=jc,kt.valuesIn=function(e){return null==e?[]:Cu(e,_c(e))},kt.without=Vr,kt.words=Dc,kt.wrap=function(e,u){return Sa(ad(u),e)},kt.xor=Jr,kt.xorBy=Zr,kt.xorWith=Qr,kt.zip=Yr,kt.zipObject=function(e,u){return dd(e||[],u||[],Wt)},kt.zipObjectDeep=function(e,u){return dd(e||[],u||[],zn)},kt.zipWith=Xr,kt.entries=Ac,kt.entriesIn=kc,kt.extend=oc,kt.extendWith=ic,Jc(kt,kt),kt.add=ao,kt.attempt=Uc,kt.camelCase=Oc,kt.capitalize=Nc,kt.ceil=co,kt.clamp=function(e,u,t){return void 0===t&&(t=u,u=void 0),void 0!==t&&(t=(t=dc(t))==t?t:0),void 0!==u&&(u=(u=dc(u))==u?u:0),Vt(dc(e),u,t)},kt.clone=function(e){return Jt(e,4)},kt.cloneDeep=function(e){return Jt(e,5)},kt.cloneDeepWith=function(e,u){return Jt(e,5,u="function"==typeof u?u:void 0)},kt.cloneWith=function(e,u){return Jt(e,4,u="function"==typeof u?u:void 0)},kt.conformsTo=function(e,u){return null==u||Zt(e,u,gc(u))},kt.deburr=Cc,kt.defaultTo=function(e,u){return null==e||e!=e?u:e},kt.divide=oo,kt.endsWith=function(e,u,t){e=ac(e),u=Qn(u);var n=e.length,d=t=void 0===t?n:Vt(tc(t),0,n);return(t-=u.length)>=0&&e.slice(t,d)==u},kt.eq=ja,kt.escape=function(e){return(e=ac(e))&&D.test(e)?e.replace(F,Fu):e},kt.escapeRegExp=function(e){return(e=ac(e))&&K.test(e)?e.replace(H,"\\$&"):e},kt.every=function(e,u,t){var n=Pa(e)?iu:un;return t&&cr(e,u,t)&&(u=void 0),n(e,Zd(u,3))},kt.find=da,kt.findIndex=Cr,kt.findKey=function(e,u){return gu(e,Zd(u,3),cn)},kt.findLast=ra,kt.findLastIndex=Pr,kt.findLastKey=function(e,u){return gu(e,Zd(u,3),on)},kt.floor=io,kt.forEach=aa,kt.forEachRight=ca,kt.forIn=function(e,u){return null==e?e:rn(e,Zd(u,3),_c)},kt.forInRight=function(e,u){return null==e?e:an(e,Zd(u,3),_c)},kt.forOwn=function(e,u){return e&&cn(e,Zd(u,3))},kt.forOwnRight=function(e,u){return e&&on(e,Zd(u,3))},kt.get=mc,kt.gt=Oa,kt.gte=Na,kt.has=function(e,u){return null!=e&&nr(e,u,hn)},kt.hasIn=hc,kt.head=Mr,kt.identity=qc,kt.includes=function(e,u,t,n){e=Ma(e)?e:jc(e),t=t&&!n?tc(t):0;var d=e.length;return t<0&&(t=rt(d+t,0)),Ja(e)?t<=d&&e.indexOf(u,t)>-1:!!d&&xu(e,u,t)>-1},kt.indexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=null==t?0:tc(t);return d<0&&(d=rt(n+d,0)),xu(e,u,d)},kt.inRange=function(e,u,t){return u=uc(u),void 0===t?(t=u,u=0):t=uc(t),function(e,u,t){return e>=at(u,t)&&e=-9007199254740991&&e<=9007199254740991},kt.isSet=Va,kt.isString=Ja,kt.isSymbol=Za,kt.isTypedArray=Qa,kt.isUndefined=function(e){return void 0===e},kt.isWeakMap=function(e){return $a(e)&&tr(e)==w},kt.isWeakSet=function(e){return $a(e)&&"[object WeakSet]"==pn(e)},kt.join=function(e,u){return null==e?"":nt.call(e,u)},kt.kebabCase=Pc,kt.last=Br,kt.lastIndexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=n;return void 0!==t&&(d=(d=tc(t))<0?rt(n+d,0):at(d,n-1)),u==u?function(e,u,t){for(var n=t+1;n--;)if(e[n]===u)return n;return n}(e,u,d):_u(e,Eu,d,!0)},kt.lowerCase=Tc,kt.lowerFirst=Mc,kt.lt=Ya,kt.lte=Xa,kt.max=function(e){return e&&e.length?tn(e,qc,mn):void 0},kt.maxBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),mn):void 0},kt.mean=function(e){return Iu(e,qc)},kt.meanBy=function(e,u){return Iu(e,Zd(u,2))},kt.min=function(e){return e&&e.length?tn(e,qc,An):void 0},kt.minBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),An):void 0},kt.stubArray=no,kt.stubFalse=ro,kt.stubObject=function(){return{}},kt.stubString=function(){return""},kt.stubTrue=function(){return!0},kt.multiply=lo,kt.nth=function(e,u){return e&&e.length?Cn(e,tc(u)):void 0},kt.noConflict=function(){return Ke._===this&&(Ke._=Oe),this},kt.noop=Zc,kt.now=ma,kt.pad=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;if(!u||n>=u)return e;var d=(u-n)/2;return Pd(Xu(d),t)+e+Pd(Yu(d),t)},kt.padEnd=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;return u&&nu){var n=e;e=u,u=n}if(t||e%1||u%1){var d=it();return at(e+d*(u-e+$e("1e-"+((d+"").length-1))),u)}return Ln(e,u)},kt.reduce=function(e,u,t){var n=Pa(e)?hu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,Xt)},kt.reduceRight=function(e,u,t){var n=Pa(e)?vu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,en)},kt.repeat=function(e,u,t){return u=(t?cr(e,u,t):void 0===u)?1:tc(u),Fn(ac(e),u)},kt.replace=function(){var e=arguments,u=ac(e[0]);return e.length<3?u:u.replace(e[1],e[2])},kt.result=function(e,u,t){var n=-1,d=(u=cd(u,e)).length;for(d||(d=1,e=void 0);++n9007199254740991)return[];var t=4294967295,n=at(e,4294967295);e-=4294967295;for(var d=Ou(n,u=Zd(u));++t=r)return e;var c=t-qu(n);if(c<1)return n;var o=a?id(a,0,c).join(""):e.slice(0,c);if(void 0===d)return o+n;if(a&&(c+=o.length-c),Ka(d)){if(e.slice(c).search(d)){var i,f=o;for(d.global||(d=ve(d.source,ac(ne.exec(d))+"g")),d.lastIndex=0;i=d.exec(f);)var l=i.index;o=o.slice(0,void 0===l?c:l)}}else if(e.indexOf(Qn(d),c)!=c){var s=o.lastIndexOf(d);s>-1&&(o=o.slice(0,s))}return o+n},kt.unescape=function(e){return(e=ac(e))&&B.test(e)?e.replace(L,Ku):e},kt.uniqueId=function(e){var u=++Se;return ac(e)+u},kt.upperCase=Fc,kt.upperFirst=Bc,kt.each=aa,kt.eachRight=ca,kt.first=Mr,Jc(kt,(fo={},cn(kt,(function(e,u){Ie.call(kt.prototype,u)||(fo[u]=e)})),fo),{chain:!1}),kt.VERSION="4.17.15",cu(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){kt[e].placeholder=kt})),cu(["drop","take"],(function(e,u){Ct.prototype[e]=function(t){t=void 0===t?1:rt(tc(t),0);var n=this.__filtered__&&!u?new Ct(this):this.clone();return n.__filtered__?n.__takeCount__=at(t,n.__takeCount__):n.__views__.push({size:at(t,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},Ct.prototype[e+"Right"]=function(u){return this.reverse()[e](u).reverse()}})),cu(["filter","map","takeWhile"],(function(e,u){var t=u+1,n=1==t||3==t;Ct.prototype[e]=function(e){var u=this.clone();return u.__iteratees__.push({iteratee:Zd(e,3),type:t}),u.__filtered__=u.__filtered__||n,u}})),cu(["head","last"],(function(e,u){var t="take"+(u?"Right":"");Ct.prototype[e]=function(){return this[t](1).value()[0]}})),cu(["initial","tail"],(function(e,u){var t="drop"+(u?"":"Right");Ct.prototype[e]=function(){return this.__filtered__?new Ct(this):this[t](1)}})),Ct.prototype.compact=function(){return this.filter(qc)},Ct.prototype.find=function(e){return this.filter(e).head()},Ct.prototype.findLast=function(e){return this.reverse().find(e)},Ct.prototype.invokeMap=Bn((function(e,u){return"function"==typeof e?new Ct(this):this.map((function(t){return yn(t,e,u)}))})),Ct.prototype.reject=function(e){return this.filter(Ea(Zd(e)))},Ct.prototype.slice=function(e,u){e=tc(e);var t=this;return t.__filtered__&&(e>0||u<0)?new Ct(t):(e<0?t=t.takeRight(-e):e&&(t=t.drop(e)),void 0!==u&&(t=(u=tc(u))<0?t.dropRight(-u):t.take(u-e)),t)},Ct.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Ct.prototype.toArray=function(){return this.take(4294967295)},cn(Ct.prototype,(function(e,u){var t=/^(?:filter|find|map|reject)|While$/.test(u),n=/^(?:head|last)$/.test(u),d=kt[n?"take"+("last"==u?"Right":""):u],r=n||/^find/.test(u);d&&(kt.prototype[u]=function(){var u=this.__wrapped__,a=n?[1]:arguments,c=u instanceof Ct,o=a[0],i=c||Pa(u),f=function(e){var u=d.apply(kt,mu([e],a));return n&&l?u[0]:u};i&&t&&"function"==typeof o&&1!=o.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){u=m?u:new Ct(this);var h=e.apply(u,a);return h.__actions__.push({func:ua,args:[f],thisArg:void 0}),new Nt(h,l)}return p&&m?e.apply(this,a):(h=this.thru(f),p?n?h.value()[0]:h.value():h)})})),cu(["pop","push","shift","sort","splice","unshift"],(function(e){var u=ge[e],t=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);kt.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var d=this.value();return u.apply(Pa(d)?d:[],e)}return this[t]((function(t){return u.apply(Pa(t)?t:[],e)}))}})),cn(Ct.prototype,(function(e,u){var t=kt[u];if(t){var n=t.name+"";Ie.call(yt,n)||(yt[n]=[]),yt[n].push({name:u,func:t})}})),yt[jd(void 0,2).name]=[{name:"wrapper",func:void 0}],Ct.prototype.clone=function(){var e=new Ct(this.__wrapped__);return e.__actions__=bd(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=bd(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=bd(this.__views__),e},Ct.prototype.reverse=function(){if(this.__filtered__){var e=new Ct(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Ct.prototype.value=function(){var e=this.__wrapped__.value(),u=this.__dir__,t=Pa(e),n=u<0,d=t?e.length:0,r=function(e,u,t){var n=-1,d=t.length;for(;++n=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},kt.prototype.plant=function(e){for(var u,t=this;t instanceof Ot;){var n=kr(t);n.__index__=0,n.__values__=void 0,u?d.__wrapped__=n:u=n;var d=n;t=t.__wrapped__}return d.__wrapped__=e,u},kt.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Ct){var u=e;return this.__actions__.length&&(u=new Ct(this)),(u=u.reverse()).__actions__.push({func:ua,args:[Wr],thisArg:void 0}),new Nt(u,this.__chain__)}return this.thru(Wr)},kt.prototype.toJSON=kt.prototype.valueOf=kt.prototype.value=function(){return td(this.__wrapped__,this.__actions__)},kt.prototype.first=kt.prototype.head,Ye&&(kt.prototype[Ye]=function(){return this}),kt}();Ke._=Vu,void 0===(d=function(){return Vu}.call(u,t,u,n))||(n.exports=d)}).call(this)}).call(this,t(76),t(456)(e))},454:function(e,u,t){"use strict";var n=t(0),d=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});u.a=d},456:function(e,u){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},469:function(e,u,t){"use strict";var n=SyntaxError,d=Function,r=TypeError,a=function(e){try{return d('"use strict"; return ('+e+").constructor;")()}catch(u){}},c=Object.getOwnPropertyDescriptor;if(c)try{c({},"")}catch(k){c=null}var o=function(){throw new r},i=c?function(){try{return o}catch(e){try{return c(arguments,"callee").get}catch(u){return o}}}():o,f=t(507)(),l=Object.getPrototypeOf||function(e){return e.__proto__},s={},p="undefined"==typeof Uint8Array?void 0:l(Uint8Array),m={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?l([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":s,"%AsyncGenerator%":s,"%AsyncGeneratorFunction%":s,"%AsyncIteratorPrototype%":s,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":d,"%GeneratorFunction%":s,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?l(l([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?l((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?l((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?l(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":i,"%TypedArray%":p,"%TypeError%":r,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},v=t(470),b=t(510),y=v.call(Function.call,Array.prototype.concat),g=v.call(Function.apply,Array.prototype.splice),_=v.call(Function.call,String.prototype.replace),x=v.call(Function.call,String.prototype.slice),w=v.call(Function.call,RegExp.prototype.exec),E=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,I=/\\(\\)?/g,S=function(e){var u=x(e,0,1),t=x(e,-1);if("%"===u&&"%"!==t)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===t&&"%"!==u)throw new n("invalid intrinsic syntax, expected opening `%`");var d=[];return _(e,E,(function(e,u,t,n){d[d.length]=t?_(n,I,"$1"):u||e})),d},A=function(e,u){var t,d=e;if(b(h,d)&&(d="%"+(t=h[d])[0]+"%"),b(m,d)){var c=m[d];if(c===s&&(c=function e(u){var t;if("%AsyncFunction%"===u)t=a("async function () {}");else if("%GeneratorFunction%"===u)t=a("function* () {}");else if("%AsyncGeneratorFunction%"===u)t=a("async function* () {}");else if("%AsyncGenerator%"===u){var n=e("%AsyncGeneratorFunction%");n&&(t=n.prototype)}else if("%AsyncIteratorPrototype%"===u){var d=e("%AsyncGenerator%");d&&(t=l(d.prototype))}return m[u]=t,t}(d)),void 0===c&&!u)throw new r("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:t,name:d,value:c}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,u){if("string"!=typeof e||0===e.length)throw new r("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof u)throw new r('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var t=S(e),d=t.length>0?t[0]:"",a=A("%"+d+"%",u),o=a.name,i=a.value,f=!1,l=a.alias;l&&(d=l[0],g(t,y([0,1],l)));for(var s=1,p=!0;s=t.length){var E=c(i,h);i=(p=!!E)&&"get"in E&&!("originalValue"in E.get)?E.get:i[h]}else p=b(i,h),i=i[h];p&&!f&&(m[o]=i)}}return i}},470:function(e,u,t){"use strict";var n=t(509);e.exports=Function.prototype.bind||n},471:function(e,u,t){"use strict";var n=String.prototype.replace,d=/%20/g,r="RFC1738",a="RFC3986";e.exports={default:a,formatters:{RFC1738:function(e){return n.call(e,d,"+")},RFC3986:function(e){return String(e)}},RFC1738:r,RFC3986:a}},478:function(e,u,t){"use strict";var n=t(471),d=Object.prototype.hasOwnProperty,r=Array.isArray,a=function(){for(var e=[],u=0;u<256;++u)e.push("%"+((u<16?"0":"")+u.toString(16)).toUpperCase());return e}(),c=function(e,u){for(var t=u&&u.plainObjects?Object.create(null):{},n=0;n1;){var u=e.pop(),t=u.obj[u.prop];if(r(t)){for(var n=[],d=0;d=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||r===n.RFC1738&&(40===f||41===f)?o+=c.charAt(i):f<128?o+=a[f]:f<2048?o+=a[192|f>>6]+a[128|63&f]:f<55296||f>=57344?o+=a[224|f>>12]+a[128|f>>6&63]+a[128|63&f]:(i+=1,f=65536+((1023&f)<<10|1023&c.charCodeAt(i)),o+=a[240|f>>18]+a[128|f>>12&63]+a[128|f>>6&63]+a[128|63&f])}return o},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,u){if(r(e)){for(var t=[],n=0;n{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=n(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=d,e.exports.default=d},486:function(e,u){e.exports=Object.is||function(e,u){return e===u?0!==e||1/e==1/u:e!=e&&u!=u}},489:function(e,u,t){"use strict";var n=t(30),d=t(12),r=t(27),a=t(91),c=t(92),o=t(26),i=t(545),f=t(93);d(d.S+d.F*!t(83)((function(e){Array.from(e)})),"Array",{from:function(e){var u,t,d,l,s=r(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,v=void 0!==h,b=0,y=f(s);if(v&&(h=n(h,m>2?arguments[2]:void 0,2)),null==y||p==Array&&c(y))for(t=new p(u=o(s.length));u>b;b++)i(t,b,v?h(s[b],b):s[b]);else for(l=y.call(s),t=new p;!(d=l.next()).done;b++)i(t,b,v?a(l,h,[d.value,b],!0):d.value);return t.length=b,t}})},490:function(e,u,t){"use strict";var n=t(546),d=t(492);e.exports=t(547)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return n.def(d(this,"Set"),e=0===e?0:e,e)}},n)},491:function(e,u,t){var n=t(40)("meta"),d=t(13),r=t(31),a=t(28).f,c=0,o=Object.isExtensible||function(){return!0},i=!t(14)((function(){return o(Object.preventExtensions({}))})),f=function(e){a(e,n,{value:{i:"O"+ ++c,w:{}}})},l=e.exports={KEY:n,NEED:!1,fastKey:function(e,u){if(!d(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!r(e,n)){if(!o(e))return"F";if(!u)return"E";f(e)}return e[n].i},getWeak:function(e,u){if(!r(e,n)){if(!o(e))return!0;if(!u)return!1;f(e)}return e[n].w},onFreeze:function(e){return i&&l.NEED&&o(e)&&!r(e,n)&&f(e),e}}},492:function(e,u,t){var n=t(13);e.exports=function(e,u){if(!n(e)||e._t!==u)throw TypeError("Incompatible receiver, "+u+" required!");return e}},493:function(e,u,t){"use strict";const n=t(494);e.exports=(e,u)=>{if("string"!=typeof e)throw new TypeError("Expected a string");u=void 0===u?"_":u;const t=n("([\\p{Ll}\\d])(\\p{Lu})","g"),d=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(t,`$1${u}$2`).replace(d,`$1${u}$2`).toLowerCase()}},494:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n=l(t(495)),d=l(t(496)),r=l(t(497)),a=l(t(498)),c=l(t(499)),o=l(t(500)),i=l(t(501)),f=l(t(502));function l(e){return e&&e.__esModule?e:{default:e}}(0,d.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,o.default)(n.default),(0,i.default)(n.default),(0,f.default)(n.default),u.default=n.default,e.exports=u.default},495:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n={astral:!1},d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},o=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},f=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===d.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var u=!0;try{new RegExp("",e)}catch(t){u=!1}return u}var h=m("u"),v=m("y"),b={g:!0,i:!0,m:!0,u:h,y:v};function y(e,u,t,n,d){var r=void 0;if(e.xregexp={captureNames:u},d)return e;if(e.__proto__)e.__proto__=C.prototype;else for(r in C.prototype)e[r]=C.prototype[r];return e.xregexp.source=t,e.xregexp.flags=n?n.split("").sort().join(""):n,e}function g(e){return d.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,u){if(!C.isRegExp(e))throw new TypeError("Type RegExp expected");var t=e.xregexp||{},n=function(e){return s?e.flags:d.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),r="",a="",c=null,o=null;return(u=u||{}).removeG&&(a+="g"),u.removeY&&(a+="y"),a&&(n=d.replace.call(n,new RegExp("["+a+"]+","g"),"")),u.addG&&(r+="g"),u.addY&&(r+="y"),r&&(n=g(n+r)),u.isInternalOnly||(void 0!==t.source&&(c=t.source),null!=t.flags&&(o=r?g(t.flags+r):t.flags)),e=y(new RegExp(u.source||e.source,n),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?t.captureNames.slice(0):null,c,o,u.isInternalOnly)}function x(e){return parseInt(e,16)}function w(e,u,t){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,u,t){return d.test.call(-1!==t.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(u))}(e.input,e.index+e[0].length,t)?"":"(?:)"}function E(e){return parseInt(e,10).toString(16)}function I(e,u){return p.call(e)==="[object "+u+"]"}function S(e){for(;e.length<4;)e="0"+e;return e}function A(e){var u={};return I(e,"String")?(C.forEach(e,/[^\s,]+/,(function(e){u[e]=!0})),u):e}function k(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");b[e]=!0}function j(e,u,t,n,d){for(var r=o.length,a=e[t],c=null,i=void 0,f=void 0;r--;)if(!((f=o[r]).leadChar&&f.leadChar!==a||f.scope!==n&&"all"!==f.scope||f.flag&&-1===u.indexOf(f.flag))&&(i=C.exec(e,f.regex,t,"sticky"))){c={matchLength:i[0].length,output:f.handler.call(d,i,n,u),reparse:f.reparse};break}return c}function O(e){n.astral=e}function N(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function C(e,u){if(C.isRegExp(e)){if(void 0!==u)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),u=void 0===u?"":String(u),C.isInstalled("astral")&&-1===u.indexOf("A")&&(u+="A"),c[e]||(c[e]={}),!c[e][u]){for(var t={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,o=void 0,f=function(e,u){var t=void 0;if(g(u)!==u)throw new SyntaxError("Invalid duplicate regex flag "+u);for(e=d.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,t){if(d.test.call(/[gy]/,t))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return u=g(u+t),""})),t=0;t"}else if(t)return"\\"+(+t+a);return e}if(!I(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,f=[],l=void 0,s=0;s1&&-1!==t.indexOf("")){var n=_(this,{removeG:!0,isInternalOnly:!0});d.replace.call(String(e).slice(t.index),n,(function(){for(var e=arguments.length,u=Array(e),n=0;nt.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=u),t},r.test=function(e){return!!r.exec.call(this,e)},r.match=function(e){if(C.isRegExp(e)){if(e.global){var u=d.match.apply(this,arguments);return e.lastIndex=0,u}}else e=new RegExp(e);return r.exec.call(e,N(this))},r.replace=function(e,u){var t=C.isRegExp(e),n=void 0,r=void 0,a=void 0;return t?(e.xregexp&&(r=e.xregexp.captureNames),n=e.lastIndex):e+="",a=I(u,"Function")?d.replace.call(String(this),e,(function(){for(var n=arguments.length,d=Array(n),a=0;at.length-3)throw new SyntaxError("Backreference to undefined group "+e);return t[d]||""}throw new SyntaxError("Invalid token "+e)}})),t&&(e.global?e.lastIndex=0:e.lastIndex=n),a},r.split=function(e,u){if(!C.isRegExp(e))return d.split.apply(this,arguments);var t=String(this),n=[],r=e.lastIndex,a=0,c=void 0;return u=(void 0===u?-1:u)>>>0,C.forEach(t,e,(function(e){e.index+e[0].length>a&&(n.push(t.slice(a,e.index)),e.length>1&&e.indexu?n.slice(0,u):n},C.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,u){if("B"===e[1]&&"default"===u)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),C.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,u,t){var n=x(e[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(n<=65535)return"\\u"+S(E(n));if(h&&-1!==t.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),C.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),C.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),C.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),C.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),C.addToken(/\\k<([\w$]+)>/,(function(e){var u=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],t=e.index+e[0].length;if(!u||u>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+u+(t===e.input.length||isNaN(e.input[t])?"":"(?:)")}),{leadChar:"\\"}),C.addToken(/\\(\d+)/,(function(e,u){if(!("default"===u&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),C.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),C.addToken(/\((?!\?)/,(function(e,u,t){return-1!==t.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),u.default=C,e.exports=u.default},496:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,t=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,u],"g",{conjunction:"or"});function n(e){var u=/^(?:\(\?:\))*\^/,t=/\$(?:\(\?:\))*$/;return u.test(e)&&t.test(e)&&t.test(e.replace(/\\[\s\S]/g,""))?e.replace(u,"").replace(t,""):e}function d(u,t){var n=t?"x":"";return e.isRegExp(u)?u.xregexp&&u.xregexp.captureNames?u:e(u.source,n):e(u,n)}function r(u){return u instanceof RegExp?u:e.escape(u)}function a(e,u,t){return e["subpattern"+t]=u,e}function c(e,u,t){return e+(u1?n-1:0),o=1;o"):o="(?:",h=m,""+o+f[a].pattern.replace(u,(function(e,u,t){if(u){if(c=f[a].names[m-h],++m,c)return"(?<"+c+">"}else if(t)return i=+t-1,f[a].names[i]?"\\k<"+f[a].names[i]+">":"\\"+(+t+h);return e}))+")"}if(d){if(c=y[v],b[++v]=++m,c)return"(?<"+c+">"}else if(r)return y[i=+r-1]?"\\k<"+y[i]+">":"\\"+b[+r];return e}));return e(g,c)}},e.exports=u.default},497:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){function u(e,u,t,n){return{name:e,value:u,start:t,end:n}}e.matchRecursive=function(t,n,d,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),o=-1!==r.indexOf("y"),i=r.replace(/y/g,""),f=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,v=0,b=void 0,y=void 0,g=void 0,_=void 0,x=void 0;if(n=e(n,i),d=e(d,i),f){if(f.length>1)throw new Error("Cannot use more than one escape character");f=e.escape(f),x=new RegExp("(?:"+f+"[\\S\\s]|(?:(?!"+e.union([n,d],"",{conjunction:"or"}).source+")[^"+f+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(f&&(h+=(e.exec(t,x,h,"sticky")||[""])[0].length),g=e.exec(t,n,h),_=e.exec(t,d,h),g&&_&&(g.index<=_.index?_=null:g=null),g||_)h=(m=(g||_).index)+(g||_)[0].length;else if(!p)break;if(o&&!p&&m>v)break;if(g)p||(b=m,y=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&b>v&&s.push(u(l[0],t.slice(v,b),v,b)),l[1]&&s.push(u(l[1],t.slice(b,y),b,y)),l[2]&&s.push(u(l[2],t.slice(y,m),y,m)),l[3]&&s.push(u(l[3],t.slice(m,h),m,h))):s.push(t.slice(y,m)),v=h,!c))break}m===h&&++h}return c&&!o&&l&&l[0]&&t.length>v&&s.push(u(l[0],t.slice(v),v,t.length)),s}},e.exports=u.default},498:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u={},t=e._dec,n=e._hex,d=e._pad4;function r(e){return e.replace(/[- _]+/g,"").toLowerCase()}function a(e){var u=/^\\[xu](.+)/.exec(e);return u?t(u[1]):e.charCodeAt("\\"===e[0]?1:0)}function c(t){var r,c,o;return u[t]["b!"]||(u[t]["b!"]=(r=u[t].bmp,c="",o=-1,e.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var u=a(e[1]);u>o+1&&(c+="\\u"+d(n(o+1)),u>o+2&&(c+="-\\u"+d(n(u-1)))),o=a(e[2]||e[1])})),o<65535&&(c+="\\u"+d(n(o+1)),o<65534&&(c+="-\\uFFFF")),c))}function o(e,t){var n=t?"a!":"a=";return u[e][n]||(u[e][n]=function(e,t){var n=u[e],d="";return n.bmp&&!n.isBmpLast&&(d="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(d+=n.astral),n.isBmpLast&&n.bmp&&(d+=(n.astral?"|":"")+"["+n.bmp+"]"),t?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+d+")"}(e,t))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,t,n){var d="P"===e[1]||!!e[2],a=-1!==n.indexOf("A"),i=r(e[4]||e[3]),f=u[i];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!u.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+e[0]);if(f.inverseOf){if(i=r(f.inverseOf),!u.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+f.inverseOf);f=u[i],d=!d}if(!f.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(a){if("class"===t)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return o(i,d)}return"class"===t?d?c(i):f.bmp:(d?"[^":"[")+f.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(t){for(var n=void 0,d=0;d\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=u.default},501:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var u=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];u.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(u)},e.exports=u.default},502:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=u.default},503:function(e,u,t){"use strict";var n=t(0),d=t.n(n);u.a=function(e){var u=e.text;return d.a.createElement("section",{className:"empty"},d.a.createElement("div",{className:"icon"},d.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),d.a.createElement("div",{className:"text"},u))}},504:function(e,u,t){"use strict";var n=t(505),d=t(515),r=t(471);e.exports={formats:r,parse:d,stringify:n}},505:function(e,u,t){"use strict";var n=t(506),d=t(478),r=t(471),a=Object.prototype.hasOwnProperty,c={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,u){return e+"["+u+"]"},repeat:function(e){return e}},o=Array.isArray,i=String.prototype.split,f=Array.prototype.push,l=function(e,u){f.apply(e,o(u)?u:[u])},s=Date.prototype.toISOString,p=r.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:d.encode,encodeValuesOnly:!1,format:p,formatter:r.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},v=function e(u,t,r,a,c,f,s,p,v,b,y,g,_,x,w,E){for(var I,S=u,A=E,k=0,j=!1;void 0!==(A=A.get(h))&&!j;){var O=A.get(u);if(k+=1,void 0!==O){if(O===k)throw new RangeError("Cyclic object value");j=!0}void 0===A.get(h)&&(k=0)}if("function"==typeof p?S=p(t,S):S instanceof Date?S=y(S):"comma"===r&&o(S)&&(S=d.maybeMap(S,(function(e){return e instanceof Date?y(e):e}))),null===S){if(c)return s&&!x?s(t,m.encoder,w,"key",g):t;S=""}if("string"==typeof(I=S)||"number"==typeof I||"boolean"==typeof I||"symbol"==typeof I||"bigint"==typeof I||d.isBuffer(S)){if(s){var N=x?t:s(t,m.encoder,w,"key",g);if("comma"===r&&x){for(var C=i.call(String(S),","),P="",T=0;T0?S.join(",")||null:void 0}];else if(o(p))M=p;else{var L=Object.keys(S);M=v?L.sort(v):L}for(var F=a&&o(S)&&1===S.length?t+"[]":t,B=0;B0?x+_:""}},506:function(e,u,t){"use strict";var n=t(469),d=t(511),r=t(513),a=n("%TypeError%"),c=n("%WeakMap%",!0),o=n("%Map%",!0),i=d("WeakMap.prototype.get",!0),f=d("WeakMap.prototype.set",!0),l=d("WeakMap.prototype.has",!0),s=d("Map.prototype.get",!0),p=d("Map.prototype.set",!0),m=d("Map.prototype.has",!0),h=function(e,u){for(var t,n=e;null!==(t=n.next);n=t)if(t.key===u)return n.next=t.next,t.next=e.next,e.next=t,t};e.exports=function(){var e,u,t,n={assert:function(e){if(!n.has(e))throw new a("Side channel does not contain "+r(e))},get:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return i(e,n)}else if(o){if(u)return s(u,n)}else if(t)return function(e,u){var t=h(e,u);return t&&t.value}(t,n)},has:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return l(e,n)}else if(o){if(u)return m(u,n)}else if(t)return function(e,u){return!!h(e,u)}(t,n);return!1},set:function(n,d){c&&n&&("object"==typeof n||"function"==typeof n)?(e||(e=new c),f(e,n,d)):o?(u||(u=new o),p(u,n,d)):(t||(t={key:{},next:null}),function(e,u,t){var n=h(e,u);n?n.value=t:e.next={key:u,next:e.next,value:t}}(t,n,d))}};return n}},507:function(e,u,t){"use strict";var n="undefined"!=typeof Symbol&&Symbol,d=t(508);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&d())))}},508:function(e,u,t){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},u=Symbol("test"),t=Object(u);if("string"==typeof u)return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;for(u in e[u]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==u)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,u))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var d=Object.getOwnPropertyDescriptor(e,u);if(42!==d.value||!0!==d.enumerable)return!1}return!0}},509:function(e,u,t){"use strict";var n="Function.prototype.bind called on incompatible ",d=Array.prototype.slice,r=Object.prototype.toString;e.exports=function(e){var u=this;if("function"!=typeof u||"[object Function]"!==r.call(u))throw new TypeError(n+u);for(var t,a=d.call(arguments,1),c=function(){if(this instanceof t){var n=u.apply(this,a.concat(d.call(arguments)));return Object(n)===n?n:this}return u.apply(e,a.concat(d.call(arguments)))},o=Math.max(0,u.length-a.length),i=[],f=0;f-1?d(t):t}},512:function(e,u,t){"use strict";var n=t(470),d=t(469),r=d("%Function.prototype.apply%"),a=d("%Function.prototype.call%"),c=d("%Reflect.apply%",!0)||n.call(a,r),o=d("%Object.getOwnPropertyDescriptor%",!0),i=d("%Object.defineProperty%",!0),f=d("%Math.max%");if(i)try{i({},"a",{value:1})}catch(s){i=null}e.exports=function(e){var u=c(n,a,arguments);if(o&&i){var t=o(u,"length");t.configurable&&i(u,"length",{value:1+f(0,e.length-(arguments.length-1))})}return u};var l=function(){return c(n,r,arguments)};i?i(e.exports,"apply",{value:l}):e.exports.apply=l},513:function(e,u,t){var n="function"==typeof Map&&Map.prototype,d=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,r=n&&d&&"function"==typeof d.get?d.get:null,a=n&&Map.prototype.forEach,c="function"==typeof Set&&Set.prototype,o=Object.getOwnPropertyDescriptor&&c?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,i=c&&o&&"function"==typeof o.get?o.get:null,f=c&&Set.prototype.forEach,l="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,v=Function.prototype.toString,b=String.prototype.match,y=String.prototype.slice,g=String.prototype.replace,_=String.prototype.toUpperCase,x=String.prototype.toLowerCase,w=RegExp.prototype.test,E=Array.prototype.concat,I=Array.prototype.join,S=Array.prototype.slice,A=Math.floor,k="function"==typeof BigInt?BigInt.prototype.valueOf:null,j=Object.getOwnPropertySymbols,O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,P=Object.prototype.propertyIsEnumerable,T=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function M(e,u){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,u))return u;var t=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var n=e<0?-A(-e):A(e);if(n!==e){var d=String(n),r=y.call(u,d.length+1);return g.call(d,t,"$&_")+"."+g.call(g.call(r,/([0-9]{3})/g,"$&_"),/_$/,"")}}return g.call(u,t,"$&_")}var R=t(514),L=R.custom,F=W(L)?L:null;function B(e,u,t){var n="double"===(t.quoteStyle||u)?'"':"'";return n+e+n}function D(e){return g.call(String(e),/"/g,""")}function U(e){return!("[object Array]"!==q(e)||C&&"object"==typeof e&&C in e)}function z(e){return!("[object RegExp]"!==q(e)||C&&"object"==typeof e&&C in e)}function W(e){if(N)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!O)return!1;try{return O.call(e),!0}catch(u){}return!1}e.exports=function e(u,t,n,d){var c=t||{};if(G(c,"quoteStyle")&&"single"!==c.quoteStyle&&"double"!==c.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(G(c,"maxStringLength")&&("number"==typeof c.maxStringLength?c.maxStringLength<0&&c.maxStringLength!==1/0:null!==c.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var o=!G(c,"customInspect")||c.customInspect;if("boolean"!=typeof o&&"symbol"!==o)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(G(c,"indent")&&null!==c.indent&&"\t"!==c.indent&&!(parseInt(c.indent,10)===c.indent&&c.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(G(c,"numericSeparator")&&"boolean"!=typeof c.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=c.numericSeparator;if(void 0===u)return"undefined";if(null===u)return"null";if("boolean"==typeof u)return u?"true":"false";if("string"==typeof u)return function e(u,t){if(u.length>t.maxStringLength){var n=u.length-t.maxStringLength,d="... "+n+" more character"+(n>1?"s":"");return e(y.call(u,0,t.maxStringLength),t)+d}return B(g.call(g.call(u,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,K),"single",t)}(u,c);if("number"==typeof u){if(0===u)return 1/0/u>0?"0":"-0";var _=String(u);return h?M(u,_):_}if("bigint"==typeof u){var w=String(u)+"n";return h?M(u,w):w}var A=void 0===c.depth?5:c.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof u)return U(u)?"[Array]":"[Object]";var j=function(e,u){var t;if("\t"===e.indent)t="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;t=I.call(Array(e.indent+1)," ")}return{base:t,prev:I.call(Array(u+1),t)}}(c,n);if(void 0===d)d=[];else if(H(d,u)>=0)return"[Circular]";function L(u,t,r){if(t&&(d=S.call(d)).push(t),r){var a={depth:c.depth};return G(c,"quoteStyle")&&(a.quoteStyle=c.quoteStyle),e(u,a,n+1,d)}return e(u,c,n+1,d)}if("function"==typeof u&&!z(u)){var $=function(e){if(e.name)return e.name;var u=b.call(v.call(e),/^function\s*([\w$]+)/);if(u)return u[1];return null}(u),X=Y(u,L);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+I.call(X,", ")+" }":"")}if(W(u)){var ee=N?g.call(String(u),/^(Symbol\(.*\))_[^)]*$/,"$1"):O.call(u);return"object"!=typeof u||N?ee:V(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(u)){for(var ue="<"+x.call(String(u.nodeName)),te=u.attributes||[],ne=0;ne"}if(U(u)){if(0===u.length)return"[]";var de=Y(u,L);return j&&!function(e){for(var u=0;u=0)return!1;return!0}(de)?"["+Q(de,j)+"]":"[ "+I.call(de,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)){var re=Y(u,L);return"cause"in Error.prototype||!("cause"in u)||P.call(u,"cause")?0===re.length?"["+String(u)+"]":"{ ["+String(u)+"] "+I.call(re,", ")+" }":"{ ["+String(u)+"] "+I.call(E.call("[cause]: "+L(u.cause),re),", ")+" }"}if("object"==typeof u&&o){if(F&&"function"==typeof u[F]&&R)return R(u,{depth:A-n});if("symbol"!==o&&"function"==typeof u.inspect)return u.inspect()}if(function(e){if(!r||!e||"object"!=typeof e)return!1;try{r.call(e);try{i.call(e)}catch(ue){return!0}return e instanceof Map}catch(u){}return!1}(u)){var ae=[];return a.call(u,(function(e,t){ae.push(L(t,u,!0)+" => "+L(e,u))})),Z("Map",r.call(u),ae,j)}if(function(e){if(!i||!e||"object"!=typeof e)return!1;try{i.call(e);try{r.call(e)}catch(u){return!0}return e instanceof Set}catch(t){}return!1}(u)){var ce=[];return f.call(u,(function(e){ce.push(L(e,u))})),Z("Set",i.call(u),ce,j)}if(function(e){if(!l||!e||"object"!=typeof e)return!1;try{l.call(e,l);try{s.call(e,s)}catch(ue){return!0}return e instanceof WeakMap}catch(u){}return!1}(u))return J("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{l.call(e,l)}catch(ue){return!0}return e instanceof WeakSet}catch(u){}return!1}(u))return J("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(u){}return!1}(u))return J("WeakRef");if(function(e){return!("[object Number]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(Number(u)));if(function(e){if(!e||"object"!=typeof e||!k)return!1;try{return k.call(e),!0}catch(u){}return!1}(u))return V(L(k.call(u)));if(function(e){return!("[object Boolean]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(m.call(u));if(function(e){return!("[object String]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(String(u)));if(!function(e){return!("[object Date]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)&&!z(u)){var oe=Y(u,L),ie=T?T(u)===Object.prototype:u instanceof Object||u.constructor===Object,fe=u instanceof Object?"":"null prototype",le=!ie&&C&&Object(u)===u&&C in u?y.call(q(u),8,-1):fe?"Object":"",se=(ie||"function"!=typeof u.constructor?"":u.constructor.name?u.constructor.name+" ":"")+(le||fe?"["+I.call(E.call([],le||[],fe||[]),": ")+"] ":"");return 0===oe.length?se+"{}":j?se+"{"+Q(oe,j)+"}":se+"{ "+I.call(oe,", ")+" }"}return String(u)};var $=Object.prototype.hasOwnProperty||function(e){return e in this};function G(e,u){return $.call(e,u)}function q(e){return h.call(e)}function H(e,u){if(e.indexOf)return e.indexOf(u);for(var t=0,n=e.length;t-1?e.split(","):e},i=function(e,u,t,n){if(e){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,c=t.depth>0&&/(\[[^[\]]*])/.exec(r),i=c?r.slice(0,c.index):r,f=[];if(i){if(!t.plainObjects&&d.call(Object.prototype,i)&&!t.allowPrototypes)return;f.push(i)}for(var l=0;t.depth>0&&null!==(c=a.exec(r))&&l=0;--r){var a,c=e[r];if("[]"===c&&t.parseArrays)a=[].concat(d);else{a=t.plainObjects?Object.create(null):{};var i="["===c.charAt(0)&&"]"===c.charAt(c.length-1)?c.slice(1,-1):c,f=parseInt(i,10);t.parseArrays||""!==i?!isNaN(f)&&c!==i&&String(f)===i&&f>=0&&t.parseArrays&&f<=t.arrayLimit?(a=[])[f]=d:"__proto__"!==i&&(a[i]=d):a={0:d}}d=a}return d}(f,u,t,n)}};e.exports=function(e,u){var t=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var u=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:u,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||n.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(u);if(""===e||null==e)return t.plainObjects?Object.create(null):{};for(var f="string"==typeof e?function(e,u){var t,i={},f=u.ignoreQueryPrefix?e.replace(/^\?/,""):e,l=u.parameterLimit===1/0?void 0:u.parameterLimit,s=f.split(u.delimiter,l),p=-1,m=u.charset;if(u.charsetSentinel)for(t=0;t-1&&(v=r(v)?[v]:v),d.call(i,h)?i[h]=n.combine(i[h],v):i[h]=v}return i}(e,t):e,l=t.plainObjects?Object.create(null):{},s=Object.keys(f),p=0;p1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!v(m(this,u),e)}}),s&&n(f.prototype,"size",{get:function(){return m(this,u)[h]}}),f},def:function(e,u,t){var n,d,r=v(e,u);return r?r.v=t:(e._l=r={i:d=p(u,!0),k:u,v:t,p:n=e._l,n:void 0,r:!1},e._f||(e._f=r),n&&(n.n=r),e[h]++,"F"!==d&&(e._i[d]=r)),e},getEntry:v,setStrong:function(e,u,t){i(e,u,(function(e,t){this._t=m(e,u),this._k=t,this._l=void 0}),(function(){for(var e=this._k,u=this._l;u&&u.r;)u=u.p;return this._t&&(this._l=u=u?u.n:this._t._f)?f(0,"keys"==e?u.k:"values"==e?u.v:[u.k,u.v]):(this._t=void 0,f(1))}),t?"entries":"values",!t,!0),l(u)}}},547:function(e,u,t){"use strict";var n=t(5),d=t(12),r=t(16),a=t(82),c=t(491),o=t(81),i=t(80),f=t(13),l=t(14),s=t(83),p=t(41),m=t(548);e.exports=function(e,u,t,h,v,b){var y=n[e],g=y,_=v?"set":"add",x=g&&g.prototype,w={},E=function(e){var u=x[e];r(x,e,"delete"==e||"has"==e?function(e){return!(b&&!f(e))&&u.call(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:u.call(this,0===e?0:e)}:"add"==e?function(e){return u.call(this,0===e?0:e),this}:function(e,t){return u.call(this,0===e?0:e,t),this})};if("function"==typeof g&&(b||x.forEach&&!l((function(){(new g).entries().next()})))){var I=new g,S=I[_](b?{}:-0,1)!=I,A=l((function(){I.has(1)})),k=s((function(e){new g(e)})),j=!b&&l((function(){for(var e=new g,u=5;u--;)e[_](u,u);return!e.has(-0)}));k||((g=u((function(u,t){i(u,g,e);var n=m(new y,u,g);return null!=t&&o(t,v,n[_],n),n}))).prototype=x,x.constructor=g),(A||j)&&(E("delete"),E("has"),v&&E("get")),(j||S)&&E(_),b&&x.clear&&delete x.clear}else g=h.getConstructor(u,e,v,_),a(g.prototype,t),c.NEED=!0;return p(g,e),w[e]=g,d(d.G+d.W+d.F*(g!=y),w),b||h.setStrong(g,e,v),g}},548:function(e,u,t){var n=t(13),d=t(549).set;e.exports=function(e,u,t){var r,a=u.constructor;return a!==t&&"function"==typeof a&&(r=a.prototype)!==t.prototype&&n(r)&&d&&d(e,r),e}},549:function(e,u,t){var n=t(13),d=t(8),r=function(e,u){if(d(e),!n(u)&&null!==u)throw TypeError(u+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,u,n){try{(n=t(30)(Function.call,t(550).f(Object.prototype,"__proto__").set,2))(e,[]),u=!(e instanceof Array)}catch(d){u=!0}return function(e,t){return r(e,t),u?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:r}},550:function(e,u,t){var n=t(62),d=t(57),r=t(33),a=t(87),c=t(31),o=t(86),i=Object.getOwnPropertyDescriptor;u.f=t(10)?i:function(e,u){if(e=r(e),u=a(u,!0),o)try{return i(e,u)}catch(t){}if(c(e,u))return d(!n.f.call(e,u),e[u])}},551:function(e,u,t){"use strict";var n=t(12),d=t(32),r=t(27),a=t(14),c=[].sort,o=[1,2,3];n(n.P+n.F*(a((function(){o.sort(void 0)}))||!a((function(){o.sort(null)}))||!t(552)(c)),"Array",{sort:function(e){return void 0===e?c.call(r(this)):c.call(r(this),d(e))}})},552:function(e,u,t){"use strict";var n=t(14);e.exports=function(e,u){return!!e&&n((function(){u?e.call(null,(function(){}),1):e.call(null)}))}},561:function(e,u,t){"use strict";t(489),t(79),t(490),t(551),t(29),t(22),t(21),t(85),t(442);var n=t(1),d=(t(446),t(447),t(77),t(428),t(0)),r=t.n(d),a=t(481),c=t.n(a);t(150);var o=function(e){var u=e.humanize,t=e.icon,n=e.values,d=e.currentState,a=e.setState;if(0==n.size)return null;var o=Array.from(n);return r.a.createElement(r.a.Fragment,null,o.map((function(e,n){var o="string"==typeof e&&u?c()(e):e;return r.a.createElement("label",{key:n},r.a.createElement("input",{type:"checkbox",onChange:function(u){var t=new Set(d);u.currentTarget.checked?t.add(e):t.delete(e),a(t)},checked:d.has(e)}),o&&r.a.createElement(r.a.Fragment,null,t?r.a.createElement("i",{className:"feather icon-"+t}):""," ",o))})))},i=t(503),f=t(431),l=t(430),s=(t(440),t(451)),p=t.n(s),m=t(423),h=t.n(m),v=t(504),b=t.n(v),y=t(436);t(151);function g(e){var u=e.delivery_guarantee,t=e.description,n=e.event_types,d=e.function_category,a=(e.logo_path,e.name),c=e.pathTemplate,o=e.status,i=e.title,f=e.type,s=c;s||("source"==f&&(s="/docs/reference/sources//"),"transform"==f&&(s="/docs/reference/transforms//"),"sink"==f&&(s="/docs/reference/sinks//"));var p=s.replace("",a);return r.a.createElement(l.a,{to:p,className:"qovery-component",title:t},r.a.createElement("div",{className:"qovery-component--header"},r.a.createElement("div",{className:"qovery-component--name"},i)),r.a.createElement("div",{className:"qovery-component--badges"},"beta"==o?r.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},r.a.createElement("i",{className:"feather icon-alert-triangle"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},r.a.createElement("i",{className:"feather icon-award"})),"best_effort"==u?r.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},r.a.createElement("i",{className:"feather icon-shield-off"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},r.a.createElement("i",{className:"feather icon-shield"})),n.includes("log")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",n.includes("metric")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",r.a.createElement("span",{className:"badge badge--primary"},d)))}function _(e){var u=e.components,t=e.headingLevel,d=e.pathTemplate,a=e.titles,c=u.filter((function(e){return"source"==e.type})),o=u.filter((function(e){return"transform"==e.type})),l=u.filter((function(e){return"sink"==e.type})),s="h"+(t||3);return u.length>0?r.a.createElement(r.a.Fragment,null,c.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,c.length," Sources"),r.a.createElement("div",{className:"qovery-components--grid"},c.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",o.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,o.length," Transforms"),r.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",l.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,l.length," Sinks"),r.a.createElement("div",{className:"qovery-components--grid"},l.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",r.a.createElement("hr",null),r.a.createElement(f.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):r.a.createElement(i.a,{text:"no components found"})}u.a=function(e){var u=Object(y.a)().siteConfig.customFields.metadata,t=u.sources,n=u.transforms,a=u.sinks,c=e.titles||null==e.titles,i=1==e.filterColumn,f=e.pathTemplate,s=e.location?b.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(t))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(n))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(a))),m=m.sort((function(e,u){return e.name>u.name?1:-1}));var v=Object(d.useState)("true"==s["at-least-once"]),g=v[0],x=v[1],w=Object(d.useState)(new Set(s["event-types"]||e.eventTypes)),E=w[0],I=w[1],S=Object(d.useState)(new Set(s.functions)),A=S[0],k=S[1],j=Object(d.useState)(new Set(s["operating-systems"])),O=j[0],N=j[1],C=Object(d.useState)("true"==s["prod-ready"]),P=C[0],T=C[1],M=Object(d.useState)(new Set(s.providers)),R=M[0],L=M[1],F=Object(d.useState)(s.search),B=F[0],D=F[1];B&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(B.toLowerCase())}))),g&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),E.size>0&&(m=m.filter((function(e){return Array.from(E).some((function(u){return e.event_types.includes(u)}))}))),A.size>0&&(m=m.filter((function(e){return A.has(e.function_category)}))),O.size>0&&(m=m.filter((function(e){return Array.from(O).every((function(u){return e.operating_systems.includes(u)}))}))),P&&(m=m.filter((function(e){return"prod-ready"==e.status}))),R.size>0&&(m=m.filter((function(e){return Array.from(R).every((function(u){return e.service_providers&&e.service_providers.includes(u)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(u){return!e.exceptNames.includes(u.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(u){return!e.exceptFunctions.includes(u.function_category)})));var U=E.size>0?E:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),z=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),G=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return r.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":i})},r.a.createElement("div",{className:"filters"},r.a.createElement("div",{className:"search"},r.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return D(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Event Types",icon:"database",values:U,humanize:!0,currentState:E,setState:I}))),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return x(e.currentTarget.checked)},checked:g}),r.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),r.a.createElement("label",{title:"Show only production ready components."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return T(e.currentTarget.checked)},checked:P}),r.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),$.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Source Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:A,setState:k}))),G.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Transform Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:G,humanize:!0,currentState:A,setState:k}))),q.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Sink Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:A,setState:k}))),W.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Providers"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Providers",icon:"cloud",values:W,currentState:R,setState:L}))),z.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Operating Systems",icon:"cpu",values:z,currentState:O,setState:N})))),r.a.createElement("div",{className:"qovery-components--results"},r.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:f,titles:c})))}}}]); \ No newline at end of file +/*! For license information please see 54e7632e.f37d554b.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{419:function(e,u,t){"use strict";t.r(u);var n={};t.r(n),t.d(n,"now",(function(){return g})),t.d(n,"timer",(function(){return w})),t.d(n,"timerFlush",(function(){return E})),t.d(n,"timeout",(function(){return k})),t.d(n,"interval",(function(){return j}));var d,r,a=t(0),c=t.n(a),o=t(561),i=t(445),f=t(430),l=(t(426),t(84),0),s=0,p=0,m=0,h=0,v=0,b="object"==typeof performance&&performance.now?performance:Date,y="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(e){setTimeout(e,17)};function g(){return h||(y(_),h=b.now()+v)}function _(){h=0}function x(){this._call=this._time=this._next=null}function w(e,u,t){var n=new x;return n.restart(e,u,t),n}function E(){g(),++l;for(var e,u=d;u;)(e=h-u._time)>=0&&u._call.call(null,e),u=u._next;--l}function I(){h=(m=b.now())+v,l=s=0;try{E()}finally{l=0,function(){var e,u,t=d,n=1/0;for(;t;)t._call?(n>t._time&&(n=t._time),e=t,t=t._next):(u=t._next,t._next=null,t=e?e._next=u:d=u);r=e,A(n)}(),h=0}}function S(){var e=b.now(),u=e-m;u>1e3&&(v-=u,m=e)}function A(e){l||(s&&(s=clearTimeout(s)),e-h>24?(e<1/0&&(s=setTimeout(I,e-b.now()-v)),p&&(p=clearInterval(p))):(p||(m=b.now(),p=setInterval(S,1e3)),l=1,y(I)))}x.prototype=w.prototype={constructor:x,restart:function(e,u,t){if("function"!=typeof e)throw new TypeError("callback is not a function");t=(null==t?g():+t)+(null==u?0:+u),this._next||r===this||(r?r._next=this:d=this,r=this),this._call=e,this._time=t,A()},stop:function(){this._call&&(this._call=null,this._time=1/0,A())}};var k=function(e,u,t){var n=new x;return u=null==u?0:+u,n.restart((function(t){n.stop(),e(t+u)}),u,t),n},j=function(e,u,t){var n=new x,d=u;return null==u?(n.restart(e,u,t),n):(u=+u,t=null==t?g():+t,n.restart((function r(a){a+=d,n.restart(r,d+=u,t),e(a)}),u,t),n)},O=Object.assign({},n);t(436);u.default=function(e){return Object(a.useEffect)((function(){if("undefined"!=typeof document){var e=function(e){for(var u=e.getContext("2d"),t=e.width,n=e.height,d=2*Math.PI,r=200,a=new Array(r),c=0;ct+45&&(o.x-=t+90),o.y+=o.vy,o.y<-45?o.y+=n+90:o.y>n+45&&(o.y-=n+90),o.vx+=.2*(Math.random()-.5)-.01*o.vx,o.vy+=.2*(Math.random()-.5)-.01*o.vy,u.beginPath(),u.arc(o.x,o.y,3,0,d),u.fillStyle="rgba(40,217,242,0.4)",u.fill()}for(c=0;c3600?(2025-m)/-1575:1,u.beginPath(),u.moveTo(f.x,f.y),u.lineTo(l.x,l.y),u.strokeStyle="rgba(40,217,242,0.3)",u.stroke())}u.restore()}))}(document.querySelector("canvas"));return function(){e.stop()}}}),[]),c.a.createElement(i.a,{title:"Components - Sources, Transforms, & Sinks",description:"Browse and search all of Qovery's components: sources, transforms, and sinks. Filter by event type, guarantee, function, operating system, and provider."},c.a.createElement("header",{className:"hero hero--animated-graph"},c.a.createElement("div",{className:"container container--fluid container--flush"},c.a.createElement("canvas",{width:"2000",height:"200"}),c.a.createElement("div",{className:"overlay"},c.a.createElement("h1",null,"Qovery Components"),c.a.createElement("div",{className:"hero--subtitle"},"Components allow you to collect, transform, and route data with ease. ",c.a.createElement(f.a,{to:"/docs/getting-started/concepts/"},"Learn more"),".")))),c.a.createElement("main",{className:"container"},c.a.createElement(o.a,{filterColumn:!0,headingLevel:2,location:e.location})))}},423:function(e,u,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function d(){for(var e=[],u=0;u1?arguments[1]:void 0,t),o=a>2?arguments[2]:void 0,i=void 0===o?t:d(o,t);i>c;)u[c++]=e;return u}},428:function(e,u,t){var n=t(28).f,d=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in d||t(10)&&n(d,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},431:function(e,u,t){"use strict";var n=t(0),d=t.n(n),r=t(430),a=t(423),c=t.n(a);t(133);u.a=function(e){var u=e.children,t=e.className,n=e.badge,a=e.leftIcon,o=e.rightIcon,i=e.size,f=e.target,l=e.to,s=c()("jump-to","jump-to--"+i,t),p=d.a.createElement("div",{className:"jump-to--inner"},d.a.createElement("div",{className:"jump-to--inner-2"},a&&d.a.createElement("div",{className:"jump-to--left"},d.a.createElement("i",{className:"feather icon-"+a})),d.a.createElement("div",{className:"jump-to--main"},n?d.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",u),d.a.createElement("div",{className:"jump-to--right"},d.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return f?d.a.createElement("a",{href:l,target:f,className:s},p):d.a.createElement(r.a,{to:l,className:s},p)}},442:function(e,u,t){"use strict";var n=t(8),d=t(486),r=t(55);t(56)("search",1,(function(e,u,t,a){return[function(t){var n=e(this),d=null==t?void 0:t[u];return void 0!==d?d.call(t,n):new RegExp(t)[u](String(n))},function(e){var u=a(t,e,this);if(u.done)return u.value;var c=n(e),o=String(this),i=c.lastIndex;d(i,0)||(c.lastIndex=0);var f=r(c,o);return d(c.lastIndex,i)||(c.lastIndex=i),null===f?-1:f.index}]}))},445:function(e,u,t){"use strict";t(457);var n=t(0),d=t.n(n),r=t(458),a=t(444),c=t(1),o=(t(448),t(449),t(459),t(430)),i=t(460),f=t(440),l=t.n(f),s=t(461),p=t.n(s),m=t(436),h=t(423),v=t.n(h),b=t(135),y=t.n(b),g=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.moon)})},_=function(){return d.a.createElement("span",{className:v()(y.a.toggle,y.a.sun)})},x=function(e){var u=Object(m.a)().isClient;return d.a.createElement(p.a,Object(c.a)({disabled:!u,icons:{checked:d.a.createElement(g,null),unchecked:d.a.createElement(_,null)}},e))};function w(){var e=Object(m.a)().siteConfig,u=(void 0===e?{}:e).customFields.metadata.latest_post,t=Date.parse(u.date),n=new Date,d=Math.abs(n-t),r=Math.ceil(d/864e5),a=null;return"undefined"!=typeof window&&(a=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),r<30&&(!a||a0&&d.a.createElement("div",{className:"row footer__links"},d.a.createElement("div",{className:"col col--5 footer__col"},d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement(l.a,{className:"navbar__logo",src:p,alt:"Qovery",width:"150",height:"auto"})),d.a.createElement("div",{className:"margin-bottom--md"},d.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),d.a.createElement("div",null,d.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},d.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},d.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},d.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",d.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},d.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),o.map((function(e,u){return d.a.createElement("div",{key:u,className:"col footer__col"},null!=e.title?d.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?d.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,u){return e.html?d.a.createElement("li",{key:u,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):d.a.createElement("li",{key:e.href||e.to,className:"footer__item"},d.a.createElement(L,e))}))):null)}))),(f||a)&&d.a.createElement("div",{className:"text--center"},f&&f.src&&d.a.createElement("div",{className:"margin-bottom--sm"},f.href?d.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},d.a.createElement(F,{alt:f.alt,url:s})):d.a.createElement(F,{alt:f.alt,url:s})),d.a.createElement("small",null,a),d.a.createElement("br",null))))},D=t(462),U=t(463),z=t(3);t(138);u.a=function(e){var u=Object(m.a)().siteConfig,t=void 0===u?{}:u,n=t.favicon,c=(t.tagline,t.title),o=t.themeConfig.image,i=t.url,f=e.children,l=e.title,s=e.noFooter,p=e.description,h=e.image,v=e.keywords,b=(e.permalink,e.version),y=l?l+" | "+c:c,g=h||o,_=i+Object(I.a)(g),x=Object(I.a)(n),w=Object(z.h)(),E=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return d.a.createElement(U.a,null,d.a.createElement(D.a,null,d.a.createElement(a.a,null,d.a.createElement("html",{lang:"en"}),d.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),y&&d.a.createElement("title",null,y),y&&d.a.createElement("meta",{property:"og:title",content:y}),n&&d.a.createElement("link",{rel:"shortcut icon",href:x}),p&&d.a.createElement("meta",{name:"description",content:p}),p&&d.a.createElement("meta",{property:"og:description",content:p}),b&&d.a.createElement("meta",{name:"docsearch:version",content:b}),v&&v.length&&d.a.createElement("meta",{name:"keywords",content:v.join(",")}),g&&d.a.createElement("meta",{property:"og:image",content:_}),g&&d.a.createElement("meta",{property:"twitter:image",content:_}),g&&d.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+y}),E&&d.a.createElement("meta",{property:"og:url",content:E}),d.a.createElement("meta",{name:"twitter:card",content:"summary"}),E&&d.a.createElement("link",{rel:"canonical",href:E})),d.a.createElement(r.a,null),d.a.createElement(P,null),d.a.createElement("div",{className:"main-wrapper"},f),!s&&d.a.createElement(B,null)))}},451:function(e,u,t){(function(e,n){var d;(function(){var r="Expected a function",a="__lodash_placeholder__",c=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],o="[object Arguments]",i="[object Array]",f="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",m="[object GeneratorFunction]",h="[object Map]",v="[object Number]",b="[object Object]",y="[object RegExp]",g="[object Set]",_="[object String]",x="[object Symbol]",w="[object WeakMap]",E="[object ArrayBuffer]",I="[object DataView]",S="[object Float32Array]",A="[object Float64Array]",k="[object Int8Array]",j="[object Int16Array]",O="[object Int32Array]",N="[object Uint8Array]",C="[object Uint16Array]",P="[object Uint32Array]",T=/\b__p \+= '';/g,M=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L=/&(?:amp|lt|gt|quot|#39);/g,F=/[&<>"']/g,B=RegExp(L.source),D=RegExp(F.source),U=/<%-([\s\S]+?)%>/g,z=/<%([\s\S]+?)%>/g,W=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,G=/^\w*$/,q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,H=/[\\^$.*+?()[\]{}|]/g,K=RegExp(H.source),V=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,Q=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,ee=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ue=/\\(\\)?/g,te=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ne=/\w*$/,de=/^[-+]0x[0-9a-f]+$/i,re=/^0b[01]+$/i,ae=/^\[object .+?Constructor\]$/,ce=/^0o[0-7]+$/i,oe=/^(?:0|[1-9]\d*)$/,ie=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,fe=/($^)/,le=/['\n\r\u2028\u2029\\]/g,se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",pe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",me="[\\ud800-\\udfff]",he="["+pe+"]",ve="["+se+"]",be="\\d+",ye="[\\u2700-\\u27bf]",ge="[a-z\\xdf-\\xf6\\xf8-\\xff]",_e="[^\\ud800-\\udfff"+pe+be+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",xe="\\ud83c[\\udffb-\\udfff]",we="[^\\ud800-\\udfff]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",Ie="[\\ud800-\\udbff][\\udc00-\\udfff]",Se="[A-Z\\xc0-\\xd6\\xd8-\\xde]",Ae="(?:"+ge+"|"+_e+")",ke="(?:"+Se+"|"+_e+")",je="(?:"+ve+"|"+xe+")"+"?",Oe="[\\ufe0e\\ufe0f]?"+je+("(?:\\u200d(?:"+[we,Ee,Ie].join("|")+")[\\ufe0e\\ufe0f]?"+je+")*"),Ne="(?:"+[ye,Ee,Ie].join("|")+")"+Oe,Ce="(?:"+[we+ve+"?",ve,Ee,Ie,me].join("|")+")",Pe=RegExp("['\u2019]","g"),Te=RegExp(ve,"g"),Me=RegExp(xe+"(?="+xe+")|"+Ce+Oe,"g"),Re=RegExp([Se+"?"+ge+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[he,Se,"$"].join("|")+")",ke+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[he,Se+Ae,"$"].join("|")+")",Se+"?"+Ae+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Se+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",be,Ne].join("|"),"g"),Le=RegExp("[\\u200d\\ud800-\\udfff"+se+"\\ufe0e\\ufe0f]"),Fe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Be=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],De=-1,Ue={};Ue[S]=Ue[A]=Ue[k]=Ue[j]=Ue[O]=Ue[N]=Ue["[object Uint8ClampedArray]"]=Ue[C]=Ue[P]=!0,Ue[o]=Ue[i]=Ue[E]=Ue[f]=Ue[I]=Ue[l]=Ue[s]=Ue[p]=Ue[h]=Ue[v]=Ue[b]=Ue[y]=Ue[g]=Ue[_]=Ue[w]=!1;var ze={};ze[o]=ze[i]=ze[E]=ze[I]=ze[f]=ze[l]=ze[S]=ze[A]=ze[k]=ze[j]=ze[O]=ze[h]=ze[v]=ze[b]=ze[y]=ze[g]=ze[_]=ze[x]=ze[N]=ze["[object Uint8ClampedArray]"]=ze[C]=ze[P]=!0,ze[s]=ze[p]=ze[w]=!1;var We={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$e=parseFloat,Ge=parseInt,qe="object"==typeof e&&e&&e.Object===Object&&e,He="object"==typeof self&&self&&self.Object===Object&&self,Ke=qe||He||Function("return this")(),Ve=u&&!u.nodeType&&u,Je=Ve&&"object"==typeof n&&n&&!n.nodeType&&n,Ze=Je&&Je.exports===Ve,Qe=Ze&&qe.process,Ye=function(){try{var e=Je&&Je.require&&Je.require("util").types;return e||Qe&&Qe.binding&&Qe.binding("util")}catch(u){}}(),Xe=Ye&&Ye.isArrayBuffer,eu=Ye&&Ye.isDate,uu=Ye&&Ye.isMap,tu=Ye&&Ye.isRegExp,nu=Ye&&Ye.isSet,du=Ye&&Ye.isTypedArray;function ru(e,u,t){switch(t.length){case 0:return e.call(u);case 1:return e.call(u,t[0]);case 2:return e.call(u,t[0],t[1]);case 3:return e.call(u,t[0],t[1],t[2])}return e.apply(u,t)}function au(e,u,t,n){for(var d=-1,r=null==e?0:e.length;++d-1}function su(e,u,t){for(var n=-1,d=null==e?0:e.length;++n-1;);return t}function Mu(e,u){for(var t=e.length;t--&&xu(u,e[t],0)>-1;);return t}function Ru(e,u){for(var t=e.length,n=0;t--;)e[t]===u&&++n;return n}var Lu=Au({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Fu=Au({"&":"&","<":"<",">":">",'"':""","'":"'"});function Bu(e){return"\\"+We[e]}function Du(e){return Le.test(e)}function Uu(e){var u=-1,t=Array(e.size);return e.forEach((function(e,n){t[++u]=[n,e]})),t}function zu(e,u){return function(t){return e(u(t))}}function Wu(e,u){for(var t=-1,n=e.length,d=0,r=[];++t",""":'"',"'":"'"});var Vu=function e(u){var t,n=(u=null==u?Ke:Vu.defaults(Ke.Object(),u,Vu.pick(Ke,Be))).Array,d=u.Date,se=u.Error,pe=u.Function,me=u.Math,he=u.Object,ve=u.RegExp,be=u.String,ye=u.TypeError,ge=n.prototype,_e=pe.prototype,xe=he.prototype,we=u["__core-js_shared__"],Ee=_e.toString,Ie=xe.hasOwnProperty,Se=0,Ae=(t=/[^.]+$/.exec(we&&we.keys&&we.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",ke=xe.toString,je=Ee.call(he),Oe=Ke._,Ne=ve("^"+Ee.call(Ie).replace(H,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ce=Ze?u.Buffer:void 0,Me=u.Symbol,Le=u.Uint8Array,We=Ce?Ce.allocUnsafe:void 0,qe=zu(he.getPrototypeOf,he),He=he.create,Ve=xe.propertyIsEnumerable,Je=ge.splice,Qe=Me?Me.isConcatSpreadable:void 0,Ye=Me?Me.iterator:void 0,yu=Me?Me.toStringTag:void 0,Au=function(){try{var e=Xd(he,"defineProperty");return e({},"",{}),e}catch(u){}}(),Ju=u.clearTimeout!==Ke.clearTimeout&&u.clearTimeout,Zu=d&&d.now!==Ke.Date.now&&d.now,Qu=u.setTimeout!==Ke.setTimeout&&u.setTimeout,Yu=me.ceil,Xu=me.floor,et=he.getOwnPropertySymbols,ut=Ce?Ce.isBuffer:void 0,tt=u.isFinite,nt=ge.join,dt=zu(he.keys,he),rt=me.max,at=me.min,ct=d.now,ot=u.parseInt,it=me.random,ft=ge.reverse,lt=Xd(u,"DataView"),st=Xd(u,"Map"),pt=Xd(u,"Promise"),mt=Xd(u,"Set"),ht=Xd(u,"WeakMap"),vt=Xd(he,"create"),bt=ht&&new ht,yt={},gt=Ar(lt),_t=Ar(st),xt=Ar(pt),wt=Ar(mt),Et=Ar(ht),It=Me?Me.prototype:void 0,St=It?It.valueOf:void 0,At=It?It.toString:void 0;function kt(e){if($a(e)&&!Pa(e)&&!(e instanceof Ct)){if(e instanceof Nt)return e;if(Ie.call(e,"__wrapped__"))return kr(e)}return new Nt(e)}var jt=function(){function e(){}return function(u){if(!Wa(u))return{};if(He)return He(u);e.prototype=u;var t=new e;return e.prototype=void 0,t}}();function Ot(){}function Nt(e,u){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!u,this.__index__=0,this.__values__=void 0}function Ct(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Pt(e){var u=-1,t=null==e?0:e.length;for(this.clear();++u=u?e:u)),e}function Jt(e,u,t,n,d,r){var a,c=1&u,i=2&u,s=4&u;if(t&&(a=d?t(e,n,d,r):t(e)),void 0!==a)return a;if(!Wa(e))return e;var w=Pa(e);if(w){if(a=function(e){var u=e.length,t=new e.constructor(u);u&&"string"==typeof e[0]&&Ie.call(e,"index")&&(t.index=e.index,t.input=e.input);return t}(e),!c)return bd(e,a)}else{var T=tr(e),M=T==p||T==m;if(La(e))return ld(e,c);if(T==b||T==o||M&&!d){if(a=i||M?{}:dr(e),!c)return i?function(e,u){return yd(e,ur(e),u)}(e,function(e,u){return e&&yd(u,_c(u),e)}(a,e)):function(e,u){return yd(e,er(e),u)}(e,qt(a,e))}else{if(!ze[T])return d?e:{};a=function(e,u,t){var n=e.constructor;switch(u){case E:return sd(e);case f:case l:return new n(+e);case I:return function(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}(e,t);case S:case A:case k:case j:case O:case N:case"[object Uint8ClampedArray]":case C:case P:return pd(e,t);case h:return new n;case v:case _:return new n(e);case y:return function(e){var u=new e.constructor(e.source,ne.exec(e));return u.lastIndex=e.lastIndex,u}(e);case g:return new n;case x:return d=e,St?he(St.call(d)):{}}var d}(e,T,c)}}r||(r=new Lt);var R=r.get(e);if(R)return R;r.set(e,a),Va(e)?e.forEach((function(n){a.add(Jt(n,u,t,n,e,r))})):Ga(e)&&e.forEach((function(n,d){a.set(d,Jt(n,u,t,d,e,r))}));var L=w?void 0:(s?i?Hd:qd:i?_c:gc)(e);return cu(L||e,(function(n,d){L&&(n=e[d=n]),Wt(a,d,Jt(n,u,t,d,e,r))})),a}function Zt(e,u,t){var n=t.length;if(null==e)return!n;for(e=he(e);n--;){var d=t[n],r=u[d],a=e[d];if(void 0===a&&!(d in e)||!r(a))return!1}return!0}function Qt(e,u,t){if("function"!=typeof e)throw new ye(r);return gr((function(){e.apply(void 0,t)}),u)}function Yt(e,u,t,n){var d=-1,r=lu,a=!0,c=e.length,o=[],i=u.length;if(!c)return o;t&&(u=pu(u,Nu(t))),n?(r=su,a=!1):u.length>=200&&(r=Pu,a=!1,u=new Rt(u));e:for(;++d-1},Tt.prototype.set=function(e,u){var t=this.__data__,n=$t(t,e);return n<0?(++this.size,t.push([e,u])):t[n][1]=u,this},Mt.prototype.clear=function(){this.size=0,this.__data__={hash:new Pt,map:new(st||Tt),string:new Pt}},Mt.prototype.delete=function(e){var u=Qd(this,e).delete(e);return this.size-=u?1:0,u},Mt.prototype.get=function(e){return Qd(this,e).get(e)},Mt.prototype.has=function(e){return Qd(this,e).has(e)},Mt.prototype.set=function(e,u){var t=Qd(this,e),n=t.size;return t.set(e,u),this.size+=t.size==n?0:1,this},Rt.prototype.add=Rt.prototype.push=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},Rt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.clear=function(){this.__data__=new Tt,this.size=0},Lt.prototype.delete=function(e){var u=this.__data__,t=u.delete(e);return this.size=u.size,t},Lt.prototype.get=function(e){return this.__data__.get(e)},Lt.prototype.has=function(e){return this.__data__.has(e)},Lt.prototype.set=function(e,u){var t=this.__data__;if(t instanceof Tt){var n=t.__data__;if(!st||n.length<199)return n.push([e,u]),this.size=++t.size,this;t=this.__data__=new Mt(n)}return t.set(e,u),this.size=t.size,this};var Xt=xd(cn),en=xd(on,!0);function un(e,u){var t=!0;return Xt(e,(function(e,n,d){return t=!!u(e,n,d)})),t}function tn(e,u,t){for(var n=-1,d=e.length;++n0&&t(c)?u>1?dn(c,u-1,t,n,d):mu(d,c):n||(d[d.length]=c)}return d}var rn=wd(),an=wd(!0);function cn(e,u){return e&&rn(e,u,gc)}function on(e,u){return e&&an(e,u,gc)}function fn(e,u){return fu(u,(function(u){return Da(e[u])}))}function ln(e,u){for(var t=0,n=(u=cd(u,e)).length;null!=e&&tu}function hn(e,u){return null!=e&&Ie.call(e,u)}function vn(e,u){return null!=e&&u in he(e)}function bn(e,u,t){for(var d=t?su:lu,r=e[0].length,a=e.length,c=a,o=n(a),i=1/0,f=[];c--;){var l=e[c];c&&u&&(l=pu(l,Nu(u))),i=at(l.length,i),o[c]=!t&&(u||r>=120&&l.length>=120)?new Rt(c&&l):void 0}l=e[0];var s=-1,p=o[0];e:for(;++s=c)return o;var i=t[n];return o*("desc"==i?-1:1)}}return e.index-u.index}(e,u,t)}))}function Tn(e,u,t){for(var n=-1,d=u.length,r={};++n-1;)c!==e&&Je.call(c,o,1),Je.call(e,o,1);return e}function Rn(e,u){for(var t=e?u.length:0,n=t-1;t--;){var d=u[t];if(t==n||d!==r){var r=d;ar(d)?Je.call(e,d,1):Xn(e,d)}}return e}function Ln(e,u){return e+Xu(it()*(u-e+1))}function Fn(e,u){var t="";if(!e||u<1||u>9007199254740991)return t;do{u%2&&(t+=e),(u=Xu(u/2))&&(e+=e)}while(u);return t}function Bn(e,u){return _r(mr(e,u,qc),e+"")}function Dn(e){return Bt(jc(e))}function Un(e,u){var t=jc(e);return Er(t,Vt(u,0,t.length))}function zn(e,u,t,n){if(!Wa(e))return e;for(var d=-1,r=(u=cd(u,e)).length,a=r-1,c=e;null!=c&&++dr?0:r+u),(t=t>r?r:t)<0&&(t+=r),r=u>t?0:t-u>>>0,u>>>=0;for(var a=n(r);++d>>1,a=e[r];null!==a&&!Za(a)&&(t?a<=u:a=200){var i=u?null:Fd(e);if(i)return $u(i);a=!1,d=Pu,o=new Rt}else o=u?[]:c;e:for(;++n=n?e:qn(e,u,t)}var fd=Ju||function(e){return Ke.clearTimeout(e)};function ld(e,u){if(u)return e.slice();var t=e.length,n=We?We(t):new e.constructor(t);return e.copy(n),n}function sd(e){var u=new e.constructor(e.byteLength);return new Le(u).set(new Le(e)),u}function pd(e,u){var t=u?sd(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}function md(e,u){if(e!==u){var t=void 0!==e,n=null===e,d=e==e,r=Za(e),a=void 0!==u,c=null===u,o=u==u,i=Za(u);if(!c&&!i&&!r&&e>u||r&&a&&o&&!c&&!i||n&&a&&o||!t&&o||!d)return 1;if(!n&&!r&&!i&&e1?t[d-1]:void 0,a=d>2?t[2]:void 0;for(r=e.length>3&&"function"==typeof r?(d--,r):void 0,a&&cr(t[0],t[1],a)&&(r=d<3?void 0:r,d=1),u=he(u);++n-1?d[r?u[a]:a]:void 0}}function kd(e){return Gd((function(u){var t=u.length,n=t,d=Nt.prototype.thru;for(e&&u.reverse();n--;){var a=u[n];if("function"!=typeof a)throw new ye(r);if(d&&!c&&"wrapper"==Vd(a))var c=new Nt([],!0)}for(n=c?n:t;++n1&&g.reverse(),l&&ic))return!1;var i=r.get(e);if(i&&r.get(u))return i==u;var f=-1,l=!0,s=2&t?new Rt:void 0;for(r.set(e,u),r.set(u,e);++f-1&&e%1==0&&e1?"& ":"")+u[n],u=u.join(t>2?", ":" "),e.replace(Q,"{\n/* [wrapped with "+u+"] */\n")}(n,function(e,u){return cu(c,(function(t){var n="_."+t[0];u&t[1]&&!lu(e,n)&&e.push(n)})),e.sort()}(function(e){var u=e.match(Y);return u?u[1].split(X):[]}(n),t)))}function wr(e){var u=0,t=0;return function(){var n=ct(),d=16-(n-t);if(t=n,d>0){if(++u>=800)return arguments[0]}else u=0;return e.apply(void 0,arguments)}}function Er(e,u){var t=-1,n=e.length,d=n-1;for(u=void 0===u?n:u;++t1?e[u-1]:void 0;return t="function"==typeof t?(e.pop(),t):void 0,Kr(e,t)}));function ea(e){var u=kt(e);return u.__chain__=!0,u}function ua(e,u){return u(e)}var ta=Gd((function(e){var u=e.length,t=u?e[0]:0,n=this.__wrapped__,d=function(u){return Kt(u,e)};return!(u>1||this.__actions__.length)&&n instanceof Ct&&ar(t)?((n=n.slice(t,+t+(u?1:0))).__actions__.push({func:ua,args:[d],thisArg:void 0}),new Nt(n,this.__chain__).thru((function(e){return u&&!e.length&&e.push(void 0),e}))):this.thru(d)}));var na=gd((function(e,u,t){Ie.call(e,t)?++e[t]:Ht(e,t,1)}));var da=Ad(Cr),ra=Ad(Pr);function aa(e,u){return(Pa(e)?cu:Xt)(e,Zd(u,3))}function ca(e,u){return(Pa(e)?ou:en)(e,Zd(u,3))}var oa=gd((function(e,u,t){Ie.call(e,t)?e[t].push(u):Ht(e,t,[u])}));var ia=Bn((function(e,u,t){var d=-1,r="function"==typeof u,a=Ma(e)?n(e.length):[];return Xt(e,(function(e){a[++d]=r?ru(u,e,t):yn(e,u,t)})),a})),fa=gd((function(e,u,t){Ht(e,t,u)}));function la(e,u){return(Pa(e)?pu:kn)(e,Zd(u,3))}var sa=gd((function(e,u,t){e[t?0:1].push(u)}),(function(){return[[],[]]}));var pa=Bn((function(e,u){if(null==e)return[];var t=u.length;return t>1&&cr(e,u[0],u[1])?u=[]:t>2&&cr(u[0],u[1],u[2])&&(u=[u[0]]),Pn(e,dn(u,1),[])})),ma=Zu||function(){return Ke.Date.now()};function ha(e,u,t){return u=t?void 0:u,Dd(e,128,void 0,void 0,void 0,void 0,u=e&&null==u?e.length:u)}function va(e,u){var t;if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){return--e>0&&(t=u.apply(this,arguments)),e<=1&&(u=void 0),t}}var ba=Bn((function(e,u,t){var n=1;if(t.length){var d=Wu(t,Jd(ba));n|=32}return Dd(e,n,u,t,d)})),ya=Bn((function(e,u,t){var n=3;if(t.length){var d=Wu(t,Jd(ya));n|=32}return Dd(u,n,e,t,d)}));function ga(e,u,t){var n,d,a,c,o,i,f=0,l=!1,s=!1,p=!0;if("function"!=typeof e)throw new ye(r);function m(u){var t=n,r=d;return n=d=void 0,f=u,c=e.apply(r,t)}function h(e){return f=e,o=gr(b,u),l?m(e):c}function v(e){var t=e-i;return void 0===i||t>=u||t<0||s&&e-f>=a}function b(){var e=ma();if(v(e))return y(e);o=gr(b,function(e){var t=u-(e-i);return s?at(t,a-(e-f)):t}(e))}function y(e){return o=void 0,p&&n?m(e):(n=d=void 0,c)}function g(){var e=ma(),t=v(e);if(n=arguments,d=this,i=e,t){if(void 0===o)return h(i);if(s)return fd(o),o=gr(b,u),m(i)}return void 0===o&&(o=gr(b,u)),c}return u=dc(u)||0,Wa(t)&&(l=!!t.leading,a=(s="maxWait"in t)?rt(dc(t.maxWait)||0,u):a,p="trailing"in t?!!t.trailing:p),g.cancel=function(){void 0!==o&&fd(o),f=0,n=i=d=o=void 0},g.flush=function(){return void 0===o?c:y(ma())},g}var _a=Bn((function(e,u){return Qt(e,1,u)})),xa=Bn((function(e,u,t){return Qt(e,dc(u)||0,t)}));function wa(e,u){if("function"!=typeof e||null!=u&&"function"!=typeof u)throw new ye(r);var t=function(){var n=arguments,d=u?u.apply(this,n):n[0],r=t.cache;if(r.has(d))return r.get(d);var a=e.apply(this,n);return t.cache=r.set(d,a)||r,a};return t.cache=new(wa.Cache||Mt),t}function Ea(e){if("function"!=typeof e)throw new ye(r);return function(){var u=arguments;switch(u.length){case 0:return!e.call(this);case 1:return!e.call(this,u[0]);case 2:return!e.call(this,u[0],u[1]);case 3:return!e.call(this,u[0],u[1],u[2])}return!e.apply(this,u)}}wa.Cache=Mt;var Ia=od((function(e,u){var t=(u=1==u.length&&Pa(u[0])?pu(u[0],Nu(Zd())):pu(dn(u,1),Nu(Zd()))).length;return Bn((function(n){for(var d=-1,r=at(n.length,t);++d=u})),Ca=gn(function(){return arguments}())?gn:function(e){return $a(e)&&Ie.call(e,"callee")&&!Ve.call(e,"callee")},Pa=n.isArray,Ta=Xe?Nu(Xe):function(e){return $a(e)&&pn(e)==E};function Ma(e){return null!=e&&za(e.length)&&!Da(e)}function Ra(e){return $a(e)&&Ma(e)}var La=ut||ro,Fa=eu?Nu(eu):function(e){return $a(e)&&pn(e)==l};function Ba(e){if(!$a(e))return!1;var u=pn(e);return u==s||"[object DOMException]"==u||"string"==typeof e.message&&"string"==typeof e.name&&!Ha(e)}function Da(e){if(!Wa(e))return!1;var u=pn(e);return u==p||u==m||"[object AsyncFunction]"==u||"[object Proxy]"==u}function Ua(e){return"number"==typeof e&&e==tc(e)}function za(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}function Wa(e){var u=typeof e;return null!=e&&("object"==u||"function"==u)}function $a(e){return null!=e&&"object"==typeof e}var Ga=uu?Nu(uu):function(e){return $a(e)&&tr(e)==h};function qa(e){return"number"==typeof e||$a(e)&&pn(e)==v}function Ha(e){if(!$a(e)||pn(e)!=b)return!1;var u=qe(e);if(null===u)return!0;var t=Ie.call(u,"constructor")&&u.constructor;return"function"==typeof t&&t instanceof t&&Ee.call(t)==je}var Ka=tu?Nu(tu):function(e){return $a(e)&&pn(e)==y};var Va=nu?Nu(nu):function(e){return $a(e)&&tr(e)==g};function Ja(e){return"string"==typeof e||!Pa(e)&&$a(e)&&pn(e)==_}function Za(e){return"symbol"==typeof e||$a(e)&&pn(e)==x}var Qa=du?Nu(du):function(e){return $a(e)&&za(e.length)&&!!Ue[pn(e)]};var Ya=Md(An),Xa=Md((function(e,u){return e<=u}));function ec(e){if(!e)return[];if(Ma(e))return Ja(e)?Hu(e):bd(e);if(Ye&&e[Ye])return function(e){for(var u,t=[];!(u=e.next()).done;)t.push(u.value);return t}(e[Ye]());var u=tr(e);return(u==h?Uu:u==g?$u:jc)(e)}function uc(e){return e?(e=dc(e))===1/0||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function tc(e){var u=uc(e),t=u%1;return u==u?t?u-t:u:0}function nc(e){return e?Vt(tc(e),0,4294967295):0}function dc(e){if("number"==typeof e)return e;if(Za(e))return NaN;if(Wa(e)){var u="function"==typeof e.valueOf?e.valueOf():e;e=Wa(u)?u+"":u}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(V,"");var t=re.test(e);return t||ce.test(e)?Ge(e.slice(2),t?2:8):de.test(e)?NaN:+e}function rc(e){return yd(e,_c(e))}function ac(e){return null==e?"":Qn(e)}var cc=_d((function(e,u){if(lr(u)||Ma(u))yd(u,gc(u),e);else for(var t in u)Ie.call(u,t)&&Wt(e,t,u[t])})),oc=_d((function(e,u){yd(u,_c(u),e)})),ic=_d((function(e,u,t,n){yd(u,_c(u),e,n)})),fc=_d((function(e,u,t,n){yd(u,gc(u),e,n)})),lc=Gd(Kt);var sc=Bn((function(e,u){e=he(e);var t=-1,n=u.length,d=n>2?u[2]:void 0;for(d&&cr(u[0],u[1],d)&&(n=1);++t1),u})),yd(e,Hd(e),t),n&&(t=Jt(t,7,Wd));for(var d=u.length;d--;)Xn(t,u[d]);return t}));var Ic=Gd((function(e,u){return null==e?{}:function(e,u){return Tn(e,u,(function(u,t){return hc(e,t)}))}(e,u)}));function Sc(e,u){if(null==e)return{};var t=pu(Hd(e),(function(e){return[e]}));return u=Zd(u),Tn(e,t,(function(e,t){return u(e,t[0])}))}var Ac=Bd(gc),kc=Bd(_c);function jc(e){return null==e?[]:Cu(e,gc(e))}var Oc=Id((function(e,u,t){return u=u.toLowerCase(),e+(t?Nc(u):u)}));function Nc(e){return Bc(ac(e).toLowerCase())}function Cc(e){return(e=ac(e))&&e.replace(ie,Lu).replace(Te,"")}var Pc=Id((function(e,u,t){return e+(t?"-":"")+u.toLowerCase()})),Tc=Id((function(e,u,t){return e+(t?" ":"")+u.toLowerCase()})),Mc=Ed("toLowerCase");var Rc=Id((function(e,u,t){return e+(t?"_":"")+u.toLowerCase()}));var Lc=Id((function(e,u,t){return e+(t?" ":"")+Bc(u)}));var Fc=Id((function(e,u,t){return e+(t?" ":"")+u.toUpperCase()})),Bc=Ed("toUpperCase");function Dc(e,u,t){return e=ac(e),void 0===(u=t?void 0:u)?function(e){return Fe.test(e)}(e)?function(e){return e.match(Re)||[]}(e):function(e){return e.match(ee)||[]}(e):e.match(u)||[]}var Uc=Bn((function(e,u){try{return ru(e,void 0,u)}catch(t){return Ba(t)?t:new se(t)}})),zc=Gd((function(e,u){return cu(u,(function(u){u=Sr(u),Ht(e,u,ba(e[u],e))})),e}));function Wc(e){return function(){return e}}var $c=kd(),Gc=kd(!0);function qc(e){return e}function Hc(e){return En("function"==typeof e?e:Jt(e,1))}var Kc=Bn((function(e,u){return function(t){return yn(t,e,u)}})),Vc=Bn((function(e,u){return function(t){return yn(e,t,u)}}));function Jc(e,u,t){var n=gc(u),d=fn(u,n);null!=t||Wa(u)&&(d.length||!n.length)||(t=u,u=e,e=this,d=fn(u,gc(u)));var r=!(Wa(t)&&"chain"in t&&!t.chain),a=Da(e);return cu(d,(function(t){var n=u[t];e[t]=n,a&&(e.prototype[t]=function(){var u=this.__chain__;if(r||u){var t=e(this.__wrapped__),d=t.__actions__=bd(this.__actions__);return d.push({func:n,args:arguments,thisArg:e}),t.__chain__=u,t}return n.apply(e,mu([this.value()],arguments))})})),e}function Zc(){}var Qc=Cd(pu),Yc=Cd(iu),Xc=Cd(bu);function eo(e){return or(e)?Su(Sr(e)):function(e){return function(u){return ln(u,e)}}(e)}var uo=Td(),to=Td(!0);function no(){return[]}function ro(){return!1}var ao=Nd((function(e,u){return e+u}),0),co=Ld("ceil"),oo=Nd((function(e,u){return e/u}),1),io=Ld("floor");var fo,lo=Nd((function(e,u){return e*u}),1),so=Ld("round"),po=Nd((function(e,u){return e-u}),0);return kt.after=function(e,u){if("function"!=typeof u)throw new ye(r);return e=tc(e),function(){if(--e<1)return u.apply(this,arguments)}},kt.ary=ha,kt.assign=cc,kt.assignIn=oc,kt.assignInWith=ic,kt.assignWith=fc,kt.at=lc,kt.before=va,kt.bind=ba,kt.bindAll=zc,kt.bindKey=ya,kt.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Pa(e)?e:[e]},kt.chain=ea,kt.chunk=function(e,u,t){u=(t?cr(e,u,t):void 0===u)?1:rt(tc(u),0);var d=null==e?0:e.length;if(!d||u<1)return[];for(var r=0,a=0,c=n(Yu(d/u));rd?0:d+t),(n=void 0===n||n>d?d:tc(n))<0&&(n+=d),n=t>n?0:nc(n);t>>0)?(e=ac(e))&&("string"==typeof u||null!=u&&!Ka(u))&&!(u=Qn(u))&&Du(e)?id(Hu(e),0,t):e.split(u,t):[]},kt.spread=function(e,u){if("function"!=typeof e)throw new ye(r);return u=null==u?0:rt(tc(u),0),Bn((function(t){var n=t[u],d=id(t,0,u);return n&&mu(d,n),ru(e,this,d)}))},kt.tail=function(e){var u=null==e?0:e.length;return u?qn(e,1,u):[]},kt.take=function(e,u,t){return e&&e.length?qn(e,0,(u=t||void 0===u?1:tc(u))<0?0:u):[]},kt.takeRight=function(e,u,t){var n=null==e?0:e.length;return n?qn(e,(u=n-(u=t||void 0===u?1:tc(u)))<0?0:u,n):[]},kt.takeRightWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3),!1,!0):[]},kt.takeWhile=function(e,u){return e&&e.length?ud(e,Zd(u,3)):[]},kt.tap=function(e,u){return u(e),e},kt.throttle=function(e,u,t){var n=!0,d=!0;if("function"!=typeof e)throw new ye(r);return Wa(t)&&(n="leading"in t?!!t.leading:n,d="trailing"in t?!!t.trailing:d),ga(e,u,{leading:n,maxWait:u,trailing:d})},kt.thru=ua,kt.toArray=ec,kt.toPairs=Ac,kt.toPairsIn=kc,kt.toPath=function(e){return Pa(e)?pu(e,Sr):Za(e)?[e]:bd(Ir(ac(e)))},kt.toPlainObject=rc,kt.transform=function(e,u,t){var n=Pa(e),d=n||La(e)||Qa(e);if(u=Zd(u,4),null==t){var r=e&&e.constructor;t=d?n?new r:[]:Wa(e)&&Da(r)?jt(qe(e)):{}}return(d?cu:cn)(e,(function(e,n,d){return u(t,e,n,d)})),t},kt.unary=function(e){return ha(e,1)},kt.union=$r,kt.unionBy=Gr,kt.unionWith=qr,kt.uniq=function(e){return e&&e.length?Yn(e):[]},kt.uniqBy=function(e,u){return e&&e.length?Yn(e,Zd(u,2)):[]},kt.uniqWith=function(e,u){return u="function"==typeof u?u:void 0,e&&e.length?Yn(e,void 0,u):[]},kt.unset=function(e,u){return null==e||Xn(e,u)},kt.unzip=Hr,kt.unzipWith=Kr,kt.update=function(e,u,t){return null==e?e:ed(e,u,ad(t))},kt.updateWith=function(e,u,t,n){return n="function"==typeof n?n:void 0,null==e?e:ed(e,u,ad(t),n)},kt.values=jc,kt.valuesIn=function(e){return null==e?[]:Cu(e,_c(e))},kt.without=Vr,kt.words=Dc,kt.wrap=function(e,u){return Sa(ad(u),e)},kt.xor=Jr,kt.xorBy=Zr,kt.xorWith=Qr,kt.zip=Yr,kt.zipObject=function(e,u){return dd(e||[],u||[],Wt)},kt.zipObjectDeep=function(e,u){return dd(e||[],u||[],zn)},kt.zipWith=Xr,kt.entries=Ac,kt.entriesIn=kc,kt.extend=oc,kt.extendWith=ic,Jc(kt,kt),kt.add=ao,kt.attempt=Uc,kt.camelCase=Oc,kt.capitalize=Nc,kt.ceil=co,kt.clamp=function(e,u,t){return void 0===t&&(t=u,u=void 0),void 0!==t&&(t=(t=dc(t))==t?t:0),void 0!==u&&(u=(u=dc(u))==u?u:0),Vt(dc(e),u,t)},kt.clone=function(e){return Jt(e,4)},kt.cloneDeep=function(e){return Jt(e,5)},kt.cloneDeepWith=function(e,u){return Jt(e,5,u="function"==typeof u?u:void 0)},kt.cloneWith=function(e,u){return Jt(e,4,u="function"==typeof u?u:void 0)},kt.conformsTo=function(e,u){return null==u||Zt(e,u,gc(u))},kt.deburr=Cc,kt.defaultTo=function(e,u){return null==e||e!=e?u:e},kt.divide=oo,kt.endsWith=function(e,u,t){e=ac(e),u=Qn(u);var n=e.length,d=t=void 0===t?n:Vt(tc(t),0,n);return(t-=u.length)>=0&&e.slice(t,d)==u},kt.eq=ja,kt.escape=function(e){return(e=ac(e))&&D.test(e)?e.replace(F,Fu):e},kt.escapeRegExp=function(e){return(e=ac(e))&&K.test(e)?e.replace(H,"\\$&"):e},kt.every=function(e,u,t){var n=Pa(e)?iu:un;return t&&cr(e,u,t)&&(u=void 0),n(e,Zd(u,3))},kt.find=da,kt.findIndex=Cr,kt.findKey=function(e,u){return gu(e,Zd(u,3),cn)},kt.findLast=ra,kt.findLastIndex=Pr,kt.findLastKey=function(e,u){return gu(e,Zd(u,3),on)},kt.floor=io,kt.forEach=aa,kt.forEachRight=ca,kt.forIn=function(e,u){return null==e?e:rn(e,Zd(u,3),_c)},kt.forInRight=function(e,u){return null==e?e:an(e,Zd(u,3),_c)},kt.forOwn=function(e,u){return e&&cn(e,Zd(u,3))},kt.forOwnRight=function(e,u){return e&&on(e,Zd(u,3))},kt.get=mc,kt.gt=Oa,kt.gte=Na,kt.has=function(e,u){return null!=e&&nr(e,u,hn)},kt.hasIn=hc,kt.head=Mr,kt.identity=qc,kt.includes=function(e,u,t,n){e=Ma(e)?e:jc(e),t=t&&!n?tc(t):0;var d=e.length;return t<0&&(t=rt(d+t,0)),Ja(e)?t<=d&&e.indexOf(u,t)>-1:!!d&&xu(e,u,t)>-1},kt.indexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=null==t?0:tc(t);return d<0&&(d=rt(n+d,0)),xu(e,u,d)},kt.inRange=function(e,u,t){return u=uc(u),void 0===t?(t=u,u=0):t=uc(t),function(e,u,t){return e>=at(u,t)&&e=-9007199254740991&&e<=9007199254740991},kt.isSet=Va,kt.isString=Ja,kt.isSymbol=Za,kt.isTypedArray=Qa,kt.isUndefined=function(e){return void 0===e},kt.isWeakMap=function(e){return $a(e)&&tr(e)==w},kt.isWeakSet=function(e){return $a(e)&&"[object WeakSet]"==pn(e)},kt.join=function(e,u){return null==e?"":nt.call(e,u)},kt.kebabCase=Pc,kt.last=Br,kt.lastIndexOf=function(e,u,t){var n=null==e?0:e.length;if(!n)return-1;var d=n;return void 0!==t&&(d=(d=tc(t))<0?rt(n+d,0):at(d,n-1)),u==u?function(e,u,t){for(var n=t+1;n--;)if(e[n]===u)return n;return n}(e,u,d):_u(e,Eu,d,!0)},kt.lowerCase=Tc,kt.lowerFirst=Mc,kt.lt=Ya,kt.lte=Xa,kt.max=function(e){return e&&e.length?tn(e,qc,mn):void 0},kt.maxBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),mn):void 0},kt.mean=function(e){return Iu(e,qc)},kt.meanBy=function(e,u){return Iu(e,Zd(u,2))},kt.min=function(e){return e&&e.length?tn(e,qc,An):void 0},kt.minBy=function(e,u){return e&&e.length?tn(e,Zd(u,2),An):void 0},kt.stubArray=no,kt.stubFalse=ro,kt.stubObject=function(){return{}},kt.stubString=function(){return""},kt.stubTrue=function(){return!0},kt.multiply=lo,kt.nth=function(e,u){return e&&e.length?Cn(e,tc(u)):void 0},kt.noConflict=function(){return Ke._===this&&(Ke._=Oe),this},kt.noop=Zc,kt.now=ma,kt.pad=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;if(!u||n>=u)return e;var d=(u-n)/2;return Pd(Xu(d),t)+e+Pd(Yu(d),t)},kt.padEnd=function(e,u,t){e=ac(e);var n=(u=tc(u))?qu(e):0;return u&&nu){var n=e;e=u,u=n}if(t||e%1||u%1){var d=it();return at(e+d*(u-e+$e("1e-"+((d+"").length-1))),u)}return Ln(e,u)},kt.reduce=function(e,u,t){var n=Pa(e)?hu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,Xt)},kt.reduceRight=function(e,u,t){var n=Pa(e)?vu:ku,d=arguments.length<3;return n(e,Zd(u,4),t,d,en)},kt.repeat=function(e,u,t){return u=(t?cr(e,u,t):void 0===u)?1:tc(u),Fn(ac(e),u)},kt.replace=function(){var e=arguments,u=ac(e[0]);return e.length<3?u:u.replace(e[1],e[2])},kt.result=function(e,u,t){var n=-1,d=(u=cd(u,e)).length;for(d||(d=1,e=void 0);++n9007199254740991)return[];var t=4294967295,n=at(e,4294967295);e-=4294967295;for(var d=Ou(n,u=Zd(u));++t=r)return e;var c=t-qu(n);if(c<1)return n;var o=a?id(a,0,c).join(""):e.slice(0,c);if(void 0===d)return o+n;if(a&&(c+=o.length-c),Ka(d)){if(e.slice(c).search(d)){var i,f=o;for(d.global||(d=ve(d.source,ac(ne.exec(d))+"g")),d.lastIndex=0;i=d.exec(f);)var l=i.index;o=o.slice(0,void 0===l?c:l)}}else if(e.indexOf(Qn(d),c)!=c){var s=o.lastIndexOf(d);s>-1&&(o=o.slice(0,s))}return o+n},kt.unescape=function(e){return(e=ac(e))&&B.test(e)?e.replace(L,Ku):e},kt.uniqueId=function(e){var u=++Se;return ac(e)+u},kt.upperCase=Fc,kt.upperFirst=Bc,kt.each=aa,kt.eachRight=ca,kt.first=Mr,Jc(kt,(fo={},cn(kt,(function(e,u){Ie.call(kt.prototype,u)||(fo[u]=e)})),fo),{chain:!1}),kt.VERSION="4.17.15",cu(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){kt[e].placeholder=kt})),cu(["drop","take"],(function(e,u){Ct.prototype[e]=function(t){t=void 0===t?1:rt(tc(t),0);var n=this.__filtered__&&!u?new Ct(this):this.clone();return n.__filtered__?n.__takeCount__=at(t,n.__takeCount__):n.__views__.push({size:at(t,4294967295),type:e+(n.__dir__<0?"Right":"")}),n},Ct.prototype[e+"Right"]=function(u){return this.reverse()[e](u).reverse()}})),cu(["filter","map","takeWhile"],(function(e,u){var t=u+1,n=1==t||3==t;Ct.prototype[e]=function(e){var u=this.clone();return u.__iteratees__.push({iteratee:Zd(e,3),type:t}),u.__filtered__=u.__filtered__||n,u}})),cu(["head","last"],(function(e,u){var t="take"+(u?"Right":"");Ct.prototype[e]=function(){return this[t](1).value()[0]}})),cu(["initial","tail"],(function(e,u){var t="drop"+(u?"":"Right");Ct.prototype[e]=function(){return this.__filtered__?new Ct(this):this[t](1)}})),Ct.prototype.compact=function(){return this.filter(qc)},Ct.prototype.find=function(e){return this.filter(e).head()},Ct.prototype.findLast=function(e){return this.reverse().find(e)},Ct.prototype.invokeMap=Bn((function(e,u){return"function"==typeof e?new Ct(this):this.map((function(t){return yn(t,e,u)}))})),Ct.prototype.reject=function(e){return this.filter(Ea(Zd(e)))},Ct.prototype.slice=function(e,u){e=tc(e);var t=this;return t.__filtered__&&(e>0||u<0)?new Ct(t):(e<0?t=t.takeRight(-e):e&&(t=t.drop(e)),void 0!==u&&(t=(u=tc(u))<0?t.dropRight(-u):t.take(u-e)),t)},Ct.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},Ct.prototype.toArray=function(){return this.take(4294967295)},cn(Ct.prototype,(function(e,u){var t=/^(?:filter|find|map|reject)|While$/.test(u),n=/^(?:head|last)$/.test(u),d=kt[n?"take"+("last"==u?"Right":""):u],r=n||/^find/.test(u);d&&(kt.prototype[u]=function(){var u=this.__wrapped__,a=n?[1]:arguments,c=u instanceof Ct,o=a[0],i=c||Pa(u),f=function(e){var u=d.apply(kt,mu([e],a));return n&&l?u[0]:u};i&&t&&"function"==typeof o&&1!=o.length&&(c=i=!1);var l=this.__chain__,s=!!this.__actions__.length,p=r&&!l,m=c&&!s;if(!r&&i){u=m?u:new Ct(this);var h=e.apply(u,a);return h.__actions__.push({func:ua,args:[f],thisArg:void 0}),new Nt(h,l)}return p&&m?e.apply(this,a):(h=this.thru(f),p?n?h.value()[0]:h.value():h)})})),cu(["pop","push","shift","sort","splice","unshift"],(function(e){var u=ge[e],t=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);kt.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var d=this.value();return u.apply(Pa(d)?d:[],e)}return this[t]((function(t){return u.apply(Pa(t)?t:[],e)}))}})),cn(Ct.prototype,(function(e,u){var t=kt[u];if(t){var n=t.name+"";Ie.call(yt,n)||(yt[n]=[]),yt[n].push({name:u,func:t})}})),yt[jd(void 0,2).name]=[{name:"wrapper",func:void 0}],Ct.prototype.clone=function(){var e=new Ct(this.__wrapped__);return e.__actions__=bd(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=bd(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=bd(this.__views__),e},Ct.prototype.reverse=function(){if(this.__filtered__){var e=new Ct(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},Ct.prototype.value=function(){var e=this.__wrapped__.value(),u=this.__dir__,t=Pa(e),n=u<0,d=t?e.length:0,r=function(e,u,t){var n=-1,d=t.length;for(;++n=this.__values__.length;return{done:e,value:e?void 0:this.__values__[this.__index__++]}},kt.prototype.plant=function(e){for(var u,t=this;t instanceof Ot;){var n=kr(t);n.__index__=0,n.__values__=void 0,u?d.__wrapped__=n:u=n;var d=n;t=t.__wrapped__}return d.__wrapped__=e,u},kt.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof Ct){var u=e;return this.__actions__.length&&(u=new Ct(this)),(u=u.reverse()).__actions__.push({func:ua,args:[Wr],thisArg:void 0}),new Nt(u,this.__chain__)}return this.thru(Wr)},kt.prototype.toJSON=kt.prototype.valueOf=kt.prototype.value=function(){return td(this.__wrapped__,this.__actions__)},kt.prototype.first=kt.prototype.head,Ye&&(kt.prototype[Ye]=function(){return this}),kt}();Ke._=Vu,void 0===(d=function(){return Vu}.call(u,t,u,n))||(n.exports=d)}).call(this)}).call(this,t(76),t(456)(e))},454:function(e,u,t){"use strict";var n=t(0),d=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});u.a=d},456:function(e,u){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},469:function(e,u,t){"use strict";var n=SyntaxError,d=Function,r=TypeError,a=function(e){try{return d('"use strict"; return ('+e+").constructor;")()}catch(u){}},c=Object.getOwnPropertyDescriptor;if(c)try{c({},"")}catch(k){c=null}var o=function(){throw new r},i=c?function(){try{return o}catch(e){try{return c(arguments,"callee").get}catch(u){return o}}}():o,f=t(507)(),l=Object.getPrototypeOf||function(e){return e.__proto__},s={},p="undefined"==typeof Uint8Array?void 0:l(Uint8Array),m={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?l([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":s,"%AsyncGenerator%":s,"%AsyncGeneratorFunction%":s,"%AsyncIteratorPrototype%":s,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":d,"%GeneratorFunction%":s,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?l(l([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?l((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?l((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?l(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":i,"%TypedArray%":p,"%TypeError%":r,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},v=t(470),b=t(510),y=v.call(Function.call,Array.prototype.concat),g=v.call(Function.apply,Array.prototype.splice),_=v.call(Function.call,String.prototype.replace),x=v.call(Function.call,String.prototype.slice),w=v.call(Function.call,RegExp.prototype.exec),E=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,I=/\\(\\)?/g,S=function(e){var u=x(e,0,1),t=x(e,-1);if("%"===u&&"%"!==t)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===t&&"%"!==u)throw new n("invalid intrinsic syntax, expected opening `%`");var d=[];return _(e,E,(function(e,u,t,n){d[d.length]=t?_(n,I,"$1"):u||e})),d},A=function(e,u){var t,d=e;if(b(h,d)&&(d="%"+(t=h[d])[0]+"%"),b(m,d)){var c=m[d];if(c===s&&(c=function e(u){var t;if("%AsyncFunction%"===u)t=a("async function () {}");else if("%GeneratorFunction%"===u)t=a("function* () {}");else if("%AsyncGeneratorFunction%"===u)t=a("async function* () {}");else if("%AsyncGenerator%"===u){var n=e("%AsyncGeneratorFunction%");n&&(t=n.prototype)}else if("%AsyncIteratorPrototype%"===u){var d=e("%AsyncGenerator%");d&&(t=l(d.prototype))}return m[u]=t,t}(d)),void 0===c&&!u)throw new r("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:t,name:d,value:c}}throw new n("intrinsic "+e+" does not exist!")};e.exports=function(e,u){if("string"!=typeof e||0===e.length)throw new r("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof u)throw new r('"allowMissing" argument must be a boolean');if(null===w(/^%?[^%]*%?$/,e))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var t=S(e),d=t.length>0?t[0]:"",a=A("%"+d+"%",u),o=a.name,i=a.value,f=!1,l=a.alias;l&&(d=l[0],g(t,y([0,1],l)));for(var s=1,p=!0;s=t.length){var E=c(i,h);i=(p=!!E)&&"get"in E&&!("originalValue"in E.get)?E.get:i[h]}else p=b(i,h),i=i[h];p&&!f&&(m[o]=i)}}return i}},470:function(e,u,t){"use strict";var n=t(509);e.exports=Function.prototype.bind||n},471:function(e,u,t){"use strict";var n=String.prototype.replace,d=/%20/g,r="RFC1738",a="RFC3986";e.exports={default:a,formatters:{RFC1738:function(e){return n.call(e,d,"+")},RFC3986:function(e){return String(e)}},RFC1738:r,RFC3986:a}},478:function(e,u,t){"use strict";var n=t(471),d=Object.prototype.hasOwnProperty,r=Array.isArray,a=function(){for(var e=[],u=0;u<256;++u)e.push("%"+((u<16?"0":"")+u.toString(16)).toUpperCase());return e}(),c=function(e,u){for(var t=u&&u.plainObjects?Object.create(null):{},n=0;n1;){var u=e.pop(),t=u.obj[u.prop];if(r(t)){for(var n=[],d=0;d=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||r===n.RFC1738&&(40===f||41===f)?o+=c.charAt(i):f<128?o+=a[f]:f<2048?o+=a[192|f>>6]+a[128|63&f]:f<55296||f>=57344?o+=a[224|f>>12]+a[128|f>>6&63]+a[128|63&f]:(i+=1,f=65536+((1023&f)<<10|1023&c.charCodeAt(i)),o+=a[240|f>>18]+a[128|f>>12&63]+a[128|f>>6&63]+a[128|63&f])}return o},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,u){if(r(e)){for(var t=[],n=0;n{if("string"!=typeof e)throw new TypeError("Expected a string");return e=(e=(e=n(e)).toLowerCase().replace(/[_-]+/g," ").replace(/\s{2,}/g," ").trim()).charAt(0).toUpperCase()+e.slice(1)};e.exports=d,e.exports.default=d},486:function(e,u){e.exports=Object.is||function(e,u){return e===u?0!==e||1/e==1/u:e!=e&&u!=u}},489:function(e,u,t){"use strict";var n=t(30),d=t(12),r=t(27),a=t(91),c=t(92),o=t(26),i=t(545),f=t(93);d(d.S+d.F*!t(83)((function(e){Array.from(e)})),"Array",{from:function(e){var u,t,d,l,s=r(e),p="function"==typeof this?this:Array,m=arguments.length,h=m>1?arguments[1]:void 0,v=void 0!==h,b=0,y=f(s);if(v&&(h=n(h,m>2?arguments[2]:void 0,2)),null==y||p==Array&&c(y))for(t=new p(u=o(s.length));u>b;b++)i(t,b,v?h(s[b],b):s[b]);else for(l=y.call(s),t=new p;!(d=l.next()).done;b++)i(t,b,v?a(l,h,[d.value,b],!0):d.value);return t.length=b,t}})},490:function(e,u,t){"use strict";var n=t(546),d=t(492);e.exports=t(547)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return n.def(d(this,"Set"),e=0===e?0:e,e)}},n)},491:function(e,u,t){var n=t(40)("meta"),d=t(13),r=t(31),a=t(28).f,c=0,o=Object.isExtensible||function(){return!0},i=!t(14)((function(){return o(Object.preventExtensions({}))})),f=function(e){a(e,n,{value:{i:"O"+ ++c,w:{}}})},l=e.exports={KEY:n,NEED:!1,fastKey:function(e,u){if(!d(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!r(e,n)){if(!o(e))return"F";if(!u)return"E";f(e)}return e[n].i},getWeak:function(e,u){if(!r(e,n)){if(!o(e))return!0;if(!u)return!1;f(e)}return e[n].w},onFreeze:function(e){return i&&l.NEED&&o(e)&&!r(e,n)&&f(e),e}}},492:function(e,u,t){var n=t(13);e.exports=function(e,u){if(!n(e)||e._t!==u)throw TypeError("Incompatible receiver, "+u+" required!");return e}},493:function(e,u,t){"use strict";const n=t(494);e.exports=(e,u)=>{if("string"!=typeof e)throw new TypeError("Expected a string");u=void 0===u?"_":u;const t=n("([\\p{Ll}\\d])(\\p{Lu})","g"),d=n("(\\p{Lu}+)(\\p{Lu}[\\p{Ll}\\d]+)","g");return e.replace(t,`$1${u}$2`).replace(d,`$1${u}$2`).toLowerCase()}},494:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n=l(t(495)),d=l(t(496)),r=l(t(497)),a=l(t(498)),c=l(t(499)),o=l(t(500)),i=l(t(501)),f=l(t(502));function l(e){return e&&e.__esModule?e:{default:e}}(0,d.default)(n.default),(0,r.default)(n.default),(0,a.default)(n.default),(0,c.default)(n.default),(0,o.default)(n.default),(0,i.default)(n.default),(0,f.default)(n.default),u.default=n.default,e.exports=u.default},495:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0});var n={astral:!1},d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},a={},c={},o=[],i={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},f=/\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g,l=void 0===d.exec.call(/()??/,"")[1],s=void 0!==/x/.flags,p={}.toString;function m(e){var u=!0;try{new RegExp("",e)}catch(t){u=!1}return u}var h=m("u"),v=m("y"),b={g:!0,i:!0,m:!0,u:h,y:v};function y(e,u,t,n,d){var r=void 0;if(e.xregexp={captureNames:u},d)return e;if(e.__proto__)e.__proto__=C.prototype;else for(r in C.prototype)e[r]=C.prototype[r];return e.xregexp.source=t,e.xregexp.flags=n?n.split("").sort().join(""):n,e}function g(e){return d.replace.call(e,/([\s\S])(?=[\s\S]*\1)/g,"")}function _(e,u){if(!C.isRegExp(e))throw new TypeError("Type RegExp expected");var t=e.xregexp||{},n=function(e){return s?e.flags:d.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(e))[1]}(e),r="",a="",c=null,o=null;return(u=u||{}).removeG&&(a+="g"),u.removeY&&(a+="y"),a&&(n=d.replace.call(n,new RegExp("["+a+"]+","g"),"")),u.addG&&(r+="g"),u.addY&&(r+="y"),r&&(n=g(n+r)),u.isInternalOnly||(void 0!==t.source&&(c=t.source),null!=t.flags&&(o=r?g(t.flags+r):t.flags)),e=y(new RegExp(u.source||e.source,n),function(e){return!(!e.xregexp||!e.xregexp.captureNames)}(e)?t.captureNames.slice(0):null,c,o,u.isInternalOnly)}function x(e){return parseInt(e,16)}function w(e,u,t){return"("===e.input[e.index-1]||")"===e.input[e.index+e[0].length]||function(e,u,t){return d.test.call(-1!==t.indexOf("x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/,e.slice(u))}(e.input,e.index+e[0].length,t)?"":"(?:)"}function E(e){return parseInt(e,10).toString(16)}function I(e,u){return p.call(e)==="[object "+u+"]"}function S(e){for(;e.length<4;)e="0"+e;return e}function A(e){var u={};return I(e,"String")?(C.forEach(e,/[^\s,]+/,(function(e){u[e]=!0})),u):e}function k(e){if(!/^[\w$]$/.test(e))throw new Error("Flag must be a single character A-Za-z0-9_$");b[e]=!0}function j(e,u,t,n,d){for(var r=o.length,a=e[t],c=null,i=void 0,f=void 0;r--;)if(!((f=o[r]).leadChar&&f.leadChar!==a||f.scope!==n&&"all"!==f.scope||f.flag&&-1===u.indexOf(f.flag))&&(i=C.exec(e,f.regex,t,"sticky"))){c={matchLength:i[0].length,output:f.handler.call(d,i,n,u),reparse:f.reparse};break}return c}function O(e){n.astral=e}function N(e){if(null==e)throw new TypeError("Cannot convert null or undefined to object");return e}function C(e,u){if(C.isRegExp(e)){if(void 0!==u)throw new TypeError("Cannot supply flags when copying a RegExp");return _(e)}if(e=void 0===e?"":String(e),u=void 0===u?"":String(u),C.isInstalled("astral")&&-1===u.indexOf("A")&&(u+="A"),c[e]||(c[e]={}),!c[e][u]){for(var t={hasNamedCapture:!1,captureNames:[]},n="default",r="",a=0,o=void 0,f=function(e,u){var t=void 0;if(g(u)!==u)throw new SyntaxError("Invalid duplicate regex flag "+u);for(e=d.replace.call(e,/^\(\?([\w$]+)\)/,(function(e,t){if(d.test.call(/[gy]/,t))throw new SyntaxError("Cannot use flag g or y in mode modifier "+e);return u=g(u+t),""})),t=0;t"}else if(t)return"\\"+(+t+a);return e}if(!I(e,"Array")||!e.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var i=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,f=[],l=void 0,s=0;s1&&-1!==t.indexOf("")){var n=_(this,{removeG:!0,isInternalOnly:!0});d.replace.call(String(e).slice(t.index),n,(function(){for(var e=arguments.length,u=Array(e),n=0;nt.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=u),t},r.test=function(e){return!!r.exec.call(this,e)},r.match=function(e){if(C.isRegExp(e)){if(e.global){var u=d.match.apply(this,arguments);return e.lastIndex=0,u}}else e=new RegExp(e);return r.exec.call(e,N(this))},r.replace=function(e,u){var t=C.isRegExp(e),n=void 0,r=void 0,a=void 0;return t?(e.xregexp&&(r=e.xregexp.captureNames),n=e.lastIndex):e+="",a=I(u,"Function")?d.replace.call(String(this),e,(function(){for(var n=arguments.length,d=Array(n),a=0;at.length-3)throw new SyntaxError("Backreference to undefined group "+e);return t[d]||""}throw new SyntaxError("Invalid token "+e)}})),t&&(e.global?e.lastIndex=0:e.lastIndex=n),a},r.split=function(e,u){if(!C.isRegExp(e))return d.split.apply(this,arguments);var t=String(this),n=[],r=e.lastIndex,a=0,c=void 0;return u=(void 0===u?-1:u)>>>0,C.forEach(t,e,(function(e){e.index+e[0].length>a&&(n.push(t.slice(a,e.index)),e.length>1&&e.indexu?n.slice(0,u):n},C.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(e,u){if("B"===e[1]&&"default"===u)return e[0];throw new SyntaxError("Invalid escape "+e[0])}),{scope:"all",leadChar:"\\"}),C.addToken(/\\u{([\dA-Fa-f]+)}/,(function(e,u,t){var n=x(e[1]);if(n>1114111)throw new SyntaxError("Invalid Unicode code point "+e[0]);if(n<=65535)return"\\u"+S(E(n));if(h&&-1!==t.indexOf("u"))return e[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),C.addToken(/\[(\^?)\]/,(function(e){return e[1]?"[\\s\\S]":"\\b\\B"}),{leadChar:"["}),C.addToken(/\(\?#[^)]*\)/,w,{leadChar:"("}),C.addToken(/\s+|#[^\n]*\n?/,w,{flag:"x"}),C.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),C.addToken(/\\k<([\w$]+)>/,(function(e){var u=isNaN(e[1])?this.captureNames.indexOf(e[1])+1:+e[1],t=e.index+e[0].length;if(!u||u>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+e[0]);return"\\"+u+(t===e.input.length||isNaN(e.input[t])?"":"(?:)")}),{leadChar:"\\"}),C.addToken(/\\(\d+)/,(function(e,u){if(!("default"===u&&/^[1-9]/.test(e[1])&&+e[1]<=this.captureNames.length)&&"0"!==e[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+e[0]);return e[0]}),{scope:"all",leadChar:"\\"}),C.addToken(/\(\?P?<([\w$]+)>/,(function(e){if(!isNaN(e[1]))throw new SyntaxError("Cannot use integer as capture name "+e[0]);if("length"===e[1]||"__proto__"===e[1])throw new SyntaxError("Cannot use reserved word as capture name "+e[0]);if(-1!==this.captureNames.indexOf(e[1]))throw new SyntaxError("Cannot use same name for multiple groups "+e[0]);return this.captureNames.push(e[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),C.addToken(/\((?!\?)/,(function(e,u,t){return-1!==t.indexOf("n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("}),u.default=C,e.exports=u.default},496:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,t=e.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,u],"g",{conjunction:"or"});function n(e){var u=/^(?:\(\?:\))*\^/,t=/\$(?:\(\?:\))*$/;return u.test(e)&&t.test(e)&&t.test(e.replace(/\\[\s\S]/g,""))?e.replace(u,"").replace(t,""):e}function d(u,t){var n=t?"x":"";return e.isRegExp(u)?u.xregexp&&u.xregexp.captureNames?u:e(u.source,n):e(u,n)}function r(u){return u instanceof RegExp?u:e.escape(u)}function a(e,u,t){return e["subpattern"+t]=u,e}function c(e,u,t){return e+(u1?n-1:0),o=1;o"):o="(?:",h=m,""+o+f[a].pattern.replace(u,(function(e,u,t){if(u){if(c=f[a].names[m-h],++m,c)return"(?<"+c+">"}else if(t)return i=+t-1,f[a].names[i]?"\\k<"+f[a].names[i]+">":"\\"+(+t+h);return e}))+")"}if(d){if(c=y[v],b[++v]=++m,c)return"(?<"+c+">"}else if(r)return y[i=+r-1]?"\\k<"+y[i]+">":"\\"+b[+r];return e}));return e(g,c)}},e.exports=u.default},497:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){function u(e,u,t,n){return{name:e,value:u,start:t,end:n}}e.matchRecursive=function(t,n,d,r,a){a=a||{};var c=-1!==(r=r||"").indexOf("g"),o=-1!==r.indexOf("y"),i=r.replace(/y/g,""),f=a.escapeChar,l=a.valueNames,s=[],p=0,m=0,h=0,v=0,b=void 0,y=void 0,g=void 0,_=void 0,x=void 0;if(n=e(n,i),d=e(d,i),f){if(f.length>1)throw new Error("Cannot use more than one escape character");f=e.escape(f),x=new RegExp("(?:"+f+"[\\S\\s]|(?:(?!"+e.union([n,d],"",{conjunction:"or"}).source+")[^"+f+"])+)+",r.replace(/[^imu]+/g,""))}for(;;){if(f&&(h+=(e.exec(t,x,h,"sticky")||[""])[0].length),g=e.exec(t,n,h),_=e.exec(t,d,h),g&&_&&(g.index<=_.index?_=null:g=null),g||_)h=(m=(g||_).index)+(g||_)[0].length;else if(!p)break;if(o&&!p&&m>v)break;if(g)p||(b=m,y=h),++p;else{if(!_||!p)throw new Error("Unbalanced delimiter found in string");if(!--p&&(l?(l[0]&&b>v&&s.push(u(l[0],t.slice(v,b),v,b)),l[1]&&s.push(u(l[1],t.slice(b,y),b,y)),l[2]&&s.push(u(l[2],t.slice(y,m),y,m)),l[3]&&s.push(u(l[3],t.slice(m,h),m,h))):s.push(t.slice(y,m)),v=h,!c))break}m===h&&++h}return c&&!o&&l&&l[0]&&t.length>v&&s.push(u(l[0],t.slice(v),v,t.length)),s}},e.exports=u.default},498:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){var u={},t=e._dec,n=e._hex,d=e._pad4;function r(e){return e.replace(/[- _]+/g,"").toLowerCase()}function a(e){var u=/^\\[xu](.+)/.exec(e);return u?t(u[1]):e.charCodeAt("\\"===e[0]?1:0)}function c(t){var r,c,o;return u[t]["b!"]||(u[t]["b!"]=(r=u[t].bmp,c="",o=-1,e.forEach(r,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(e){var u=a(e[1]);u>o+1&&(c+="\\u"+d(n(o+1)),u>o+2&&(c+="-\\u"+d(n(u-1)))),o=a(e[2]||e[1])})),o<65535&&(c+="\\u"+d(n(o+1)),o<65534&&(c+="-\\uFFFF")),c))}function o(e,t){var n=t?"a!":"a=";return u[e][n]||(u[e][n]=function(e,t){var n=u[e],d="";return n.bmp&&!n.isBmpLast&&(d="["+n.bmp+"]"+(n.astral?"|":"")),n.astral&&(d+=n.astral),n.isBmpLast&&n.bmp&&(d+=(n.astral?"|":"")+"["+n.bmp+"]"),t?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-\uffff]))":"(?:"+d+")"}(e,t))}e.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,(function(e,t,n){var d="P"===e[1]||!!e[2],a=-1!==n.indexOf("A"),i=r(e[4]||e[3]),f=u[i];if("P"===e[1]&&e[2])throw new SyntaxError("Invalid double negation "+e[0]);if(!u.hasOwnProperty(i))throw new SyntaxError("Unknown Unicode token "+e[0]);if(f.inverseOf){if(i=r(f.inverseOf),!u.hasOwnProperty(i))throw new ReferenceError("Unicode token missing data "+e[0]+" -> "+f.inverseOf);f=u[i],d=!d}if(!f.bmp&&!a)throw new SyntaxError("Astral mode required for Unicode token "+e[0]);if(a){if("class"===t)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return o(i,d)}return"class"===t?d?c(i):f.bmp:(d?"[^":"[")+f.bmp+"]"}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),e.addUnicodeData=function(t){for(var n=void 0,d=0;d\\x5E`\\x7C~\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\xa2-\xa5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\xa6\xa9\xae\xb0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"},{name:"Z",alias:"Separator",bmp:" \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \xa0\u1680\u2000-\u200a\u202f\u205f\u3000"}])},e.exports=u.default},501:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var u=[{name:"ASCII",bmp:"\0-\x7f"},{name:"Alphabetic",bmp:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\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\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\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\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\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]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\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[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Any",isBmpLast:!0,bmp:"\0-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\xad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point",bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"},{name:"White_Space",bmp:"\t-\r \x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];u.push({name:"Assigned",inverseOf:"Cn"}),e.addUnicodeData(u)},e.exports=u.default},502:function(e,u,t){"use strict";Object.defineProperty(u,"__esModule",{value:!0}),u.default=function(e){if(!e.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");e.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"},{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\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\udef0\udef1]"},{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"},{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"},{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\0-@\\x5B-`\\x7B-\xa9\xab-\xb9\xbb-\xbf\xd7\xf7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd",astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\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-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"},{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan",astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\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\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"},{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek",bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"},{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"},{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"},{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"},{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"},{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"},{name:"Latin",bmp:"A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"},{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"},{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"},{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"},{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"},{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian",astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"},{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"},{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"},{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])},e.exports=u.default},503:function(e,u,t){"use strict";var n=t(0),d=t.n(n);u.a=function(e){var u=e.text;return d.a.createElement("section",{className:"empty"},d.a.createElement("div",{className:"icon"},d.a.createElement("img",{src:"/img/logo-square.svg",alt:"The Qovery Logo"})),d.a.createElement("div",{className:"text"},u))}},504:function(e,u,t){"use strict";var n=t(505),d=t(515),r=t(471);e.exports={formats:r,parse:d,stringify:n}},505:function(e,u,t){"use strict";var n=t(506),d=t(478),r=t(471),a=Object.prototype.hasOwnProperty,c={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,u){return e+"["+u+"]"},repeat:function(e){return e}},o=Array.isArray,i=String.prototype.split,f=Array.prototype.push,l=function(e,u){f.apply(e,o(u)?u:[u])},s=Date.prototype.toISOString,p=r.default,m={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:d.encode,encodeValuesOnly:!1,format:p,formatter:r.formatters[p],indices:!1,serializeDate:function(e){return s.call(e)},skipNulls:!1,strictNullHandling:!1},h={},v=function e(u,t,r,a,c,f,s,p,v,b,y,g,_,x,w,E){for(var I,S=u,A=E,k=0,j=!1;void 0!==(A=A.get(h))&&!j;){var O=A.get(u);if(k+=1,void 0!==O){if(O===k)throw new RangeError("Cyclic object value");j=!0}void 0===A.get(h)&&(k=0)}if("function"==typeof p?S=p(t,S):S instanceof Date?S=y(S):"comma"===r&&o(S)&&(S=d.maybeMap(S,(function(e){return e instanceof Date?y(e):e}))),null===S){if(c)return s&&!x?s(t,m.encoder,w,"key",g):t;S=""}if("string"==typeof(I=S)||"number"==typeof I||"boolean"==typeof I||"symbol"==typeof I||"bigint"==typeof I||d.isBuffer(S)){if(s){var N=x?t:s(t,m.encoder,w,"key",g);if("comma"===r&&x){for(var C=i.call(String(S),","),P="",T=0;T0?S.join(",")||null:void 0}];else if(o(p))M=p;else{var L=Object.keys(S);M=v?L.sort(v):L}for(var F=a&&o(S)&&1===S.length?t+"[]":t,B=0;B0?x+_:""}},506:function(e,u,t){"use strict";var n=t(469),d=t(511),r=t(513),a=n("%TypeError%"),c=n("%WeakMap%",!0),o=n("%Map%",!0),i=d("WeakMap.prototype.get",!0),f=d("WeakMap.prototype.set",!0),l=d("WeakMap.prototype.has",!0),s=d("Map.prototype.get",!0),p=d("Map.prototype.set",!0),m=d("Map.prototype.has",!0),h=function(e,u){for(var t,n=e;null!==(t=n.next);n=t)if(t.key===u)return n.next=t.next,t.next=e.next,e.next=t,t};e.exports=function(){var e,u,t,n={assert:function(e){if(!n.has(e))throw new a("Side channel does not contain "+r(e))},get:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return i(e,n)}else if(o){if(u)return s(u,n)}else if(t)return function(e,u){var t=h(e,u);return t&&t.value}(t,n)},has:function(n){if(c&&n&&("object"==typeof n||"function"==typeof n)){if(e)return l(e,n)}else if(o){if(u)return m(u,n)}else if(t)return function(e,u){return!!h(e,u)}(t,n);return!1},set:function(n,d){c&&n&&("object"==typeof n||"function"==typeof n)?(e||(e=new c),f(e,n,d)):o?(u||(u=new o),p(u,n,d)):(t||(t={key:{},next:null}),function(e,u,t){var n=h(e,u);n?n.value=t:e.next={key:u,next:e.next,value:t}}(t,n,d))}};return n}},507:function(e,u,t){"use strict";var n="undefined"!=typeof Symbol&&Symbol,d=t(508);e.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&d())))}},508:function(e,u,t){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},u=Symbol("test"),t=Object(u);if("string"==typeof u)return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;for(u in e[u]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var n=Object.getOwnPropertySymbols(e);if(1!==n.length||n[0]!==u)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,u))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var d=Object.getOwnPropertyDescriptor(e,u);if(42!==d.value||!0!==d.enumerable)return!1}return!0}},509:function(e,u,t){"use strict";var n="Function.prototype.bind called on incompatible ",d=Array.prototype.slice,r=Object.prototype.toString;e.exports=function(e){var u=this;if("function"!=typeof u||"[object Function]"!==r.call(u))throw new TypeError(n+u);for(var t,a=d.call(arguments,1),c=function(){if(this instanceof t){var n=u.apply(this,a.concat(d.call(arguments)));return Object(n)===n?n:this}return u.apply(e,a.concat(d.call(arguments)))},o=Math.max(0,u.length-a.length),i=[],f=0;f-1?d(t):t}},512:function(e,u,t){"use strict";var n=t(470),d=t(469),r=d("%Function.prototype.apply%"),a=d("%Function.prototype.call%"),c=d("%Reflect.apply%",!0)||n.call(a,r),o=d("%Object.getOwnPropertyDescriptor%",!0),i=d("%Object.defineProperty%",!0),f=d("%Math.max%");if(i)try{i({},"a",{value:1})}catch(s){i=null}e.exports=function(e){var u=c(n,a,arguments);if(o&&i){var t=o(u,"length");t.configurable&&i(u,"length",{value:1+f(0,e.length-(arguments.length-1))})}return u};var l=function(){return c(n,r,arguments)};i?i(e.exports,"apply",{value:l}):e.exports.apply=l},513:function(e,u,t){var n="function"==typeof Map&&Map.prototype,d=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,r=n&&d&&"function"==typeof d.get?d.get:null,a=n&&Map.prototype.forEach,c="function"==typeof Set&&Set.prototype,o=Object.getOwnPropertyDescriptor&&c?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,i=c&&o&&"function"==typeof o.get?o.get:null,f=c&&Set.prototype.forEach,l="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,m=Boolean.prototype.valueOf,h=Object.prototype.toString,v=Function.prototype.toString,b=String.prototype.match,y=String.prototype.slice,g=String.prototype.replace,_=String.prototype.toUpperCase,x=String.prototype.toLowerCase,w=RegExp.prototype.test,E=Array.prototype.concat,I=Array.prototype.join,S=Array.prototype.slice,A=Math.floor,k="function"==typeof BigInt?BigInt.prototype.valueOf:null,j=Object.getOwnPropertySymbols,O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,P=Object.prototype.propertyIsEnumerable,T=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function M(e,u){if(e===1/0||e===-1/0||e!=e||e&&e>-1e3&&e<1e3||w.call(/e/,u))return u;var t=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof e){var n=e<0?-A(-e):A(e);if(n!==e){var d=String(n),r=y.call(u,d.length+1);return g.call(d,t,"$&_")+"."+g.call(g.call(r,/([0-9]{3})/g,"$&_"),/_$/,"")}}return g.call(u,t,"$&_")}var R=t(514),L=R.custom,F=W(L)?L:null;function B(e,u,t){var n="double"===(t.quoteStyle||u)?'"':"'";return n+e+n}function D(e){return g.call(String(e),/"/g,""")}function U(e){return!("[object Array]"!==q(e)||C&&"object"==typeof e&&C in e)}function z(e){return!("[object RegExp]"!==q(e)||C&&"object"==typeof e&&C in e)}function W(e){if(N)return e&&"object"==typeof e&&e instanceof Symbol;if("symbol"==typeof e)return!0;if(!e||"object"!=typeof e||!O)return!1;try{return O.call(e),!0}catch(u){}return!1}e.exports=function e(u,t,n,d){var c=t||{};if(G(c,"quoteStyle")&&"single"!==c.quoteStyle&&"double"!==c.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(G(c,"maxStringLength")&&("number"==typeof c.maxStringLength?c.maxStringLength<0&&c.maxStringLength!==1/0:null!==c.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var o=!G(c,"customInspect")||c.customInspect;if("boolean"!=typeof o&&"symbol"!==o)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(G(c,"indent")&&null!==c.indent&&"\t"!==c.indent&&!(parseInt(c.indent,10)===c.indent&&c.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(G(c,"numericSeparator")&&"boolean"!=typeof c.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=c.numericSeparator;if(void 0===u)return"undefined";if(null===u)return"null";if("boolean"==typeof u)return u?"true":"false";if("string"==typeof u)return function e(u,t){if(u.length>t.maxStringLength){var n=u.length-t.maxStringLength,d="... "+n+" more character"+(n>1?"s":"");return e(y.call(u,0,t.maxStringLength),t)+d}return B(g.call(g.call(u,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,K),"single",t)}(u,c);if("number"==typeof u){if(0===u)return 1/0/u>0?"0":"-0";var _=String(u);return h?M(u,_):_}if("bigint"==typeof u){var w=String(u)+"n";return h?M(u,w):w}var A=void 0===c.depth?5:c.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof u)return U(u)?"[Array]":"[Object]";var j=function(e,u){var t;if("\t"===e.indent)t="\t";else{if(!("number"==typeof e.indent&&e.indent>0))return null;t=I.call(Array(e.indent+1)," ")}return{base:t,prev:I.call(Array(u+1),t)}}(c,n);if(void 0===d)d=[];else if(H(d,u)>=0)return"[Circular]";function L(u,t,r){if(t&&(d=S.call(d)).push(t),r){var a={depth:c.depth};return G(c,"quoteStyle")&&(a.quoteStyle=c.quoteStyle),e(u,a,n+1,d)}return e(u,c,n+1,d)}if("function"==typeof u&&!z(u)){var $=function(e){if(e.name)return e.name;var u=b.call(v.call(e),/^function\s*([\w$]+)/);if(u)return u[1];return null}(u),X=Y(u,L);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+I.call(X,", ")+" }":"")}if(W(u)){var ee=N?g.call(String(u),/^(Symbol\(.*\))_[^)]*$/,"$1"):O.call(u);return"object"!=typeof u||N?ee:V(ee)}if(function(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"==typeof e.nodeName&&"function"==typeof e.getAttribute}(u)){for(var ue="<"+x.call(String(u.nodeName)),te=u.attributes||[],ne=0;ne"}if(U(u)){if(0===u.length)return"[]";var de=Y(u,L);return j&&!function(e){for(var u=0;u=0)return!1;return!0}(de)?"["+Q(de,j)+"]":"[ "+I.call(de,", ")+" ]"}if(function(e){return!("[object Error]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)){var re=Y(u,L);return"cause"in Error.prototype||!("cause"in u)||P.call(u,"cause")?0===re.length?"["+String(u)+"]":"{ ["+String(u)+"] "+I.call(re,", ")+" }":"{ ["+String(u)+"] "+I.call(E.call("[cause]: "+L(u.cause),re),", ")+" }"}if("object"==typeof u&&o){if(F&&"function"==typeof u[F]&&R)return R(u,{depth:A-n});if("symbol"!==o&&"function"==typeof u.inspect)return u.inspect()}if(function(e){if(!r||!e||"object"!=typeof e)return!1;try{r.call(e);try{i.call(e)}catch(ue){return!0}return e instanceof Map}catch(u){}return!1}(u)){var ae=[];return a.call(u,(function(e,t){ae.push(L(t,u,!0)+" => "+L(e,u))})),Z("Map",r.call(u),ae,j)}if(function(e){if(!i||!e||"object"!=typeof e)return!1;try{i.call(e);try{r.call(e)}catch(u){return!0}return e instanceof Set}catch(t){}return!1}(u)){var ce=[];return f.call(u,(function(e){ce.push(L(e,u))})),Z("Set",i.call(u),ce,j)}if(function(e){if(!l||!e||"object"!=typeof e)return!1;try{l.call(e,l);try{s.call(e,s)}catch(ue){return!0}return e instanceof WeakMap}catch(u){}return!1}(u))return J("WeakMap");if(function(e){if(!s||!e||"object"!=typeof e)return!1;try{s.call(e,s);try{l.call(e,l)}catch(ue){return!0}return e instanceof WeakSet}catch(u){}return!1}(u))return J("WeakSet");if(function(e){if(!p||!e||"object"!=typeof e)return!1;try{return p.call(e),!0}catch(u){}return!1}(u))return J("WeakRef");if(function(e){return!("[object Number]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(Number(u)));if(function(e){if(!e||"object"!=typeof e||!k)return!1;try{return k.call(e),!0}catch(u){}return!1}(u))return V(L(k.call(u)));if(function(e){return!("[object Boolean]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(m.call(u));if(function(e){return!("[object String]"!==q(e)||C&&"object"==typeof e&&C in e)}(u))return V(L(String(u)));if(!function(e){return!("[object Date]"!==q(e)||C&&"object"==typeof e&&C in e)}(u)&&!z(u)){var oe=Y(u,L),ie=T?T(u)===Object.prototype:u instanceof Object||u.constructor===Object,fe=u instanceof Object?"":"null prototype",le=!ie&&C&&Object(u)===u&&C in u?y.call(q(u),8,-1):fe?"Object":"",se=(ie||"function"!=typeof u.constructor?"":u.constructor.name?u.constructor.name+" ":"")+(le||fe?"["+I.call(E.call([],le||[],fe||[]),": ")+"] ":"");return 0===oe.length?se+"{}":j?se+"{"+Q(oe,j)+"}":se+"{ "+I.call(oe,", ")+" }"}return String(u)};var $=Object.prototype.hasOwnProperty||function(e){return e in this};function G(e,u){return $.call(e,u)}function q(e){return h.call(e)}function H(e,u){if(e.indexOf)return e.indexOf(u);for(var t=0,n=e.length;t-1?e.split(","):e},i=function(e,u,t,n){if(e){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,c=t.depth>0&&/(\[[^[\]]*])/.exec(r),i=c?r.slice(0,c.index):r,f=[];if(i){if(!t.plainObjects&&d.call(Object.prototype,i)&&!t.allowPrototypes)return;f.push(i)}for(var l=0;t.depth>0&&null!==(c=a.exec(r))&&l=0;--r){var a,c=e[r];if("[]"===c&&t.parseArrays)a=[].concat(d);else{a=t.plainObjects?Object.create(null):{};var i="["===c.charAt(0)&&"]"===c.charAt(c.length-1)?c.slice(1,-1):c,f=parseInt(i,10);t.parseArrays||""!==i?!isNaN(f)&&c!==i&&String(f)===i&&f>=0&&t.parseArrays&&f<=t.arrayLimit?(a=[])[f]=d:"__proto__"!==i&&(a[i]=d):a={0:d}}d=a}return d}(f,u,t,n)}};e.exports=function(e,u){var t=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var u=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:u,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||n.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(u);if(""===e||null==e)return t.plainObjects?Object.create(null):{};for(var f="string"==typeof e?function(e,u){var t,i={},f=u.ignoreQueryPrefix?e.replace(/^\?/,""):e,l=u.parameterLimit===1/0?void 0:u.parameterLimit,s=f.split(u.delimiter,l),p=-1,m=u.charset;if(u.charsetSentinel)for(t=0;t-1&&(v=r(v)?[v]:v),d.call(i,h)?i[h]=n.combine(i[h],v):i[h]=v}return i}(e,t):e,l=t.plainObjects?Object.create(null):{},s=Object.keys(f),p=0;p1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!v(m(this,u),e)}}),s&&n(f.prototype,"size",{get:function(){return m(this,u)[h]}}),f},def:function(e,u,t){var n,d,r=v(e,u);return r?r.v=t:(e._l=r={i:d=p(u,!0),k:u,v:t,p:n=e._l,n:void 0,r:!1},e._f||(e._f=r),n&&(n.n=r),e[h]++,"F"!==d&&(e._i[d]=r)),e},getEntry:v,setStrong:function(e,u,t){i(e,u,(function(e,t){this._t=m(e,u),this._k=t,this._l=void 0}),(function(){for(var e=this._k,u=this._l;u&&u.r;)u=u.p;return this._t&&(this._l=u=u?u.n:this._t._f)?f(0,"keys"==e?u.k:"values"==e?u.v:[u.k,u.v]):(this._t=void 0,f(1))}),t?"entries":"values",!t,!0),l(u)}}},547:function(e,u,t){"use strict";var n=t(5),d=t(12),r=t(16),a=t(82),c=t(491),o=t(81),i=t(80),f=t(13),l=t(14),s=t(83),p=t(41),m=t(548);e.exports=function(e,u,t,h,v,b){var y=n[e],g=y,_=v?"set":"add",x=g&&g.prototype,w={},E=function(e){var u=x[e];r(x,e,"delete"==e||"has"==e?function(e){return!(b&&!f(e))&&u.call(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:u.call(this,0===e?0:e)}:"add"==e?function(e){return u.call(this,0===e?0:e),this}:function(e,t){return u.call(this,0===e?0:e,t),this})};if("function"==typeof g&&(b||x.forEach&&!l((function(){(new g).entries().next()})))){var I=new g,S=I[_](b?{}:-0,1)!=I,A=l((function(){I.has(1)})),k=s((function(e){new g(e)})),j=!b&&l((function(){for(var e=new g,u=5;u--;)e[_](u,u);return!e.has(-0)}));k||((g=u((function(u,t){i(u,g,e);var n=m(new y,u,g);return null!=t&&o(t,v,n[_],n),n}))).prototype=x,x.constructor=g),(A||j)&&(E("delete"),E("has"),v&&E("get")),(j||S)&&E(_),b&&x.clear&&delete x.clear}else g=h.getConstructor(u,e,v,_),a(g.prototype,t),c.NEED=!0;return p(g,e),w[e]=g,d(d.G+d.W+d.F*(g!=y),w),b||h.setStrong(g,e,v),g}},548:function(e,u,t){var n=t(13),d=t(549).set;e.exports=function(e,u,t){var r,a=u.constructor;return a!==t&&"function"==typeof a&&(r=a.prototype)!==t.prototype&&n(r)&&d&&d(e,r),e}},549:function(e,u,t){var n=t(13),d=t(8),r=function(e,u){if(d(e),!n(u)&&null!==u)throw TypeError(u+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,u,n){try{(n=t(30)(Function.call,t(550).f(Object.prototype,"__proto__").set,2))(e,[]),u=!(e instanceof Array)}catch(d){u=!0}return function(e,t){return r(e,t),u?e.__proto__=t:n(e,t),e}}({},!1):void 0),check:r}},550:function(e,u,t){var n=t(62),d=t(57),r=t(33),a=t(87),c=t(31),o=t(86),i=Object.getOwnPropertyDescriptor;u.f=t(10)?i:function(e,u){if(e=r(e),u=a(u,!0),o)try{return i(e,u)}catch(t){}if(c(e,u))return d(!n.f.call(e,u),e[u])}},551:function(e,u,t){"use strict";var n=t(12),d=t(32),r=t(27),a=t(14),c=[].sort,o=[1,2,3];n(n.P+n.F*(a((function(){o.sort(void 0)}))||!a((function(){o.sort(null)}))||!t(552)(c)),"Array",{sort:function(e){return void 0===e?c.call(r(this)):c.call(r(this),d(e))}})},552:function(e,u,t){"use strict";var n=t(14);e.exports=function(e,u){return!!e&&n((function(){u?e.call(null,(function(){}),1):e.call(null)}))}},561:function(e,u,t){"use strict";t(489),t(79),t(490),t(551),t(29),t(22),t(21),t(85),t(442);var n=t(1),d=(t(448),t(449),t(77),t(428),t(0)),r=t.n(d),a=t(481),c=t.n(a);t(150);var o=function(e){var u=e.humanize,t=e.icon,n=e.values,d=e.currentState,a=e.setState;if(0==n.size)return null;var o=Array.from(n);return r.a.createElement(r.a.Fragment,null,o.map((function(e,n){var o="string"==typeof e&&u?c()(e):e;return r.a.createElement("label",{key:n},r.a.createElement("input",{type:"checkbox",onChange:function(u){var t=new Set(d);u.currentTarget.checked?t.add(e):t.delete(e),a(t)},checked:d.has(e)}),o&&r.a.createElement(r.a.Fragment,null,t?r.a.createElement("i",{className:"feather icon-"+t}):""," ",o))})))},i=t(503),f=t(431),l=t(430),s=(t(440),t(451)),p=t.n(s),m=t(423),h=t.n(m),v=t(504),b=t.n(v),y=t(436);t(151);function g(e){var u=e.delivery_guarantee,t=e.description,n=e.event_types,d=e.function_category,a=(e.logo_path,e.name),c=e.pathTemplate,o=e.status,i=e.title,f=e.type,s=c;s||("source"==f&&(s="/docs/reference/sources//"),"transform"==f&&(s="/docs/reference/transforms//"),"sink"==f&&(s="/docs/reference/sinks//"));var p=s.replace("",a);return r.a.createElement(l.a,{to:p,className:"qovery-component",title:t},r.a.createElement("div",{className:"qovery-component--header"},r.a.createElement("div",{className:"qovery-component--name"},i)),r.a.createElement("div",{className:"qovery-component--badges"},"beta"==o?r.a.createElement("span",{className:"badge badge--warning",title:"This component is in beta and is not recommended for production environments"},r.a.createElement("i",{className:"feather icon-alert-triangle"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component has passed reliability standards that make it production ready"},r.a.createElement("i",{className:"feather icon-award"})),"best_effort"==u?r.a.createElement("span",{className:"badge badge--warning",title:"This component makes a best-effort delivery guarantee, and in rare cases can lose data"},r.a.createElement("i",{className:"feather icon-shield-off"})):r.a.createElement("span",{className:"badge badge--primary",title:"This component offers an at-least-once delivery guarantee"},r.a.createElement("i",{className:"feather icon-shield"})),n.includes("log")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with log event types"},"log"):"",n.includes("metric")?r.a.createElement("span",{className:"badge badge--primary",title:"This component works with metric event types"},"metric"):"",r.a.createElement("span",{className:"badge badge--primary"},d)))}function _(e){var u=e.components,t=e.headingLevel,d=e.pathTemplate,a=e.titles,c=u.filter((function(e){return"source"==e.type})),o=u.filter((function(e){return"transform"==e.type})),l=u.filter((function(e){return"sink"==e.type})),s="h"+(t||3);return u.length>0?r.a.createElement(r.a.Fragment,null,c.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,c.length," Sources"),r.a.createElement("div",{className:"qovery-components--grid"},c.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",o.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,o.length," Transforms"),r.a.createElement("div",{className:"qovery-components--grid"},o.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",l.length>0?r.a.createElement(r.a.Fragment,null,a&&r.a.createElement(s,null,l.length," Sinks"),r.a.createElement("div",{className:"qovery-components--grid"},l.map((function(e,u){return r.a.createElement(g,Object(n.a)({key:u,pathTemplate:d},e))})))):"",r.a.createElement("hr",null),r.a.createElement(f.a,{to:"https://github.com/qovery/documentation/issues/new?labels=type%3A+new+feature",target:"_blank",rightIcon:"plus-circle"},"Request a new component")):r.a.createElement(i.a,{text:"no components found"})}u.a=function(e){var u=Object(y.a)().siteConfig.customFields.metadata,t=u.sources,n=u.transforms,a=u.sinks,c=e.titles||null==e.titles,i=1==e.filterColumn,f=e.pathTemplate,s=e.location?b.a.parse(e.location.search,{ignoreQueryPrefix:!0}):{},m=[];(e.sources||null==e.sources)&&(m=m.concat(Object.values(t))),(e.transforms||null==e.transforms)&&(m=m.concat(Object.values(n))),(e.sinks||null==e.sinks)&&(m=m.concat(Object.values(a))),m=m.sort((function(e,u){return e.name>u.name?1:-1}));var v=Object(d.useState)("true"==s["at-least-once"]),g=v[0],x=v[1],w=Object(d.useState)(new Set(s["event-types"]||e.eventTypes)),E=w[0],I=w[1],S=Object(d.useState)(new Set(s.functions)),A=S[0],k=S[1],j=Object(d.useState)(new Set(s["operating-systems"])),O=j[0],N=j[1],C=Object(d.useState)("true"==s["prod-ready"]),P=C[0],T=C[1],M=Object(d.useState)(new Set(s.providers)),R=M[0],L=M[1],F=Object(d.useState)(s.search),B=F[0],D=F[1];B&&(m=m.filter((function(e){return(e.name.toLowerCase()+" "+e.type.toLowerCase()).includes(B.toLowerCase())}))),g&&(m=m.filter((function(e){return"at_least_once"==e.delivery_guarantee}))),E.size>0&&(m=m.filter((function(e){return Array.from(E).some((function(u){return e.event_types.includes(u)}))}))),A.size>0&&(m=m.filter((function(e){return A.has(e.function_category)}))),O.size>0&&(m=m.filter((function(e){return Array.from(O).every((function(u){return e.operating_systems.includes(u)}))}))),P&&(m=m.filter((function(e){return"prod-ready"==e.status}))),R.size>0&&(m=m.filter((function(e){return Array.from(R).every((function(u){return e.service_providers&&e.service_providers.includes(u)}))}))),e.exceptNames&&e.exceptNames.length>0&&(m=m.filter((function(u){return!e.exceptNames.includes(u.name)}))),e.exceptFunctions&&e.exceptFunctions.length>0&&(m=m.filter((function(u){return!e.exceptFunctions.includes(u.function_category)})));var U=E.size>0?E:new Set(p()(m).map((function(e){return e.event_types})).flatten().uniq().compact().sort().value()),z=new Set(p()(m).map((function(e){return e.operating_systems})).flatten().uniq().compact().sort().value()),W=new Set(p()(m).map((function(e){return e.service_providers})).flatten().uniq().compact().sort().value()),$=new Set(p()(m).filter((function(e){return"source"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),G=new Set(p()(m).filter((function(e){return"transform"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value()),q=new Set(p()(m).filter((function(e){return"sink"==e.type})).map((function(e){return e.function_category})).uniq().compact().sort().value());return r.a.createElement("div",{className:h()("qovery-components",{"qovery-components--cols":i})},r.a.createElement("div",{className:"filters"},r.a.createElement("div",{className:"search"},r.a.createElement("input",{className:"input--text input--lg",type:"text",onChange:function(e){return D(e.currentTarget.value)},placeholder:"\ud83d\udd0d Search..."})),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/data-model/",title:"Learn more about Qovery's event types"},"Event types ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Event Types",icon:"database",values:U,humanize:!0,currentState:E,setState:I}))),r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/getting-started/whats-next/",title:"Learn more about Qovery's guarantees"},"Guarantees ",r.a.createElement("i",{className:"feather icon-info"}))),r.a.createElement("div",{className:"filter--choices"},r.a.createElement("label",{title:"Show only components that offer an at-least-once delivery guarantee."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return x(e.currentTarget.checked)},checked:g}),r.a.createElement("i",{className:"feather icon-shield"})," At-least-once"),r.a.createElement("label",{title:"Show only production ready components."},r.a.createElement("input",{type:"checkbox",onChange:function(e){return T(e.currentTarget.checked)},checked:P}),r.a.createElement("i",{className:"feather icon-award"})," Prod-ready"))),$.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Source Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:$,humanize:!0,currentState:A,setState:k}))),G.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Transform Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:G,humanize:!0,currentState:A,setState:k}))),q.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Sink Functions"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Functions",icon:"settings",values:q,humanize:!0,currentState:A,setState:k}))),W.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},"Providers"),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Providers",icon:"cloud",values:W,currentState:R,setState:L}))),z.size>0&&r.a.createElement("div",{className:"filter"},r.a.createElement("div",{className:"filter--label"},r.a.createElement(l.a,{to:"/docs/setup/installation/operating-systems/",title:"Learn more about Qovery's operating systems"},"Operating Systems")),r.a.createElement("div",{className:"filter--choices"},r.a.createElement(o,{label:"Operating Systems",icon:"cpu",values:z,currentState:O,setState:N})))),r.a.createElement("div",{className:"qovery-components--results"},r.a.createElement(_,{components:m,headingLevel:e.headingLevel,pathTemplate:f,titles:c})))}}}]); \ No newline at end of file diff --git a/54e7632e.c06ee927.js.LICENSE.txt b/54e7632e.f37d554b.js.LICENSE.txt similarity index 100% rename from 54e7632e.c06ee927.js.LICENSE.txt rename to 54e7632e.f37d554b.js.LICENSE.txt diff --git a/56c0a343.824050c2.js b/56c0a343.5aca429a.js similarity index 99% rename from 56c0a343.824050c2.js rename to 56c0a343.5aca429a.js index 45c9b0c3d8..acad6be4a9 100644 --- a/56c0a343.824050c2.js +++ b/56c0a343.5aca429a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{253:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(449),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(448),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{253:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return c})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return p}));var a=n(1),o=n(9),r=(n(0),n(425)),i=n(424),l=(n(437),n(429)),s={last_modified_on:"2023-09-08",$schema:"/.meta/.schemas/guides.json",title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},c={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",description:"Step-by-step guide to build e2e testing ephemeral environments with GitHub Actions and Qovery",permalink:"/guides/tutorial/build-e2e-testing-ephemeral-environments",readingTime:"12 min read",source:"@site/guides/tutorial/build-e2e-testing-ephemeral-environments.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery",truncated:!1,prevItem:{title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS",permalink:"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws"},nextItem:{title:"Continuous Integration",permalink:"/guides/advanced/continuous-integration"}},b=[{value:"Why E2E Testing?",id:"why-e2e-testing",children:[]},{value:"The Importance of Ephemeral Environments",id:"the-importance-of-ephemeral-environments",children:[]},{value:"GitHub Actions and Qovery: A Perfect Match",id:"github-actions-and-qovery-a-perfect-match",children:[]},{value:"What You'll Learn",id:"what-youll-learn",children:[]},{value:"Prerequisites",id:"prerequisites",children:[]},{value:"Tools",id:"tools",children:[]},{value:"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery",id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery",children:[{value:"1. Prepare Qovery blueprint environment",id:"1-prepare-qovery-blueprint-environment",children:[]},{value:"2. Build and push container image",id:"2-build-and-push-container-image",children:[]},{value:"3. Create an Ephemeral Environment with GitHub Actions and Qovery",id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery",children:[]},{value:"4. Run E2E tests with K6",id:"4-run-e2e-tests-with-k6",children:[]},{value:"5. Display test results in Pull Request",id:"5-display-test-results-in-pull-request",children:[]},{value:"6. Destroy Ephemeral Environment and clean up resources",id:"6-destroy-ephemeral-environment-and-clean-up-resources",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],u={rightToc:b};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"Welcome to this comprehensive step-by-step guide on building End-to-End (E2E) testing ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/solutions/ephemeral-environments"}),"ephemeral environments")," using ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/features/actions"}),"GitHub Actions")," and ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery"),". If you've been seeking ways to automate your testing processes, reduce operational overhead, and improve the efficiency of your development cycle, then you're in the right place."),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"This article is available in the webinar format as well")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/1be8d4229cb74ed7b0526cc2acbca8ad",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"why-e2e-testing"},"Why E2E Testing?"),Object(r.b)("p",null,"End-to-End testing is a critical phase in the software development lifecycle. It validates that your application works cohesively from start to finish, mimicking real-world scenarios."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/e2e-pyramid.png",alt:"E2E vs UI Tests vs Integation Tests vs Unit Tests - from SemaphoreCI"})),Object(r.b)("p",null,"While unit tests and integration tests offer valuable insights, they do not replicate how multiple components interact in a live production environment. E2E testing fills that gap and ensures that your application performs as expected when it goes live."),Object(r.b)("h2",{id:"the-importance-of-ephemeral-environments"},"The Importance of Ephemeral Environments"),Object(r.b)("p",null,"In the world of DevOps and CI/CD, ephemeral environments (aka ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/why-preview-environments-are-the-new-thing-in-devops"}),"Preview Environments"),") serve as temporary, isolated setups where you can test your applications. These environments are increasingly vital in agile development frameworks where frequent changes are the norm. They can be provisioned quickly, teared down when no longer needed, and replicated easily. This means you can push your changes more rapidly into production with confidence."),Object(r.b)("h2",{id:"github-actions-and-qovery-a-perfect-match"},"GitHub Actions and Qovery: A Perfect Match"),Object(r.b)("p",null,"GitHub Actions offers a powerful platform for automating workflows, allowing you to build, test, and deploy your code right from GitHub. Qovery, on the other hand, simplifies the provisioning and management of cloud resources, making it incredibly straightforward to set up ephemeral environments. When used in tandem, these tools provide a seamless, automated pipeline for E2E testing."),Object(r.b)("h2",{id:"what-youll-learn"},"What You'll Learn"),Object(r.b)("p",null,"This guide is designed to walk you through the entire process of setting up an automated E2E testing pipeline. We'll start by setting up GitHub Actions, move on to configuring ephemeral environments with Qovery, and finally, integrate these components into a cohesive, automated testing solution."),Object(r.b)("p",null,"By the end of this guide, you'll have a fully operational E2E testing pipeline that will allow you to:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Automate your testing process"),Object(r.b)("li",{parentName:"ol"},"Quickly provision and de-provision environments"),Object(r.b)("li",{parentName:"ol"},"Integrate closely with your GitHub repository"),Object(r.b)("li",{parentName:"ol"},"Save both time and operational costs")),Object(r.b)("p",null,"So, whether you are a developer, a DevOps engineer, a QA specialist, an engineering manager, or even a CTO, this guide offers valuable insights for anyone involved in the software development process."),Object(r.b)("p",null,"Let's dive in!"),Object(r.b)("h2",{id:"prerequisites"},"Prerequisites"),Object(r.b)(l.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Contact us via ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you have any questions concerning Qovery")),Object(r.b)("h2",{id:"tools"},"Tools"),Object(r.b)("p",null,"Here are the tools we will use in this guide:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.qovery.com"}),"Qovery")," for the infrastructure and the ephemeral environment"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/features/actions"}),"GitHub Actions")," for the CI/CD pipeline"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://k6.io/"}),"K6")," for the e2e tests")),Object(r.b)("h2",{id:"7-steps-to-build-e2e-testing-ephemeral-environments-with-github-actions-and-qovery"},"7 Steps to build E2E testing ephemeral environments with GitHub Actions and Qovery"),Object(r.b)("p",null,"Here is the big picture of what we will build:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/1.png",alt:"e2e testing Workflow with github actions and Qovery"})),Object(r.b)("p",null,"We will focus on the most important parts of the workflow - from label number 2 to 11. I assume that you already know GitHub and how to create a Pull Request :)"),Object(r.b)("p",null,"Let's go!"),Object(r.b)("h3",{id:"1-prepare-qovery-blueprint-environment"},"1. Prepare Qovery blueprint environment"),Object(r.b)("p",null,"If you are not already familiar with Qovery, I recommend you to ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/getting-started/what-is-qovery/"}),"What's Qovery"),". In this guide, we will use Qovery to provision our ephemeral environments composed of a Java application (",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app"}),"TODO app"),") and a PostgreSQL database. For this, we will create a blueprint environment that will be used as a template to create ephemeral environments."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can skip this part if you already have an environment that you want to use as a base for your ephemeral environments.")),Object(r.b)("p",null,"Here are the steps I did to create my blueprint environment:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://console.qovery.com"}),"Qovery"),"."),Object(r.b)("li",{parentName:"ol"},"Create a new project."),Object(r.b)("li",{parentName:"ol"},"Create a new environment named ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint"),"."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/guides/getting-started/create-a-database/"}),"PostgreSQL database")," inside your ",Object(r.b)("inlineCode",{parentName:"li"},"blueprint")," environment."),Object(r.b)("li",{parentName:"ol"},"Add a ",Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#create-an-application"}),"TODO app")," by using my ECR container registry where I push my image from GitHub Actions (cf next step).")),Object(r.b)("p",null,"At the end of those steps, you should have something like this:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/2.png",alt:"Blueprint environment"})),Object(r.b)("p",null,"If you want to use my ",Object(r.b)("inlineCode",{parentName:"p"},"TODO app")," as an example, you need to properly configure the environment variables of the application. Here is a table with the environment variables you need to set:"),Object(r.b)("details",null,Object(r.b)("summary",null,"Environment Variables"),Object(r.b)("table",null,Object(r.b)("thead",{parentName:"table"},Object(r.b)("tr",{parentName:"thead"},Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Name"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Is Alias?"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Scope"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Value"),Object(r.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Comment"))),Object(r.b)("tbody",{parentName:"table"},Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DB_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._DEFAULT_DATABASE_NAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database name")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_HOST")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._HOST_INTERNAL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database host")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PORT")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database port")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_USERNAME")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._LOGIN")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database login")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"POSTGRES_DATASOURCE_PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Yes for ",Object(r.b)("inlineCode",{parentName:"td"},"QOVERY_POSTGRESQL_Z..._PASSWORD")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"N/A"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Database password")),Object(r.b)("tr",{parentName:"tbody"},Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),Object(r.b)("inlineCode",{parentName:"td"},"QUARKUS_DATASOURCE_JDBC_URL")),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"No"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Service"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"jdbc:postgresql://{{POSTGRES_HOST}}:{{POSTGRES_PORT}}/{{POSTGRES_DB_NAME}}"),Object(r.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Connection string to the PostgreSQL database"))))),Object(r.b)("p",null,"You're good to go! Now, let's move on to the next step."),Object(r.b)("h3",{id:"2-build-and-push-container-image"},"2. Build and push container image"),Object(r.b)("p",null,"In this step, we will build and push the container image of our application to our ECR container registry. We will use GitHub Actions to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"build-and-push-image.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n build-and-push-container:\n runs-on: ubuntu-latest\n needs: run-unit-tests\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v2\n with:\n aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n aws-region: eu-west-3\n\n - name: Login to Amazon ECR\n id: login-ecr\n uses: aws-actions/amazon-ecr-login@v1\n with:\n mask-password: 'true'\n\n - name: Build, Tag, and push image to Amazon ECR\n env:\n ECR_REGISTRY: 687975725498.dkr.ecr.eu-west-3.amazonaws.com\n ECR_REPOSITORY: todo-app\n IMAGE_TAG: ${{ github.sha }}\n run: |\n docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .\n docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest\n docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/build-and-push-image.yml"}),"here"))),Object(r.b)("p",null,Object(r.b)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," are stored as ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/encrypted-secrets"}),"GitHub secrets"),"."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ECR registry is also connected to my Qovery account - so I can pull the pushed image from Qovery as well.")),Object(r.b)("h3",{id:"3-create-an-ephemeral-environment-with-github-actions-and-qovery"},"3. Create an Ephemeral Environment with GitHub Actions and Qovery"),Object(r.b)("p",null,"In this step, we will create an ephemeral environment with GitHub Actions and Qovery. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI")," inside our GitHub Actions workflow to do that."),Object(r.b)("p",null,"Create your GitHub Actions workflow inside ",Object(r.b)("inlineCode",{parentName:"p"},".github/workflows")," folder. I named mine ",Object(r.b)("inlineCode",{parentName:"p"},"pull-request-run-e2e-tests.yml"),". Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'...\njobs:\n create-e2e-environment:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n permissions:\n pull-requests: write\n steps:\n - id: create-environment\n name: Create and deploy Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s clone \'${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}\' environment into \'$new_environment_name\' environment"\n\n qovery environment clone \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --new-environment-name "$new_environment_name"\n\n qovery container update \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" \\\n --tag ${{ github.sha }}\n\n qovery environment deploy \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n\n qovery_status_markdown_output=`qovery service list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --markdown`\n\n echo "QOVERY_STATUS_MARKDOWN_OUTPUT<> "$GITHUB_OUTPUT"\n echo "$qovery_status_markdown_output" >> "$GITHUB_OUTPUT"\n echo "EOF" >> "$GITHUB_OUTPUT"\n')),Object(r.b)("p",null,"Basically, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment clone")," command to clone our blueprint environment into a new environment. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container update")," command to update the container tag of our application. Finally, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment deploy")," command to deploy our application. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deployment to be completed. We also use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery service list")," command to get the status of our environment and store it in a GitHub output variable. This variable will be used in the next step to display the status of the environment in the Pull Request."),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),"...\n - name: PR Comment with URL\n uses: mshick/add-pr-comment@v2\n with:\n message-id: qovery-e2e-environment-status\n message: |\n ${{ steps.create-environment.outputs.QOVERY_STATUS_MARKDOWN_OUTPUT }}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Find my complete file ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/3.png",alt:"Ephemeral environment status in Pull Request"})),Object(r.b)("h3",{id:"4-run-e2e-tests-with-k6"},"4. Run E2E tests with K6"),Object(r.b)("p",null,"In this step, we will run our E2E tests with ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io"}),"K6"),". K6 is a modern load testing tool that allows you to write tests in JavaScript. It's a great tool to run E2E tests as well. Here is the script we will use:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import http from 'k6/http';\nimport {check, group, sleep, fail} from 'k6';\nimport {uuidv4} from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';\n\nconst api_host = `${__ENV.API_HOST}/api`;\nexport const options = {\n stages: [\n {duration: '5m', target: 100}, // traffic ramp-up from 1 to 100 users over 5 minutes.\n //{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes\n {duration: '1m', target: 50}, // ramp-down to 50 users\n ]\n}\n\nexport function setup() {\n // add some data\n const params = {\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n for (let i = 0; i < 20; i++) {\n const res = http.post(api_host, JSON.stringify({title: uuidv4()}), params);\n check(res, {'item added': (r) => r.status === 201});\n }\n}\n\nexport default function () {\n http.get(api_host);\n}\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete script is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/e2e/e2e.js"}),"here"))),Object(r.b)("p",null,"We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"setup")," function to add some data to our database. Then, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"default")," function to get the list of items from our API. We will use the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable to define the number of users we want to simulate. In this example, we will simulate 100 users for 5 minutes. You can find more information about the ",Object(r.b)("inlineCode",{parentName:"p"},"options")," variable ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://k6.io/docs/using-k6/options"}),"here"),"."),Object(r.b)("p",null,"To run our E2E tests, we will use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6 run")," command inside our GitHub Actions workflow. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),' run-e2e-tests:\n if: ${{ github.event.label.name == \'e2e\' }}\n runs-on: ubuntu-latest\n needs: create-e2e-environment\n permissions:\n pull-requests: write\n steps:\n - name: Checkout code\n uses: actions/checkout@v3\n\n - id: run-e2e\n name: Run E2E tests\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n sudo gpg -k\n sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69\n echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list\n sudo apt-get update\n sudo apt-get install k6\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n api_domain=`qovery container domain list \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n --container "${{ vars.QOVERY_APPLICATION_NAME }}" | grep "BUILT_IN_DOMAIN" | head -1 | awk \'{print $5}\' | sed -e \'s/\\x1b\\[[0-9;]*m//g\'`\n\n echo "api_domain: $api_domain"\n\n api_host="https://$api_domain"\n echo "API_HOST: $api_host"\n\n e2e_report=`k6 --no-color -q -e API_HOST=$api_host run e2e/e2e.js`\n\n echo "E2E_REPORT<> $GITHUB_OUTPUT\n echo "$e2e_report" >> $GITHUB_OUTPUT\n echo "EOF" >> $GITHUB_OUTPUT\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml"}),"here"))),Object(r.b)("p",null,"We use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command to get the domain of our application. Then, we use the ",Object(r.b)("inlineCode",{parentName:"p"},"k6")," command to run our E2E tests. We store the result of the tests in a GitHub output variable."),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"qovery container domain list")," command returns ANSI color codes. We use the ",Object(r.b)("inlineCode",{parentName:"p"},"sed -e 's/\\x1b\\[[0-9;]*m//g'")," command to remove them.")),Object(r.b)("h3",{id:"5-display-test-results-in-pull-request"},"5. Display test results in Pull Request"),Object(r.b)("p",null,"In this step, we will display the result of our E2E tests in the Pull Request. We will use the ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter"}),"GitHub Actions output variables")," to do that. Here is the content of the file:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"})," - name: Display E2E Report\n uses: mshick/add-pr-comment@v2\n with:\n message-id: e2e-report\n message: |\n E2E Tests Report\n\n --\n\n ```\n ${{ steps.run-e2e.outputs.E2E_REPORT }}\n ```\n")),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-run-e2e-tests.yml#L109C1-L120C16"}),"here"))),Object(r.b)("p",null,"You can see the result of this step in the Pull Request:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/e2e-with-github-actions-and-qovery/4.png",alt:"E2E report in Pull Request"})),Object(r.b)("h3",{id:"6-destroy-ephemeral-environment-and-clean-up-resources"},"6. Destroy Ephemeral Environment and clean up resources"),Object(r.b)("p",null,"Now we will destroy the ephemeral environment and clean up the resources when the Pull Request is closed or merged. Here is the yaml:"),Object(r.b)("pre",null,Object(r.b)("code",Object(a.a)({parentName:"pre"},{className:"language-yaml"}),'name: Destroy and clean up E2E Tests Environment\n\non:\n pull_request:\n types: [ closed ]\n\njobs:\n delete-e2e-environment:\n runs-on: ubuntu-latest\n steps:\n - id: delete-environment\n name: Delete Qovery E2E environment\n env:\n QOVERY_CLI_ACCESS_TOKEN: ${{ secrets.QOVERY_CLI_ACCESS_TOKEN }}\n run: |\n # Download and install Qovery CLI\n curl -s https://get.qovery.com | bash\n\n echo "Organization name: ${{ vars.QOVERY_ORGANIZATION_NAME }}"\n echo "Project name: ${{ vars.QOVERY_PROJECT_NAME }}"\n echo "Blueprint name: ${{ vars.QOVERY_BLUEPRINT_ENVIRONMENT_NAME }}"\n\n new_environment_name="${GITHUB_HEAD_REF}"\n\n echo "Let\'s delete \'$new_environment_name\' environment and release its resources"\n\n qovery environment delete \\\n --organization "${{ vars.QOVERY_ORGANIZATION_NAME }}" \\\n --project "${{ vars.QOVERY_PROJECT_NAME }}" \\\n --environment "$new_environment_name" \\\n -w\n')),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"The complete file is available ",Object(r.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/todo-demo-app/blob/master/.github/workflows/pull-request-destroy-e2e-environment.yml"}),"here"))),Object(r.b)("p",null,"We just use the ",Object(r.b)("inlineCode",{parentName:"p"},"qovery environment delete")," command to delete the ephemeral environment. The option ",Object(r.b)("inlineCode",{parentName:"p"},"-w")," is used to wait for the deletion to be completed. Qovery will automatically release the resources used by the environment."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congratulations! You've successfully built an automated E2E testing pipeline with GitHub Actions and Qovery. You can now run your tests in a fully isolated environment, provisioned and de-provisioned automatically, and integrated with your GitHub repository."),Object(r.b)("p",null,"Some resources:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://semaphoreci.com/blog/e2e-testing"}),"https://semaphoreci.com/blog/e2e-testing")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(a.a)({parentName:"li"},{href:"https://www.loom.com/share/1be8d4229cb74ed7b0526cc2acbca8ad"}),"Webinar record"))))}p.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),o=n.n(a),r=n(423),i=n.n(r);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,r=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return o.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:i()("feather","icon-"+(r||s))}),t)}},428:function(e,t,n){var a=n(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),o=n.n(a),r=n(424);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),o=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),r=n.n(o),i=n(447),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(446),p=37,m=39;function d(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,o=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:n?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",o,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function h(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,o=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,O=e.size,v=(e.style,e.values),g=e.urlKey,j=Object(u.a)(),E=j.tabGroupChoices,y=j.setTabGroupChoices,f=Object(o.useState)(n),N=f[0],w=f[1];if(null!=i){var _=E[i];null!=_&&_!==N&&w(_)}var T=function(e){w(e),null!=i&&y(i,e)},R=[],A=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&g){var e=b.a.parse(window.location.search);e[g]&&w(e[g])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(O||"md")},l&&r.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?r.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:A,placeholder:s,selectedValue:N,size:O,tabRefs:R},e)):r.a.createElement(d,Object(a.a)({changeSelectedValue:T,handleKeydown:A,selectedValue:N,tabRefs:R},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/56cfbe62.ae1ea43d.js b/56cfbe62.63b6984a.js similarity index 97% rename from 56cfbe62.ae1ea43d.js rename to 56cfbe62.63b6984a.js index 3d3bf4e299..c583893080 100644 --- a/56cfbe62.ae1ea43d.js +++ b/56cfbe62.63b6984a.js @@ -1,2 +1,2 @@ -/*! For license information please see 56cfbe62.ae1ea43d.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{254:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return l}));var r=n(1),o=n(9),a=(n(0),n(425)),c=n(431),i={last_modified_on:"2023-05-29",title:"Using Qovery",description:"Everything you need to know to configure and use your applications on Qovery",sidebar_label:"hidden",hide_pagination:!0},u={id:"using-qovery",title:"Using Qovery",description:"Everything you need to know to configure and use your applications on Qovery",source:"@site/docs/using-qovery.md",permalink:"/docs/using-qovery",sidebar_label:"hidden",sidebar:"docs",previous:{title:"What's next?",permalink:"/docs/getting-started/whats-next"},next:{title:"Interface",permalink:"/docs/using-qovery/interface"}},s=[],p={rightToc:s};function l(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(a.b)("p",null,"This section covers everything you need to know to configure and use your applications on Qovery:"),Object(a.b)(c.a,{to:"/docs/using-qovery/audit-logs/",mdxType:"Jump"},"Audit logs"),Object(a.b)(c.a,{to:"/docs/using-qovery/configuration/",mdxType:"Jump"},"Configuration"),Object(a.b)(c.a,{to:"/docs/using-qovery/deployment/",mdxType:"Jump"},"Deployment"),Object(a.b)(c.a,{to:"/docs/using-qovery/integration/",mdxType:"Jump"},"Integration"),Object(a.b)(c.a,{to:"/docs/using-qovery/interface/",mdxType:"Jump"},"Interface"),Object(a.b)(c.a,{to:"/docs/using-qovery/maintenance/",mdxType:"Jump"},"Maintenance"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/",mdxType:"Jump"},"Troubleshoot"))}l.isMDXComponent=!0},423:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i({},t,{},e)),n},l=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),l=p(n),d=r,m=l["".concat(c,".").concat(d)]||l[d]||f[d]||a;return n?o.a.createElement(m,i({ref:t},s,{components:n})):o.a.createElement(m,i({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,c=new Array(a);c[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s0)&&(t.unobserve(n),t.disconnect(),r())}))}))).observe(n))},to:p})):a.a.createElement("a",Object(r.a)({},e,{href:p}))}},431:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=n(430),c=n(423),i=n.n(c);n(133);t.a=function(e){var t=e.children,n=e.className,r=e.badge,c=e.leftIcon,u=e.rightIcon,s=e.size,p=e.target,l=e.to,f=i()("jump-to","jump-to--"+s,n),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},c&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+c})),o.a.createElement("div",{className:"jump-to--main"},r?o.a.createElement("span",{className:"badge badge--primary badge--right"},r):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(u||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:f},d):o.a.createElement(a.a,{to:l,className:f},d)}},432:function(e,t,n){"use strict";function r(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return r}))}}]); \ No newline at end of file +/*! For license information please see 56cfbe62.63b6984a.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{254:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return l}));var r=n(1),o=n(9),a=(n(0),n(425)),c=n(431),i={last_modified_on:"2023-12-22",title:"Using Qovery",description:"Everything you need to know to configure and use your applications on Qovery",sidebar_label:"hidden",hide_pagination:!0},u={id:"using-qovery",title:"Using Qovery",description:"Everything you need to know to configure and use your applications on Qovery",source:"@site/docs/using-qovery.md",permalink:"/docs/using-qovery",sidebar_label:"hidden",sidebar:"docs",previous:{title:"What's next?",permalink:"/docs/getting-started/whats-next"},next:{title:"Interface",permalink:"/docs/using-qovery/interface"}},s=[],p={rightToc:s};function l(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(a.b)("p",null,"This section covers everything you need to know to configure and use your applications on Qovery:"),Object(a.b)(c.a,{to:"/docs/using-qovery/audit-logs/",mdxType:"Jump"},"Audit logs"),Object(a.b)(c.a,{to:"/docs/using-qovery/configuration/",mdxType:"Jump"},"Configuration"),Object(a.b)(c.a,{to:"/docs/using-qovery/deployment/",mdxType:"Jump"},"Deployment"),Object(a.b)(c.a,{to:"/docs/using-qovery/integration/",mdxType:"Jump"},"Integration"),Object(a.b)(c.a,{to:"/docs/using-qovery/interface/",mdxType:"Jump"},"Interface"),Object(a.b)(c.a,{to:"/docs/using-qovery/maintenance/",mdxType:"Jump"},"Maintenance"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/",mdxType:"Jump"},"Troubleshoot"))}l.isMDXComponent=!0},423:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i({},t,{},e)),n},l=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),l=p(n),d=r,m=l["".concat(c,".").concat(d)]||l[d]||f[d]||a;return n?o.a.createElement(m,i({ref:t},s,{components:n})):o.a.createElement(m,i({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,c=new Array(a);c[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s0)&&(t.unobserve(n),t.disconnect(),r())}))}))).observe(n))},to:p})):a.a.createElement("a",Object(r.a)({},e,{href:p}))}},431:function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=n(430),c=n(423),i=n.n(c);n(133);t.a=function(e){var t=e.children,n=e.className,r=e.badge,c=e.leftIcon,u=e.rightIcon,s=e.size,p=e.target,l=e.to,f=i()("jump-to","jump-to--"+s,n),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},c&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+c})),o.a.createElement("div",{className:"jump-to--main"},r?o.a.createElement("span",{className:"badge badge--primary badge--right"},r):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(u||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:f},d):o.a.createElement(a.a,{to:l,className:f},d)}},432:function(e,t,n){"use strict";function r(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return r}))}}]); \ No newline at end of file diff --git a/30e307eb.9f08b9f7.js.LICENSE.txt b/56cfbe62.63b6984a.js.LICENSE.txt similarity index 100% rename from 30e307eb.9f08b9f7.js.LICENSE.txt rename to 56cfbe62.63b6984a.js.LICENSE.txt diff --git a/60296d59.e2bd789a.js b/60296d59.3e50ab5a.js similarity index 98% rename from 60296d59.e2bd789a.js rename to 60296d59.3e50ab5a.js index 637550085e..be7da23339 100644 --- a/60296d59.e2bd789a.js +++ b/60296d59.3e50ab5a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{264:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(425)),l=a(437),c=a(444),i=a(424),s=a(429),b=(a(431),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Install Qovery on your Amazon Web Services account",permalink:"/guides/cloud-provider/guide-amazon-web-services"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),o=a.n(n),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},428:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),o=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(432),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(430),l=a(423),c=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),o=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(449),c=a(423),i=a.n(c),s=a(433),b=a.n(s),u=a(448),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{264:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(425)),l=a(437),c=a(443),i=a(424),s=a(429),b=(a(431),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Install Qovery on your Amazon Web Services account",permalink:"/guides/cloud-provider/guide-amazon-web-services"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),o=a.n(n),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},428:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),o=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(432),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(430),l=a(423),c=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),o=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(447),c=a(423),i=a.n(c),s=a(433),b=a.n(s),u=a(446),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/66bbed7b.709e2f79.js b/66bbed7b.a1c39270.js similarity index 99% rename from 66bbed7b.709e2f79.js rename to 66bbed7b.a1c39270.js index b7d50f6cee..3ef8d9cfdb 100644 --- a/66bbed7b.709e2f79.js +++ b/66bbed7b.a1c39270.js @@ -1,2 +1,2 @@ -/*! For license information please see 66bbed7b.709e2f79.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{269:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(434),c=n(429),l=n(424),s={last_modified_on:"2023-06-05",$schema:"/.meta/.schemas/guides.json",title:"Microservices",description:"How to deploy microservices with Qovery",author_github:"https://github.com/pjeziorowski",tags:["type: guide","technology: qovery"]},p={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Microservices",description:"How to deploy microservices with Qovery",permalink:"/guides/advanced/microservices",readingTime:"6 min read",source:"@site/guides/advanced/microservices.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Microservices",truncated:!1,prevItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"},nextItem:{title:"Migrate your application from Heroku to AWS",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws"}},u=[{value:"Deploy Application A",id:"deploy-application-a",children:[{value:"Exposing public API",id:"exposing-public-api",children:[]}]},{value:"Deploy Application B",id:"deploy-application-b",children:[]},{value:"Deploy Database",id:"deploy-database",children:[]},{value:"Use the database",id:"use-the-database",children:[]},{value:"Consume internal APIs",id:"consume-internal-apis",children:[]},{value:"Consume the public API in the frontend application",id:"consume-the-public-api-in-the-frontend-application",children:[]},{value:"Summary",id:"summary",children:[]},{value:"Q&A",id:"qa",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"This guide is a bit outdated. We are working on a new version of it. Stay tuned!")),Object(o.b)(c.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have already deployed an application with Qovery"),Object(o.b)("li",{parentName:"ul"},"You are familiar with the concept of Microservices"))),Object(o.b)("p",null,"In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API.\nOur backend microservices will communicate on a secure internal network, not accessible from the outside.\nOur front-end application will consume the API only from the publicly exposed application."),Object(o.b)("p",null,"The schema of what we want to achieve:"),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros.jpg",alt:"Microservices"})),Object(o.b)("p",null,"As you can see in the picture:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"we have two backend applications (",Object(o.b)("strong",{parentName:"li"},"App A")," and ",Object(o.b)("strong",{parentName:"li"},"App B"),")"),Object(o.b)("li",{parentName:"ul"},"one of them (",Object(o.b)("strong",{parentName:"li"},"App B"),") connected to a database"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"App A")," exposes a public API that is consumed by API clients (our frontend application run in users browsers)."),Object(o.b)("li",{parentName:"ul"},"additionally, we host our frontend application (",Object(o.b)("strong",{parentName:"li"},"UI"),") on Qovery so that users can access it directly in their browsers.")),Object(o.b)("p",null,"What differentiates Qovery from most other similar platforms is its first-class support of microservices. At Qovery, your project can be easily\ncomposed of multiple applications. It's up to you to decide how to build your system, but Qovery enables you to easily and safely communicate between your backend applications, databases, and frontend websites."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-a"},"Deploy Application A"),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy applications. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this video guide"),".")),Object(o.b)("p",null,"In the first step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_A")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_A"))),Object(o.b)("p",null,"After the application is created, let's expose the API publicly - it will be used later on by our frontend application."),Object(o.b)("h3",{id:"exposing-public-api"},"Exposing public API"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_A")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This is it. By default, Qovery exposes your ports publicly over HTTPS on port 443, so the app should be publicly accessible and reachable later on by our frontend application.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-b"},"Deploy Application B"),Object(o.b)("p",null,"In the second step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_B")),Object(o.b)("li",{parentName:"ul"},"The app is ready to use a PostgreSQL client to connect to a PostgreSQL database")),Object(o.b)("p",null,"Steps to do:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_B")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080"),Object(o.b)("li",{parentName:"ul"},"Click ",Object(o.b)("strong",{parentName:"li"},"Advanced")," settings in the 8080 port"),Object(o.b)("li",{parentName:"ul"},"Remove the check from the ",Object(o.b)("strong",{parentName:"li"},"Publicly Accessible")," field")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-2.png",alt:"Microservices"})),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"It will make your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," application not reachable publicly. It will be only reachable on the internal network by other microservices in your environment."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-database"},"Deploy Database"),Object(o.b)("p",null,"In this step, we'll deploy a PostgreSQL database that we'll consume in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in the next step."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to the environment in which you previously deployed your apps"),Object(o.b)("li",{parentName:"ul"},"Create a new PostgreSQL database named ",Object(o.b)("strong",{parentName:"li"},"MY_DB"))),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy databases. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this video guide"),"."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"use-the-database"},"Use the database"),Object(o.b)("p",null,"In this step, we'll make use of our database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")),Object(o.b)("p",null,"All you need to do to consume your database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is to configure your PostgreSQL client to use ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets injected by Qovery.\nYou can read more about this concept ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"here"),"."),Object(o.b)("p",null,"If your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is a Node.js application, this examplary code snippet will work well:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const { Client } = require('pg')\n\nconst client = new Client({\n host: process.env.QOVERY_DATABASE_MY_DB_HOST,\n port: process.env.QOVERY_DATABASE_MY_DB_PORT,\n user: process.env.QOVERY_DATABASE_MY_DB_USER,\n password: process.env.QOVERY_DATABASE_MY_DB_PASSWORD,\n})\n\nclient.connect(err => {\n if (err) {\n console.error('connection error', err.stack)\n } else {\n console.log('connected')\n }\n})\n")),Object(o.b)("p",null,"This is it! After deploying the database, application and executing the code snippet, you should see the message ",Object(o.b)("inlineCode",{parentName:"p"},"connected"),"."),Object(o.b)("p",null,"We made use of ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," variables injected by Qovery to make it easy to consume all the services within the environment.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-internal-apis"},"Consume internal APIs"),Object(o.b)("p",null,"In this step, we'll use the private API of our ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in our ",Object(o.b)("strong",{parentName:"p"},"APP_A")," over a private network.\nWe have already configured everything to make it work. The only missing step is the configuration in ",Object(o.b)("strong",{parentName:"p"},"APP_A")," - it needs to know how to access our ",Object(o.b)("strong",{parentName:"p"},"APP_B"),"."),Object(o.b)("p",null,"In the example below, we'll use Node.js and ",Object(o.b)("inlineCode",{parentName:"p"},"axios")," to create an HTTP client able to consume the API of ",Object(o.b)("strong",{parentName:"p"},"APP_B"),":"),Object(o.b)("p",null,"Now, you can configure your HTTP client in the frontend application to target your backend API:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const axios = require('axios');\nconst appBAddress = \"http://\" + process.env.QOVERY_APPLICATION_APP_B_HOST + \":\" + process.env.QOVERY_APPLICATION_APP_B_PORT\n\naxios.get(appBAddress + '/api/users')\n .then(response => {\n console.log(response.data);\n })\n .catch(error => {\n console.log(error);\n });\n")),Object(o.b)("p",null,"This is it! ",Object(o.b)("strong",{parentName:"p"},"Every request using the API client we have just configured will consume the API of "),"APP_B",Object(o.b)("strong",{parentName:"p"}," over the secure, internal network.")),Object(o.b)("p",null,"Once again, we used the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. Read more about them ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"here"))),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-the-public-api-in-the-frontend-application"},"Consume the public API in the frontend application"),Object(o.b)("p",null,"In this step, we'll deploy a frontend application and consume our public API exposed by ",Object(o.b)("strong",{parentName:"p"},"APP_A"),"."),Object(o.b)("p",null,"In the first step, create your frontend application."),Object(o.b)("p",null,"After the application is created, we can easily configure it to consume our public API. All we need to do is to make use of the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. See how to achieve it in a Nuxt.js example below:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"export default {\n env: {\n apiUrl: process.env.QOVERY_APPLICATION_APP_A_URL\n }\n}\n")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import axios from 'axios'\n\nexport default axios.create({\n baseURL: process.env.apiUrl\n})\n")),Object(o.b)("p",null,"After providing the configuration from above, deploy your frontend application."),Object(o.b)("p",null,"Now our frontend application will be able to consume the API exposed by the publicly exposed ",Object(o.b)("strong",{parentName:"p"},"APP_A"),".")))),Object(o.b)("h2",{id:"summary"},"Summary"),Object(o.b)("p",null,"In this guide, we deployed two microservices that communicate over the internal network. We also deployed a frontend application that makes use of a public API exposed by one of our applications. At the same time, we deployed a database and connected it to the second of our backend microservices."),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}d.isMDXComponent=!0},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),p=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},u=function(e){var t=p(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,m=u["".concat(i,".").concat(d)]||u[d]||b[d]||o;return n?r.a.createElement(m,c({ref:t},s,{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=i>2?arguments[2]:void 0,s=void 0===l?n:r(l,n);s>c;)t[c++]=e;return t}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},433:function(e,t,n){"use strict";var a=n(435),r=n(51);function o(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=r({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),r=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(r),o,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[o(t,e),"[",a,"]"].join(""):[o(t,e),"[",o(a,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=r({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var r=e[a];if(void 0===r)return"";if(null===r)return o(a,t);if(Array.isArray(r)){var i=[];return r.slice().forEach((function(e){void 0!==e&&i.push(n(a,e,i.length))})),i.join("&")}return o(a,t)+"="+o(r,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),p=Object(a.useState)(null),u=p[0],b=p[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file +/*! For license information please see 66bbed7b.a1c39270.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{269:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(434),c=n(429),l=n(424),s={last_modified_on:"2023-12-20",$schema:"/.meta/.schemas/guides.json",title:"Microservices",description:"How to deploy microservices with Qovery",author_github:"https://github.com/pjeziorowski",tags:["type: guide","technology: qovery"]},p={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Microservices",description:"How to deploy microservices with Qovery",permalink:"/guides/advanced/microservices",readingTime:"6 min read",source:"@site/guides/advanced/microservices.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Microservices",truncated:!1,prevItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"},nextItem:{title:"Migrate your application from Heroku to AWS",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws"}},u=[{value:"Deploy Application A",id:"deploy-application-a",children:[{value:"Exposing public API",id:"exposing-public-api",children:[]}]},{value:"Deploy Application B",id:"deploy-application-b",children:[]},{value:"Deploy Database",id:"deploy-database",children:[]},{value:"Use the database",id:"use-the-database",children:[]},{value:"Consume internal APIs",id:"consume-internal-apis",children:[]},{value:"Consume the public API in the frontend application",id:"consume-the-public-api-in-the-frontend-application",children:[]},{value:"Summary",id:"summary",children:[]},{value:"Q&A",id:"qa",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"This guide is a bit outdated. We are working on a new version of it. Stay tuned!")),Object(o.b)(c.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have already deployed an application with Qovery"),Object(o.b)("li",{parentName:"ul"},"You are familiar with the concept of Microservices"))),Object(o.b)("p",null,"In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API.\nOur backend microservices will communicate on a secure internal network, not accessible from the outside.\nOur front-end application will consume the API only from the publicly exposed application."),Object(o.b)("p",null,"The schema of what we want to achieve:"),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros.jpg",alt:"Microservices"})),Object(o.b)("p",null,"As you can see in the picture:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"we have two backend applications (",Object(o.b)("strong",{parentName:"li"},"App A")," and ",Object(o.b)("strong",{parentName:"li"},"App B"),")"),Object(o.b)("li",{parentName:"ul"},"one of them (",Object(o.b)("strong",{parentName:"li"},"App B"),") connected to a database"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"App A")," exposes a public API that is consumed by API clients (our frontend application run in users browsers)."),Object(o.b)("li",{parentName:"ul"},"additionally, we host our frontend application (",Object(o.b)("strong",{parentName:"li"},"UI"),") on Qovery so that users can access it directly in their browsers.")),Object(o.b)("p",null,"What differentiates Qovery from most other similar platforms is its first-class support of microservices. At Qovery, your project can be easily\ncomposed of multiple applications. It's up to you to decide how to build your system, but Qovery enables you to easily and safely communicate between your backend applications, databases, and frontend websites."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-a"},"Deploy Application A"),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy applications. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this video guide"),".")),Object(o.b)("p",null,"In the first step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_A")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_A"))),Object(o.b)("p",null,"After the application is created, let's expose the API publicly - it will be used later on by our frontend application."),Object(o.b)("h3",{id:"exposing-public-api"},"Exposing public API"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_A")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This is it. By default, Qovery exposes your ports publicly over HTTPS on port 443, so the app should be publicly accessible and reachable later on by our frontend application.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-b"},"Deploy Application B"),Object(o.b)("p",null,"In the second step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_B")),Object(o.b)("li",{parentName:"ul"},"The app is ready to use a PostgreSQL client to connect to a PostgreSQL database")),Object(o.b)("p",null,"Steps to do:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_B")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080"),Object(o.b)("li",{parentName:"ul"},"Click ",Object(o.b)("strong",{parentName:"li"},"Advanced")," settings in the 8080 port"),Object(o.b)("li",{parentName:"ul"},"Remove the check from the ",Object(o.b)("strong",{parentName:"li"},"Publicly Accessible")," field")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-2.png",alt:"Microservices"})),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"It will make your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," application not reachable publicly. It will be only reachable on the internal network by other microservices in your environment."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-database"},"Deploy Database"),Object(o.b)("p",null,"In this step, we'll deploy a PostgreSQL database that we'll consume in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in the next step."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to the environment in which you previously deployed your apps"),Object(o.b)("li",{parentName:"ul"},"Create a new PostgreSQL database named ",Object(o.b)("strong",{parentName:"li"},"MY_DB"))),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy databases. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this video guide"),"."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"use-the-database"},"Use the database"),Object(o.b)("p",null,"In this step, we'll make use of our database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")),Object(o.b)("p",null,"All you need to do to consume your database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is to configure your PostgreSQL client to use ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets injected by Qovery.\nYou can read more about this concept ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"here"),"."),Object(o.b)("p",null,"If your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is a Node.js application, this examplary code snippet will work well:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const { Client } = require('pg')\n\nconst client = new Client({\n host: process.env.QOVERY_DATABASE_MY_DB_HOST,\n port: process.env.QOVERY_DATABASE_MY_DB_PORT,\n user: process.env.QOVERY_DATABASE_MY_DB_USER,\n password: process.env.QOVERY_DATABASE_MY_DB_PASSWORD,\n})\n\nclient.connect(err => {\n if (err) {\n console.error('connection error', err.stack)\n } else {\n console.log('connected')\n }\n})\n")),Object(o.b)("p",null,"This is it! After deploying the database, application and executing the code snippet, you should see the message ",Object(o.b)("inlineCode",{parentName:"p"},"connected"),"."),Object(o.b)("p",null,"We made use of ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," variables injected by Qovery to make it easy to consume all the services within the environment.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-internal-apis"},"Consume internal APIs"),Object(o.b)("p",null,"In this step, we'll use the private API of our ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in our ",Object(o.b)("strong",{parentName:"p"},"APP_A")," over a private network.\nWe have already configured everything to make it work. The only missing step is the configuration in ",Object(o.b)("strong",{parentName:"p"},"APP_A")," - it needs to know how to access our ",Object(o.b)("strong",{parentName:"p"},"APP_B"),"."),Object(o.b)("p",null,"In the example below, we'll use Node.js and ",Object(o.b)("inlineCode",{parentName:"p"},"axios")," to create an HTTP client able to consume the API of ",Object(o.b)("strong",{parentName:"p"},"APP_B"),":"),Object(o.b)("p",null,"Now, you can configure your HTTP client in the frontend application to target your backend API:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const axios = require('axios');\nconst appBAddress = \"http://\" + process.env.QOVERY_APPLICATION_APP_B_HOST + \":\" + process.env.QOVERY_APPLICATION_APP_B_PORT\n\naxios.get(appBAddress + '/api/users')\n .then(response => {\n console.log(response.data);\n })\n .catch(error => {\n console.log(error);\n });\n")),Object(o.b)("p",null,"This is it! ",Object(o.b)("strong",{parentName:"p"},"Every request using the API client we have just configured will consume the API of "),"APP_B",Object(o.b)("strong",{parentName:"p"}," over the secure, internal network.")),Object(o.b)("p",null,"Once again, we used the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. Read more about them ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"here"))),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-the-public-api-in-the-frontend-application"},"Consume the public API in the frontend application"),Object(o.b)("p",null,"In this step, we'll deploy a frontend application and consume our public API exposed by ",Object(o.b)("strong",{parentName:"p"},"APP_A"),"."),Object(o.b)("p",null,"In the first step, create your frontend application."),Object(o.b)("p",null,"After the application is created, we can easily configure it to consume our public API. All we need to do is to make use of the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. See how to achieve it in a Nuxt.js example below:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"export default {\n env: {\n apiUrl: process.env.QOVERY_APPLICATION_APP_A_URL\n }\n}\n")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import axios from 'axios'\n\nexport default axios.create({\n baseURL: process.env.apiUrl\n})\n")),Object(o.b)("p",null,"After providing the configuration from above, deploy your frontend application."),Object(o.b)("p",null,"Now our frontend application will be able to consume the API exposed by the publicly exposed ",Object(o.b)("strong",{parentName:"p"},"APP_A"),".")))),Object(o.b)("h2",{id:"summary"},"Summary"),Object(o.b)("p",null,"In this guide, we deployed two microservices that communicate over the internal network. We also deployed a frontend application that makes use of a public API exposed by one of our applications. At the same time, we deployed a database and connected it to the second of our backend microservices."),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}d.isMDXComponent=!0},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),p=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},u=function(e){var t=p(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,m=u["".concat(i,".").concat(d)]||u[d]||b[d]||o;return n?r.a.createElement(m,c({ref:t},s,{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=i>2?arguments[2]:void 0,s=void 0===l?n:r(l,n);s>c;)t[c++]=e;return t}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},433:function(e,t,n){"use strict";var a=n(435),r=n(51);function o(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=r({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),r=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(r),o,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[o(t,e),"[",a,"]"].join(""):[o(t,e),"[",o(a,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=r({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var r=e[a];if(void 0===r)return"";if(null===r)return o(a,t);if(Array.isArray(r)){var i=[];return r.slice().forEach((function(e){void 0!==e&&i.push(n(a,e,i.length))})),i.join("&")}return o(a,t)+"="+o(r,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),p=Object(a.useState)(null),u=p[0],b=p[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/56cfbe62.ae1ea43d.js.LICENSE.txt b/66bbed7b.a1c39270.js.LICENSE.txt similarity index 100% rename from 56cfbe62.ae1ea43d.js.LICENSE.txt rename to 66bbed7b.a1c39270.js.LICENSE.txt diff --git a/672ba3d6.9b98b029.js b/672ba3d6.7e2d9a2f.js similarity index 98% rename from 672ba3d6.9b98b029.js rename to 672ba3d6.7e2d9a2f.js index 59a7c02614..d46218dc97 100644 --- a/672ba3d6.9b98b029.js +++ b/672ba3d6.7e2d9a2f.js @@ -1,2 +1,2 @@ -/*! For license information please see 672ba3d6.9b98b029.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{270:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),o=a(450),c=a(445),i=a(562),l=a(436),s=Object(o.a)("h2");t.default=function(){var e=Object(l.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(c.a,{title:"Community",description:"Join the Qovery community. Connect with the core Qovery team and other Qovery users."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Community"),r.a.createElement(i.a,{buttonClass:"highlight",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement(s,{id:"connect"},"Connect"),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Discord"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discord"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://community.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-globe"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))))),r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/Qovery_",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter",title:"Twitter"})),r.a.createElement("div",{className:"panel--title"},"@Qovery"),r.a.createElement("div",{className:"panel--description"},"Follow us in real-time"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github qovery"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},423:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),l.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(z,{alt:m.alt,url:d})):r.a.createElement(z,{alt:m.alt,url:d})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},F=a(462),J=a(463),P=a(3);a(138);t.a=function(e){var t=Object(h.a)().siteConfig,a=void 0===t?{}:t,n=a.favicon,i=(a.tagline,a.title),l=a.themeConfig.image,s=a.url,m=e.children,u=e.title,d=e.noFooter,f=e.description,p=e.image,g=e.keywords,v=(e.permalink,e.version),b=u?u+" | "+i:i,E=p||l,y=s+Object(_.a)(E),w=Object(_.a)(n),N=Object(P.h)(),k=N?"https://docs.qovery.com"+(N.pathname.endsWith("/")?N.pathname:N.pathname+"/"):null;return r.a.createElement(J.a,null,r.a.createElement(F.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&r.a.createElement("title",null,b),b&&r.a.createElement("meta",{property:"og:title",content:b}),n&&r.a.createElement("link",{rel:"shortcut icon",href:w}),f&&r.a.createElement("meta",{name:"description",content:f}),f&&r.a.createElement("meta",{property:"og:description",content:f}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:y}),E&&r.a.createElement("meta",{property:"twitter:image",content:y}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(o.a,null),r.a.createElement(D,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(Q,null)))}},450:function(e,t,a){"use strict";var n=a(9),r=a(0),o=a.n(r),c=a(423),i=a.n(c),l=a(436),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,c=Object(n.a)(t,["id"]),s=Object(l.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,h=void 0!==f&&f;return r?o.a.createElement(e,c,o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:i()("anchor",(a={},a[m.a.enhancedAnchor]=!h,a)),id:r}),o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),c.children):o.a.createElement(e,c)}}},454:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},479:function(e,t){var a,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function i(e){if(a===setTimeout)return setTimeout(e,0);if((a===o||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:o}catch(e){a=o}try{n="function"==typeof clearTimeout?clearTimeout:c}catch(e){n=c}}();var l,s=[],m=!1,u=-1;function d(){m&&l&&(m=!1,l.length?s=l.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=i(d);m=!0;for(var t=s.length;t;){for(l=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(479))},556:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,o=r-(n||r);e.diff=o,e.prev=n,e.curr=r,n=r;for(var c=new Array(arguments.length),i=0;i0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"days":case"day":case"d":return c*o;case"hours":case"hour":case"hrs":case"hr":case"h":return c*r;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===l&&!1===isNaN(e))return t.long?c(i=e,o,"day")||c(i,r,"hour")||c(i,n,"minute")||c(i,a,"second")||i+" ms":function(e){if(e>=o)return Math.round(e/o)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},558:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},562:function(e,t,a){"use strict";a(446),a(447);var n=a(0),r=a.n(n),o=a(423),c=a.n(o),i=(a(58),a(21),a(554)),l=a.n(i),s=a(558),m=function(e){return new Promise((function(t,a){return l()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var o="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?o=t:"string"==typeof a&&(o=a);var c="&EMAIL="+r+u(t),i=""+o+c;return m(i)};a(152),t.a=function(e){var t,a=e.block,o=e.buttonClass,i=e.center,l=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),h=f[0],p=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:c()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":i},t["mailing-list--"+m]=m,t))},!1!==l&&r.a.createElement("div",{className:"mailing-list--description"},l),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(h).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(h+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:c()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return p(e.target.value)},className:c()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:c()("button","button--"+(o||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file +/*! For license information please see 672ba3d6.7e2d9a2f.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{270:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),o=a(450),c=a(445),i=a(562),l=a(436),s=Object(o.a)("h2");t.default=function(){var e=Object(l.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(c.a,{title:"Community",description:"Join the Qovery community. Connect with the core Qovery team and other Qovery users."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Community"),r.a.createElement(i.a,{buttonClass:"highlight",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement(s,{id:"connect"},"Connect"),r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Discord"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discord"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://community.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-globe"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))))),r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/Qovery_",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter",title:"Twitter"})),r.a.createElement("div",{className:"panel--title"},"@Qovery"),r.a.createElement("div",{className:"panel--description"},"Follow us in real-time"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github qovery"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},423:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),l.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(z,{alt:m.alt,url:d})):r.a.createElement(z,{alt:m.alt,url:d})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},F=a(462),J=a(463),P=a(3);a(138);t.a=function(e){var t=Object(h.a)().siteConfig,a=void 0===t?{}:t,n=a.favicon,i=(a.tagline,a.title),l=a.themeConfig.image,s=a.url,m=e.children,u=e.title,d=e.noFooter,f=e.description,p=e.image,g=e.keywords,v=(e.permalink,e.version),b=u?u+" | "+i:i,E=p||l,y=s+Object(_.a)(E),w=Object(_.a)(n),N=Object(P.h)(),k=N?"https://docs.qovery.com"+(N.pathname.endsWith("/")?N.pathname:N.pathname+"/"):null;return r.a.createElement(J.a,null,r.a.createElement(F.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&r.a.createElement("title",null,b),b&&r.a.createElement("meta",{property:"og:title",content:b}),n&&r.a.createElement("link",{rel:"shortcut icon",href:w}),f&&r.a.createElement("meta",{name:"description",content:f}),f&&r.a.createElement("meta",{property:"og:description",content:f}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:y}),E&&r.a.createElement("meta",{property:"twitter:image",content:y}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(o.a,null),r.a.createElement(D,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(Q,null)))}},450:function(e,t,a){"use strict";var n=a(9),r=a(0),o=a.n(r),c=a(423),i=a.n(c),l=a(436),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,c=Object(n.a)(t,["id"]),s=Object(l.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,h=void 0!==f&&f;return r?o.a.createElement(e,c,o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:i()("anchor",(a={},a[m.a.enhancedAnchor]=!h,a)),id:r}),o.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),c.children):o.a.createElement(e,c)}}},454:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},479:function(e,t){var a,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function i(e){if(a===setTimeout)return setTimeout(e,0);if((a===o||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:o}catch(e){a=o}try{n="function"==typeof clearTimeout?clearTimeout:c}catch(e){n=c}}();var l,s=[],m=!1,u=-1;function d(){m&&l&&(m=!1,l.length?s=l.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=i(d);m=!0;for(var t=s.length;t;){for(l=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(479))},556:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,o=r-(n||r);e.diff=o,e.prev=n,e.curr=r,n=r;for(var c=new Array(arguments.length),i=0;i0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"days":case"day":case"d":return c*o;case"hours":case"hour":case"hrs":case"hr":case"h":return c*r;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===l&&!1===isNaN(e))return t.long?c(i=e,o,"day")||c(i,r,"hour")||c(i,n,"minute")||c(i,a,"second")||i+" ms":function(e){if(e>=o)return Math.round(e/o)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},558:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},562:function(e,t,a){"use strict";a(448),a(449);var n=a(0),r=a.n(n),o=a(423),c=a.n(o),i=(a(58),a(21),a(554)),l=a.n(i),s=a(558),m=function(e){return new Promise((function(t,a){return l()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var o="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?o=t:"string"==typeof a&&(o=a);var c="&EMAIL="+r+u(t),i=""+o+c;return m(i)};a(152),t.a=function(e){var t,a=e.block,o=e.buttonClass,i=e.center,l=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),h=f[0],p=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],w=E[1],N=Object(n.useState)("Could not subscribe :("),k=N[0],_=N[1];return r.a.createElement("div",{className:c()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":i},t["mailing-list--"+m]=m,t))},!1!==l&&r.a.createElement("div",{className:"mailing-list--description"},l),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(h).then((function(e){"success"===e.result?(b(!0),y&&w(!1)):(w(!0),e.msg.includes(h+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){w(!0)}))}(e)},className:c()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return p(e.target.value)},className:c()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:c()("button","button--"+(o||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file diff --git a/66bbed7b.709e2f79.js.LICENSE.txt b/672ba3d6.7e2d9a2f.js.LICENSE.txt similarity index 100% rename from 66bbed7b.709e2f79.js.LICENSE.txt rename to 672ba3d6.7e2d9a2f.js.LICENSE.txt diff --git a/6ce627d6.918e632b.js b/6ce627d6.c4038975.js similarity index 99% rename from 6ce627d6.918e632b.js rename to 6ce627d6.c4038975.js index 27d523715f..f378090f57 100644 --- a/6ce627d6.918e632b.js +++ b/6ce627d6.c4038975.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{275:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return s})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(425)),l=a(424),i=a(444),c=a(437),b=a(429),u={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","cloud_provider: aws"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"13 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"cloud_provider: aws",permalink:"/guides/tags/cloud-provider-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile or Use Buildpacks",id:"1-create-your-dockerfile-or-use-buildpacks",children:[{value:"Choose your Dockerfile template",id:"choose-your-dockerfile-template",children:[]},{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]},{value:"Limitations",id:"limitations",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you experience any problem while migrating from Heroku to AWS with Qovery.")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/cloud-provider/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile-or-use-buildpacks"}),"Use Buildpacks or Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile-or-use-buildpacks"},"1. Create your Dockerfile or Use Buildpacks"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Buildpacks"),Object(r.b)("li",{parentName:"ol"},"Docker")),Object(r.b)("p",null,"Both options build a container image that is runnable by a container engine (E.g. Docker). Qovery runs containers on Kubernetes."),Object(r.b)("p",null,"Choose the option that better fits you:"),Object(r.b)(c.a,{centered:!0,className:"rounded",defaultValue:"buildpacks",placeholder:"Use Buildpacks or Create your Dockerfile",select:!1,size:null,values:[{group:"Platforms",label:"Use Buildpacks",value:"buildpacks"},{group:"Platforms",label:"Create your Dockerfile",value:"dockerfile"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"dockerfile",mdxType:"TabItem"},Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h3",{id:"choose-your-dockerfile-template"},"Choose your Dockerfile template"),Object(r.b)("p",null,"To get started,"),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them.")),Object(r.b)(i.a,{value:"buildpacks",mdxType:"TabItem"},Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://buildpacks.io/"}),"Buildpacks")," automatically detects the language and the framework your application is using. Buildpacks builds and runs your app. Here is the list of ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#option-1-buildpacks"}),"supported languages and frameworks"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"We do recommend using Docker to keep the full control of what's going on behind the scene. Buildpacks is a great technology but difficult to debug when something goes wrong. You can try deploying your apps on AWS with Qovery with Buildpacks, if you do not succeed, we do recommend switching for Docker.")),Object(r.b)("h3",{id:"limitations"},"Limitations"),Object(r.b)("p",null,"Here are some limitations due to our Buildpacks implementation:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Qovery Buildpacks does not support Procfile with multiple commands at the moment."),Object(r.b)("li",{parentName:"ul"},"Qovery does not support custom Buildpacks.")),Object(r.b)("p",null,"Those limitations will be solved in the coming months."))),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select the Build mode for ",Object(r.b)("inlineCode",{parentName:"li"},"Buildpacks")," or ",Object(r.b)("inlineCode",{parentName:"li"},"Dockerfile")," according to what you want."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"If you use Buildpacks for one of your app AND you have indicated a local listening port of your application, you will need to add an environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"PORT")," with the value of your port to make your application starting properly. Otherwise, Qovery will fail to deploy your app!")),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Yes, with the Qovery CLI and the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell"),". ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"Check out the documentation"),"."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var o=a(0),n=a.n(o),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},428:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var o=a(0),n=a.n(o),r=a(424);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},437:function(e,t,a){"use strict";var o=a(1),n=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(449),i=a(423),c=a.n(i),b=a(433),u=a.n(b),s=a(448),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,u=e.selectedValue,s=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return s.push(e)},onKeyDown:function(e){return l(s,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(s.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var T=g[l];null!=T&&T!==k&&N(T)}var C=function(e){N(e),null!=l&&v(l,e)},D=[],A=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:C,handleKeydown:A,placeholder:c,selectedValue:k,size:y,tabRefs:D},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:C,handleKeydown:A,selectedValue:k,tabRefs:D},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},444:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{275:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return u})),a.d(t,"metadata",(function(){return s})),a.d(t,"rightToc",(function(){return p})),a.d(t,"default",(function(){return m}));var o=a(1),n=a(9),r=(a(0),a(425)),l=a(424),i=a(443),c=a(437),b=a(429),u={last_modified_on:"2023-05-29",$schema:"/.meta/.schemas/guides.json",title:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","cloud_provider: aws"],hide_pagination:!0},s={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Migrate your application from Heroku to AWS",description:"Guide on how to migrate all your applications from Heroku to AWS with your databases",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws",readingTime:"13 min read",source:"@site/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"cloud_provider: aws",permalink:"/guides/tags/cloud-provider-aws"}],title:"Migrate your application from Heroku to AWS",truncated:!1,prevItem:{title:"Microservices",permalink:"/guides/advanced/microservices"},nextItem:{title:"Migration",permalink:"/guides/advanced/migration"}},p=[{value:"Migration Steps",id:"migration-steps",children:[]},{value:"1. Create your Dockerfile or Use Buildpacks",id:"1-create-your-dockerfile-or-use-buildpacks",children:[{value:"Choose your Dockerfile template",id:"choose-your-dockerfile-template",children:[]},{value:"Test your Dockerfile",id:"test-your-dockerfile",children:[]},{value:"Environment variables at the build time",id:"environment-variables-at-the-build-time",children:[]},{value:"Add your Dockerfile to Git",id:"add-your-dockerfile-to-git",children:[]},{value:"Loop",id:"loop",children:[]},{value:"Limitations",id:"limitations",children:[]}]},{value:"2. Create resources on Qovery",id:"2-create-resources-on-qovery",children:[{value:"Application",id:"application",children:[]},{value:"Database",id:"database",children:[]}]},{value:"3. Configure your Environment Variables and Secrets",id:"3-configure-your-environment-variables-and-secrets",children:[{value:"Connect your frontend app to your backend app",id:"connect-your-frontend-app-to-your-backend-app",children:[]},{value:"Connect your backend app to your database",id:"connect-your-backend-app-to-your-database",children:[]}]},{value:"4. Copy data from your Heroku databases to your AWS databases",id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases",children:[]},{value:"5. Deploy your apps!",id:"5-deploy-your-apps",children:[]},{value:"FAQ by Heroku users",id:"faq-by-heroku-users",children:[{value:"How to create a custom domain?",id:"how-to-create-a-custom-domain",children:[]},{value:"How to monitor my apps?",id:"how-to-monitor-my-apps",children:[]},{value:"Do you have Heroku "Review App" equivalent?",id:"do-you-have-heroku-review-app-equivalent",children:[]},{value:"How to rollback?",id:"how-to-rollback",children:[]},{value:"How auto-scaling works?",id:"how-auto-scaling-works",children:[]},{value:"How to manage database migration?",id:"how-to-manage-database-migration",children:[]},{value:"Is it possible to get a shell / connect to my app?",id:"is-it-possible-to-get-a-shell--connect-to-my-app",children:[]},{value:"Can I use Terraform and Infrastructure as Code?",id:"can-i-use-terraform-and-infrastructure-as-code",children:[]},{value:"How can I connect my app to MongoDB Atlas?",id:"how-can-i-connect-my-app-to-mongodb-atlas",children:[]},{value:"How can I connect my app to an AWS service not managed by Qovery?",id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]}],d={rightToc:p};function m(e){var t=e.components,a=Object(n.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"This guide describes how to migrate your application running on Heroku to AWS with Qovery. It covers all required steps you need to take to deploy your application on AWS and transfer your data from Heroku Postgres to the database managed by AWS via Qovery."),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Please contact us via ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum")," if you experience any problem while migrating from Heroku to AWS with Qovery.")),Object(r.b)(b.a,{name:"guide",mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You are familiar with Heroku basics, have a Heroku account and access to Heroku CLI"),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"sign in on Qovery")),Object(r.b)("li",{parentName:"ul"},"You have ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/guides/cloud-provider/guide-amazon-web-services/"}),"set up your AWS account")," with Qovery"))),Object(r.b)("h2",{id:"migration-steps"},"Migration Steps"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#1-create-your-dockerfile-or-use-buildpacks"}),"Use Buildpacks or Create your Dockerfile")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#2-create-resources-on-qovery"}),"Create resources on Qovery")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#3-configure-your-environment-variables-and-secrets"}),"Configure Environment Variables and Secrets")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#4-copy-data-from-your-heroku-databases-to-your-aws-databases"}),"Copy data from your Heroku databases to your AWS databases")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#5-deploy-your-apps-"}),"Deploy your apps")),Object(r.b)("li",{parentName:"ol"},Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"#faq-by-heroku-users"}),"FAQ by Heroku users"))),Object(r.b)("h2",{id:"1-create-your-dockerfile-or-use-buildpacks"},"1. Create your Dockerfile or Use Buildpacks"),Object(r.b)("p",null,"Qovery supports two ways to build and run your application coming from Heroku:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Buildpacks"),Object(r.b)("li",{parentName:"ol"},"Docker")),Object(r.b)("p",null,"Both options build a container image that is runnable by a container engine (E.g. Docker). Qovery runs containers on Kubernetes."),Object(r.b)("p",null,"Choose the option that better fits you:"),Object(r.b)(c.a,{centered:!0,className:"rounded",defaultValue:"buildpacks",placeholder:"Use Buildpacks or Create your Dockerfile",select:!1,size:null,values:[{group:"Platforms",label:"Use Buildpacks",value:"buildpacks"},{group:"Platforms",label:"Create your Dockerfile",value:"dockerfile"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"dockerfile",mdxType:"TabItem"},Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},"Are you familiar with Dockerfile? If not, I do recommend reading ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),".")),Object(r.b)("p",null,"Here we will create our Dockerfiles to build and run our applications. Qovery will handle the build and the run of your applications, but need to have at least a Dockerfile to do it."),Object(r.b)("h3",{id:"choose-your-dockerfile-template"},"Choose your Dockerfile template"),Object(r.b)("p",null,"To get started,"),Object(r.b)("h4",{id:"find-dockerfile-template"},"Find Dockerfile template"),Object(r.b)("p",null,"Pick one Dockerfile template according to the programming language or framework you are using for your app:"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Your framework or language is missing? Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"our forum"),", and we will provide you one.")),Object(r.b)(c.a,{centered:!1,className:"square",defaultValue:"rails",select:!1,size:null,values:[{group:"Files",label:"Rails",value:"rails"},{group:"Files",label:"NodeJS",value:"nodejs"},{group:"Files",label:"React",value:"react"},{group:"Files",label:"VueJS",value:"vuejs"},{group:"Files",label:"NextJS",value:"nextjs"},{group:"Files",label:"Golang",value:"golang"},{group:"Files",label:"Flask",value:"flask"},{group:"Files",label:"Django",value:"django"},{group:"Files",label:"Laravel",value:"laravel"},{group:"Files",label:"Symfony",value:"symfony"},{group:"Files",label:"Spring",value:"spring"},{group:"Files",label:"Rust",value:"rust"}],mdxType:"Tabs"},Object(r.b)(i.a,{value:"rails",mdxType:"TabItem"},Object(r.b)("p",null,"Here is the Dockerfile for your Rails application listening on the PORT 3000"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nEXPOSE 3000\n\n# Configure the main process to run when running the image\nCMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]\n')),Object(r.b)("details",null,Object(r.b)("summary",null,"Dockerfile for Sidekiq"),Object(r.b)("p",null,"Here is the Dockerfile for your Rails app running as a worker mode with Sidekiq."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"There is no listening port since it is consuming resources from a queuing system (E.g. Redis)")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile for Sidekiq"',title:'"Dockerfile',for:!0,'Sidekiq"':!0}),'# syntax=docker/dockerfile:1\nFROM ruby:2.7\nRUN apt-get update -qq && apt-get install -y nodejs postgresql-client # add mysql client if you need to\nWORKDIR /myapp\nCOPY Gemfile Gemfile\nCOPY Gemfile.lock Gemfile.lock\nRUN bundle install\n\nCOPY . .\n\nCMD ["bundle", "exec", "sidekiq"]\n')))),Object(r.b)(i.a,{value:"nodejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"react",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"vuejs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"nextjs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"golang",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"flask",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"django",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"laravel",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"symfony",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"spring",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n"))),Object(r.b)(i.a,{value:"rust",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"\nTODO\n\n")))),Object(r.b)("h4",{id:"copy-template"},"Copy template"),Object(r.b)("p",null,"Copy your Dockerfile at the root of your project. By convention, you can name your file ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile"),". If you already have a Dockerfile, feel free to name it ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery"),". If you are using multiple Dockerfile for Qovery, feel free to give a name like ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Read ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/904"}),"this forum post")," to know how to use the same Dockerfile with different CMD parameters.")),Object(r.b)("p",null,"For our example of migrating a Rails app and a Rails Sidekiq app, I will have at the root of my project a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile.qovery")," and a ",Object(r.b)("inlineCode",{parentName:"p"},"Dockerfile-sidekiq.qovery"),"."),Object(r.b)("h3",{id:"test-your-dockerfile"},"Test your Dockerfile"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("p",null,"You need to ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://docs.docker.com/get-docker/"}),"install Docker")," to test your Dockerfile")),Object(r.b)("p",null,"To test your Dockerfile we will locally our container. You just need to run the following commands:"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Don't forget the ",Object(r.b)("inlineCode",{parentName:"p"},".")," (dot) at the end of the ",Object(r.b)("inlineCode",{parentName:"p"},"docker build")," command.")),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker build -f Dockerfile.qovery .\n")),Object(r.b)("p",null,"If everything goes well you should get the finale image ID at the end of the output."),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"[+] Building 19.0s (16/16) FINISHED\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 37B 0.0s\n => [internal] load .dockerignore 0.0s\n ...\n => [7/7] COPY . . 0.2s\n => exporting to image 0.0s\n => exporting layers 0.4s\n => writing image sha256:a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055 0.0s\n")),Object(r.b)("p",null,"To run your image you can run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"docker run a0f90a6ec8bc4036a7b268479a0c0773ca324ba2de11fdef31309650743f4055\n")),Object(r.b)("p",null,"If your app required a database to starts, then it can be normal that it fails to start. Otherwise, if your app is supposed to start and does not, then you will need to fix the issue and rebuild your app with ",Object(r.b)("inlineCode",{parentName:"p"},"docker build -f Dockerfile.qovery .")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"This step is one of the most complex, but once you successfully build your application with Docker, your app will run anywhere (not only on AWS with Qovery).")),Object(r.b)("p",null,"Any error while building your container image? 2 solutions:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},'Read the error message and try to understand from where the problem is coming from. You can "Google" the error if it is not related to your code.'),Object(r.b)("li",{parentName:"ol"},"Open a thread on ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://discuss.qovery.com/"}),"our forum")," if you don't find the answer there, we will be happy to assist you.")),Object(r.b)("h3",{id:"environment-variables-at-the-build-time"},"Environment variables at the build time"),Object(r.b)("p",null,"Does your app use some environment variables at the build time? Then you will need to modify your Dockerfile to includes the environment variables. Let's imagine your app uses the environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY"),", then you will need to add the following instructions in your Dockerfile:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Dockerfile with environment variables"',title:'"Dockerfile',with:!0,environment:!0,'variables"':!0}),"...\nARG CONTENT_API_KEY\nENV CONTENT_API_KEY $CONTENT_API_KEY\n...\n")),Object(r.b)("p",null,"The value of the ",Object(r.b)("inlineCode",{parentName:"p"},"CONTENT_API_KEY")," environment variable will be taken from the specified environment variables in Qovery."),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery injects Environment Variables and Secrets at the build and run time of your app.")),Object(r.b)("h3",{id:"add-your-dockerfile-to-git"},"Add your Dockerfile to Git"),Object(r.b)("p",null,"Now, add your new Dockerfile to git with the following commands:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),'git add Dockerfile.qovery\ngit commit -m "Add Qovery Dockerfile"\ngit push origin\n')),Object(r.b)("h3",{id:"loop"},"Loop"),Object(r.b)("p",null,"If you have multiple applications to deploy, create a Dockerfile for each of them.")),Object(r.b)(i.a,{value:"buildpacks",mdxType:"TabItem"},Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://buildpacks.io/"}),"Buildpacks")," automatically detects the language and the framework your application is using. Buildpacks builds and runs your app. Here is the list of ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#option-1-buildpacks"}),"supported languages and frameworks"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"We do recommend using Docker to keep the full control of what's going on behind the scene. Buildpacks is a great technology but difficult to debug when something goes wrong. You can try deploying your apps on AWS with Qovery with Buildpacks, if you do not succeed, we do recommend switching for Docker.")),Object(r.b)("h3",{id:"limitations"},"Limitations"),Object(r.b)("p",null,"Here are some limitations due to our Buildpacks implementation:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Qovery Buildpacks does not support Procfile with multiple commands at the moment."),Object(r.b)("li",{parentName:"ul"},"Qovery does not support custom Buildpacks.")),Object(r.b)("p",null,"Those limitations will be solved in the coming months."))),Object(r.b)("h2",{id:"2-create-resources-on-qovery"},"2. Create resources on Qovery"),Object(r.b)("h3",{id:"application"},"Application"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this tutorial")," to learn how to deploy your first app.")),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/9246ae68c68f42debc3d5183d2b4f7f8",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Connect to the ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"https://start.qovery.com"}),"Qovery console"),"."),Object(r.b)("li",{parentName:"ol"},"Create your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/"}),"Organization")," and your ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/project/"}),"Project"),"."),Object(r.b)("li",{parentName:"ol"},"Create an environment with the name ",Object(r.b)("inlineCode",{parentName:"li"},"production")," (it can be changed after)."),Object(r.b)("li",{parentName:"ol"},"Create an application and give it a name (you can give the name of your repo if you have no idea)"),Object(r.b)("li",{parentName:"ol"},"Select your app repository from your GitHub, GitLab or Bitbucket."),Object(r.b)("li",{parentName:"ol"},"Select the branch you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select the Build mode for ",Object(r.b)("inlineCode",{parentName:"li"},"Buildpacks")," or ",Object(r.b)("inlineCode",{parentName:"li"},"Dockerfile")," according to what you want."),Object(r.b)("li",{parentName:"ol"},"Specify the local listening port of your application."),Object(r.b)("li",{parentName:"ol"},'Click on "create"')),Object(r.b)("p",null,"Congrats! Your application is created \ud83c\udf89"),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,'Your application is created but not deployed yet! You can configure the vCPU, Memory, Environment Variables... before deploying it. If you want to deploy it before finishing the configuration you can click on "Actions" > "Deploy".')),Object(r.b)("p",null,"If you deploy an app from a mono-repository, we have a must-read guide for you ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"here"),"."),Object(r.b)("h3",{id:"database"},"Database"),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"Are you a new Qovery user? Watch ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this tutorial")," to learn how to deploy your database.")),Object(r.b)("p",null,"Here are the steps to deploy your database:"),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have created an application before"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/d7e10be0e5964f6799b158dc631bbbd1",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Steps:"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Go to your ",Object(r.b)("inlineCode",{parentName:"li"},"production")," environment."),Object(r.b)("li",{parentName:"ol"},'Add your database by clicking on "Add" > "Database".'),Object(r.b)("li",{parentName:"ol"},"Select the database (PostgreSQL, MySQL, MongoDB, Redis..) and the version you want to deploy."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("a",Object(o.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/database/#general"}),"Managed or Container mode")," for your database."),Object(r.b)("li",{parentName:"ol"},"Select ",Object(r.b)("inlineCode",{parentName:"li"},"Public")," accessibility (set ",Object(r.b)("inlineCode",{parentName:"li"},"Private")," if you don't want to restore your data from an existing Heroku database).")),Object(r.b)("p",null,"Congrats! Your database is created as well \ud83c\udf89"),Object(r.b)("p",null,"If you use MongoDB Atlas, or an existing database on AWS that you want to connect to your application deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing database."),Object(r.b)("h2",{id:"3-configure-your-environment-variables-and-secrets"},"3. Configure your Environment Variables and Secrets"),Object(r.b)(l.a,{type:"success",mdxType:"Alert"},Object(r.b)("p",null,"Qovery supports Doppler integration - it's the easiest way to migrate your Environment Variables and Secrets from Heroku to Qovery. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/secret-manager/doppler/"}),"More info here"),".")),Object(r.b)("p",null,"Qovery makes the difference between an environment variable and a secret. Basically, a Secret is similar to an Environment Variable but the value is encrypted and can't be revealed. Both are injected as environment variables during the build and the run of your applications. ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"More info here")),Object(r.b)(l.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"I recommend reading our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"Getting Started with Environment Variables")," guide.")),Object(r.b)("p",null,"To extract your environment variables from Heroku, we recommend using the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/heroku-cli"}),"Heroku CLI")," and exporting all the environment variables and secrets in an .env (dot env) file. Qovery supports the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/"}),"import of a dot env file")," via the Qovery web interface and the Qovery CLI."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"If you use Buildpacks for one of your app AND you have indicated a local listening port of your application, you will need to add an environment variable ",Object(r.b)("inlineCode",{parentName:"p"},"PORT")," with the value of your port to make your application starting properly. Otherwise, Qovery will fail to deploy your app!")),Object(r.b)("p",null,Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://devcenter.heroku.com/articles/config-vars#view-current-config-var-values"}),"Export your environment variable via the Heroku CLI")," with the command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell"}),"# To install Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\nheroku config\n\nGREETINGS: hello world\nSTRIPE_API_KEY: xxx-yyy-zzz\nIS_PRODUCTION: true\n")),Object(r.b)("p",null,"Then you can create your environment variables via the web interface (watch the video below)"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/50899d7fa3d84a418f0db69f54f970d3",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Or via the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery CLI"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(o.a)({parentName:"pre"},{className:"language-shell",metastring:'title="Import Heroku environment variables with the Qovery CLI"',title:'"Import',Heroku:!0,environment:!0,variables:!0,with:!0,the:!0,Qovery:!0,'CLI"':!0}),"# auth yourself\nqovery auth\n\n# selection the app where you want to import your environment variables\nqovery context set\n\n# import your Heroku environment variables\nheroku config --app --json | \\\n qovery env parse --heroku-json > heroku.env && \\\n qovery env import heroku.env && \\\n rm heroku.env\n\nQovery: dot env file to import: 'heroku.env'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] GREETINGS=hello world\n [ ] STRIPE_API_KEY=xxx-yyy-zzz\n> [x] IS_PRODUCTION=true\n\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Import sensitive data (E.g. API keys, credentials...) as ",Object(r.b)("inlineCode",{parentName:"p"},"Secret")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"Environment Variable"),".")),Object(r.b)("h3",{id:"connect-your-frontend-app-to-your-backend-app"},"Connect your frontend app to your backend app"),Object(r.b)("p",null,"To connect your frontend app your backend app we will create an ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#alias-environment-variable"}),"environment variable alias"),"."),Object(r.b)("p",null,"Here is how to create a frontend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/bafbbda93bd64d04afb3189bf4a1a201",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"And now how to connect your frontend app with your backend app:"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/f820925f2175465f9271b97ef414bb42",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"You can also take a look at ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/918"}),"this forum reply")," to learn how to do it."),Object(r.b)("h3",{id:"connect-your-backend-app-to-your-database"},"Connect your backend app to your database"),Object(r.b)("p",null,"Same as connecting your frontend app to your backend app, you can create an environment variable alias ",Object(r.b)("inlineCode",{parentName:"p"},"DATABASE_URL")," for the ",Object(r.b)("em",{parentName:"p"},"built-in")," secret finishing with ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL"),"."),Object(r.b)(l.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Create an alias on ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL_INTERNAL")," and not ",Object(r.b)("inlineCode",{parentName:"p"},"_DATABASE_URL"))),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/59f8368eb3c14796a807c7e39e9c0ab0",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"4-copy-data-from-your-heroku-databases-to-your-aws-databases"},"4. Copy data from your Heroku databases to your AWS databases"),Object(r.b)("p",null,Object(r.b)("em",{parentName:"p"},"Coming soon with ",Object(r.b)("a",Object(o.a)({parentName:"em"},{href:"https://www.replibyte.com"}),"Replibyte"))),Object(r.b)("h2",{id:"5-deploy-your-apps"},"5. Deploy your apps!"),Object(r.b)("p",null,"We are finally ready to deploy my applications on AWS!"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/0589d2f2aa4149edb605dc23f4efd23d",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("p",null,"Watch the final result \ud83d\ude0e"),Object(r.b)("div",{class:"video-container"},Object(r.b)("p",{align:"center"},Object(r.b)("iframe",{src:"https://www.loom.com/embed/da31c21f9c104eae9270e4c4db59055e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(r.b)("h2",{id:"faq-by-heroku-users"},"FAQ by Heroku users"),Object(r.b)("h3",{id:"how-to-create-a-custom-domain"},"How to create a custom domain?"),Object(r.b)("p",null,"Check out the documentation on ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"how to configure your custom domain"),"."),Object(r.b)("h3",{id:"how-to-monitor-my-apps"},"How to monitor my apps?"),Object(r.b)("p",null,"We do recommend using ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://www.datadoghq.com"}),"Datadog")," or any other monitoring products for monitoring your apps deployed by Qovery. Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/"}),"our tutorial on how to install Datadog"),"."),Object(r.b)("h3",{id:"do-you-have-heroku-review-app-equivalent"},'Do you have Heroku "Review App" equivalent?'),Object(r.b)("p",null,"Yes, it's what we call ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#preview-environment"}),"Preview Environment")),Object(r.b)("h3",{id:"how-to-rollback"},"How to rollback?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deployment-actions/#deploy-other-version"}),"app rollback documentation")),Object(r.b)("h3",{id:"how-auto-scaling-works"},"How auto-scaling works?"),Object(r.b)("p",null,"Check out the ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#auto-scaling"}),"app auto-scaling documentation")),Object(r.b)("h3",{id:"how-to-manage-database-migration"},"How to manage database migration?"),Object(r.b)("p",null,"Check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/t/951"}),"our forum reply")),Object(r.b)("h3",{id:"is-it-possible-to-get-a-shell--connect-to-my-app"},"Is it possible to get a shell / connect to my app?"),Object(r.b)("p",null,"Yes, with the Qovery CLI and the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery shell"),". ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/#shell"}),"Check out the documentation"),"."),Object(r.b)("h3",{id:"can-i-use-terraform-and-infrastructure-as-code"},"Can I use Terraform and Infrastructure as Code?"),Object(r.b)("p",null,"Absolutely, we have a ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Qovery Terraform provider")," available."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-mongodb-atlas"},"How can I connect my app to MongoDB Atlas?"),Object(r.b)("p",null,"If you use MongoDB Atlas check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to your existing MongoDB Atlas database."),Object(r.b)("h3",{id:"how-can-i-connect-my-app-to-an-aws-service-not-managed-by-qovery"},"How can I connect my app to an AWS service not managed by Qovery?"),Object(r.b)("p",null,"If you want to connect your app to an AWS service not managed by Qovery, check out ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/guides/tutorial/aws-vpc-peering-with-qovery/"}),"our tutorial about VPC peering")," and how to securely connect to this AWS service."),Object(r.b)("hr",null),Object(r.b)("p",null,"If you have a common question about Qovery, we have a more general ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"/docs/useful-resources/faq/"}),"FAQ section")," available."),Object(r.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(r.b)("p",null,"Congrats! You have migrated from Heroku to AWS. Feel free to check out our ",Object(r.b)("a",Object(o.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"forum")," and open a thread if you have any question."))}m.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var o=a(0),n=a.n(o),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,o=e.fill,r=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return n.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==r}),role:"alert"},!1!==r&&n.a.createElement("i",{className:l()("feather","icon-"+(r||c))}),t)}},428:function(e,t,a){var o=a(28).f,n=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in n||a(10)&&o(n,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var o=a(0),n=a.n(o),r=a(424);t.a=function(e){var t=e.children,a=e.name;return n.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},n.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},437:function(e,t,a){"use strict";var o=a(1),n=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(n),l=a(447),i=a(423),c=a.n(i),b=a(433),u=a.n(b),s=a(446),p=37,d=39;function m(e){var t=e.block,a=e.centered,o=e.changeSelectedValue,n=e.className,l=e.handleKeydown,i=e.style,b=e.values,u=e.selectedValue,s=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",n,{"tabs--block":t}),style:i},b.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return s.push(e)},onKeyDown:function(e){return l(s,e.target,e)},onFocus:function(){return o(t)},onClick:function(){return o(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,o=e.changeSelectedValue,n=e.size,i=e.values,c=i;if(c[0].group){var b=_.groupBy(c,"group");c=Object.keys(b).map((function(e){return{label:e,options:b[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+n,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return o(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,b=e.select,y=e.size,f=(e.style,e.values),O=e.urlKey,j=Object(s.a)(),g=j.tabGroupChoices,v=j.setTabGroupChoices,w=Object(n.useState)(a),k=w[0],N=w[1];if(null!=l){var T=g[l];null!=T&&T!==k&&N(T)}var C=function(e){N(e),null!=l&&v(l,e)},D=[],A=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(n.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=u.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&r.a.createElement("div",{className:"margin-vert--sm"},i),f.length>1&&(b?r.a.createElement(h,Object(o.a)({changeSelectedValue:C,handleKeydown:A,placeholder:c,selectedValue:k,size:y,tabRefs:D},e)):r.a.createElement(m,Object(o.a)({changeSelectedValue:C,handleKeydown:A,selectedValue:k,tabRefs:D},e)))),n.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},443:function(e,t,a){"use strict";var o=a(0),n=a.n(o);t.a=function(e){return n.a.createElement(n.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/83e9e333.6923a815.js b/83e9e333.ff6dd989.js similarity index 98% rename from 83e9e333.6923a815.js rename to 83e9e333.ff6dd989.js index c5bc42d1a9..234a0bbd45 100644 --- a/83e9e333.6923a815.js +++ b/83e9e333.ff6dd989.js @@ -1,2 +1,2 @@ -/*! For license information please see 83e9e333.6923a815.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{284:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(445),c=(t(285),t(436));a.default=function(){var e=Object(c.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(l.a,{title:"Contact",description:"Contact the Qovery and Timber.io team"},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Contact"),r.a.createElement("div",{className:"hero--subtitle"},"Qovery is a ",r.a.createElement("a",{href:"https://timber.io"},"Timber.io")," open-source product. You can contact the Qovery & Timber team using any of the options below."))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"mailto:hi@timber.io",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-mail"})),r.a.createElement("div",{className:"panel--title"},"hi@timber.io"),r.a.createElement("div",{className:"panel--description"},"Shoot us an email"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/qoverydotdev",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter"})),r.a.createElement("div",{className:"panel--title"},"@qoverydotdev"),r.a.createElement("div",{className:"panel--description"},"Tweet at us"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Chat"),r.a.createElement("div",{className:"panel--description"},"Join our chat"))))))))}},423:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:b,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),o.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:q.a.footerLogoLink},r.a.createElement(A,{alt:m.alt,url:u})):r.a.createElement(A,{alt:m.alt,url:u})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},H=t(462),P=t(463),V=t(3);t(138);a.a=function(e){var a=Object(v.a)().siteConfig,t=void 0===a?{}:a,n=t.favicon,i=(t.tagline,t.title),o=t.themeConfig.image,s=t.url,m=e.children,d=e.title,u=e.noFooter,b=e.description,h=e.image,g=e.keywords,E=(e.permalink,e.version),f=d?d+" | "+i:i,p=h||o,N=s+Object(y.a)(p),_=Object(y.a)(n),k=Object(V.h)(),w=k?"https://docs.qovery.com"+(k.pathname.endsWith("/")?k.pathname:k.pathname+"/"):null;return r.a.createElement(P.a,null,r.a.createElement(H.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),f&&r.a.createElement("title",null,f),f&&r.a.createElement("meta",{property:"og:title",content:f}),n&&r.a.createElement("link",{rel:"shortcut icon",href:_}),b&&r.a.createElement("meta",{name:"description",content:b}),b&&r.a.createElement("meta",{property:"og:description",content:b}),E&&r.a.createElement("meta",{name:"docsearch:version",content:E}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),p&&r.a.createElement("meta",{property:"og:image",content:N}),p&&r.a.createElement("meta",{property:"twitter:image",content:N}),p&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+f}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(l.a,null),r.a.createElement(I,null),r.a.createElement("div",{className:"main-wrapper"},m),!u&&r.a.createElement(F,null)))}},454:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r}}]); \ No newline at end of file +/*! For license information please see 83e9e333.ff6dd989.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{284:function(e,a,t){"use strict";t.r(a);var n=t(0),r=t.n(n),l=t(445),c=(t(285),t(436));a.default=function(){var e=Object(c.a)().siteConfig;return(void 0===e?{}:e).customFields.metadata.team,r.a.createElement(l.a,{title:"Contact",description:"Contact the Qovery and Timber.io team"},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Contact"),r.a.createElement("div",{className:"hero--subtitle"},"Qovery is a ",r.a.createElement("a",{href:"https://timber.io"},"Timber.io")," open-source product. You can contact the Qovery & Timber team using any of the options below."))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"mailto:hi@timber.io",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-mail"})),r.a.createElement("div",{className:"panel--title"},"hi@timber.io"),r.a.createElement("div",{className:"panel--description"},"Shoot us an email"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://twitter.com/qoverydotdev",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-twitter"})),r.a.createElement("div",{className:"panel--title"},"@qoverydotdev"),r.a.createElement("div",{className:"panel--description"},"Tweet at us"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Chat"),r.a.createElement("div",{className:"panel--description"},"Join our chat"))))))))}},423:function(e,a,t){var n;!function(){"use strict";var t={}.hasOwnProperty;function r(){for(var e=[],a=0;a0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(d.a,{className:"navbar__logo",src:b,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),o.map((function(e,a){return r.a.createElement("div",{key:a,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,a){return e.html?r.a.createElement("li",{key:a,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Q,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:q.a.footerLogoLink},r.a.createElement(A,{alt:m.alt,url:u})):r.a.createElement(A,{alt:m.alt,url:u})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},H=t(462),P=t(463),V=t(3);t(138);a.a=function(e){var a=Object(v.a)().siteConfig,t=void 0===a?{}:a,n=t.favicon,i=(t.tagline,t.title),o=t.themeConfig.image,s=t.url,m=e.children,d=e.title,u=e.noFooter,b=e.description,h=e.image,g=e.keywords,E=(e.permalink,e.version),f=d?d+" | "+i:i,p=h||o,N=s+Object(y.a)(p),_=Object(y.a)(n),k=Object(V.h)(),w=k?"https://docs.qovery.com"+(k.pathname.endsWith("/")?k.pathname:k.pathname+"/"):null;return r.a.createElement(P.a,null,r.a.createElement(H.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),f&&r.a.createElement("title",null,f),f&&r.a.createElement("meta",{property:"og:title",content:f}),n&&r.a.createElement("link",{rel:"shortcut icon",href:_}),b&&r.a.createElement("meta",{name:"description",content:b}),b&&r.a.createElement("meta",{property:"og:description",content:b}),E&&r.a.createElement("meta",{name:"docsearch:version",content:E}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),p&&r.a.createElement("meta",{property:"og:image",content:N}),p&&r.a.createElement("meta",{property:"twitter:image",content:N}),p&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+f}),w&&r.a.createElement("meta",{property:"og:url",content:w}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&r.a.createElement("link",{rel:"canonical",href:w})),r.a.createElement(l.a,null),r.a.createElement(I,null),r.a.createElement("div",{className:"main-wrapper"},m),!u&&r.a.createElement(F,null)))}},454:function(e,a,t){"use strict";var n=t(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});a.a=r}}]); \ No newline at end of file diff --git a/672ba3d6.9b98b029.js.LICENSE.txt b/83e9e333.ff6dd989.js.LICENSE.txt similarity index 100% rename from 672ba3d6.9b98b029.js.LICENSE.txt rename to 83e9e333.ff6dd989.js.LICENSE.txt diff --git a/89caf623.099fa5f4.js b/89caf623.86372b86.js similarity index 99% rename from 89caf623.099fa5f4.js rename to 89caf623.86372b86.js index 1afb4ac268..b56e7b8a87 100644 --- a/89caf623.099fa5f4.js +++ b/89caf623.86372b86.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{287:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(425)),i=a(434),s=a(437),o=a(444),c=a(424),b=a(429),u=a(431),p={last_modified_on:"2023-04-24",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"14 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://onboarding.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with sign-in options will open."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(r.b)("p",null,"Congratulations, you are logged-in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),l=a.n(n),r=a(423),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},428:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),l=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(432),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(430),i=a(423),s=a.n(i);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},434:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(423),a(433)),i=a.n(r);a(134);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,a){"use strict";var n=a(1),l=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(449),s=a(423),o=a.n(s),c=a(433),b=a.n(c),u=a(448),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},444:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{287:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(425)),i=a(434),s=a(437),o=a(443),c=a(424),b=a(429),u=a(431),p={last_modified_on:"2023-04-24",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"14 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://onboarding.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with sign-in options will open."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(r.b)("p",null,"Congratulations, you are logged-in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),l=a.n(n),r=a(423),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},428:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),l=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(432),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(430),i=a(423),s=a.n(i);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},434:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(423),a(433)),i=a.n(r);a(134);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,a){"use strict";var n=a(1),l=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(447),s=a(423),o=a.n(s),c=a(433),b=a.n(c),u=a(446),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},443:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/8d1c77c1.1993c6dc.js b/8d1c77c1.c4a12106.js similarity index 98% rename from 8d1c77c1.1993c6dc.js rename to 8d1c77c1.c4a12106.js index a8cf76fc6e..517c2aaf68 100644 --- a/8d1c77c1.1993c6dc.js +++ b/8d1c77c1.c4a12106.js @@ -1,2 +1,2 @@ -/*! For license information please see 8d1c77c1.1993c6dc.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{294:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return c})),r.d(t,"metadata",(function(){return s})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return l}));var n=r(1),o=r(9),i=(r(0),r(425)),a=r(431),c={last_modified_on:"2023-11-30",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",sidebar_label:"hidden",hide_pagination:!0},s={id:"using-qovery/integration",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",source:"@site/docs/using-qovery/integration.md",permalink:"/docs/using-qovery/integration",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Terraform",permalink:"/docs/using-qovery/interface/terraform-interface"},next:{title:"Git Repository",permalink:"/docs/using-qovery/integration/git-repository"}},u=[],p={rightToc:u};function l(e){var t=e.components,r=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(n.a)({},p,r,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"Qovery integrations improve developers' experience with Qovery and make their lives easier."),Object(i.b)("p",null,"This section shows several Qovery integrations."),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/helm-repository/",mdxType:"Jump"},"Helm repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"))}l.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=o.a.createContext({}),p=function(e){var t=o.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c({},t,{},e)),r},l=function(e){var t=p(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=p(r),f=n,d=l["".concat(a,".").concat(f)]||l[f]||m[f]||i;return r?o.a.createElement(d,c({ref:t},u,{components:r})):o.a.createElement(d,c({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,a[1]=c;for(var u=2;u0)&&(t.unobserve(r),t.disconnect(),n())}))}))).observe(r))},to:p})):i.a.createElement("a",Object(n.a)({},e,{href:p}))}},431:function(e,t,r){"use strict";var n=r(0),o=r.n(n),i=r(430),a=r(423),c=r.n(a);r(133);t.a=function(e){var t=e.children,r=e.className,n=e.badge,a=e.leftIcon,s=e.rightIcon,u=e.size,p=e.target,l=e.to,m=c()("jump-to","jump-to--"+u,r),f=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},a&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+a})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:m},f):o.a.createElement(i.a,{to:l,className:m},f)}},432:function(e,t,r){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}r.d(t,"a",(function(){return n}))}}]); \ No newline at end of file +/*! For license information please see 8d1c77c1.c4a12106.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{294:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return c})),r.d(t,"metadata",(function(){return s})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return l}));var n=r(1),o=r(9),i=(r(0),r(425)),a=r(431),c={last_modified_on:"2023-12-20",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",sidebar_label:"hidden",hide_pagination:!0},s={id:"using-qovery/integration",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",source:"@site/docs/using-qovery/integration.md",permalink:"/docs/using-qovery/integration",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Terraform",permalink:"/docs/using-qovery/interface/terraform-interface"},next:{title:"Git Repository",permalink:"/docs/using-qovery/integration/git-repository"}},u=[],p={rightToc:u};function l(e){var t=e.components,r=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(n.a)({},p,r,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"Qovery integrations improve developers' experience with Qovery and make their lives easier."),Object(i.b)("p",null,"This section shows several Qovery integrations."),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/helm-repository/",mdxType:"Jump"},"Helm repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"))}l.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=o.a.createContext({}),p=function(e){var t=o.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c({},t,{},e)),r},l=function(e){var t=p(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=p(r),f=n,d=l["".concat(a,".").concat(f)]||l[f]||m[f]||i;return r?o.a.createElement(d,c({ref:t},u,{components:r})):o.a.createElement(d,c({ref:t},u))}));function d(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,a[1]=c;for(var u=2;u0)&&(t.unobserve(r),t.disconnect(),n())}))}))).observe(r))},to:p})):i.a.createElement("a",Object(n.a)({},e,{href:p}))}},431:function(e,t,r){"use strict";var n=r(0),o=r.n(n),i=r(430),a=r(423),c=r.n(a);r(133);t.a=function(e){var t=e.children,r=e.className,n=e.badge,a=e.leftIcon,s=e.rightIcon,u=e.size,p=e.target,l=e.to,m=c()("jump-to","jump-to--"+u,r),f=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},a&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+a})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:m},f):o.a.createElement(i.a,{to:l,className:m},f)}},432:function(e,t,r){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}r.d(t,"a",(function(){return n}))}}]); \ No newline at end of file diff --git a/83e9e333.6923a815.js.LICENSE.txt b/8d1c77c1.c4a12106.js.LICENSE.txt similarity index 100% rename from 83e9e333.6923a815.js.LICENSE.txt rename to 8d1c77c1.c4a12106.js.LICENSE.txt diff --git a/8f02216a.992fe6b6.js b/8f02216a.73099afe.js similarity index 98% rename from 8f02216a.992fe6b6.js rename to 8f02216a.73099afe.js index 2e184d0cfe..583e2dae5c 100644 --- a/8f02216a.992fe6b6.js +++ b/8f02216a.73099afe.js @@ -1,2 +1,2 @@ -/*! For license information please see 8f02216a.992fe6b6.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{296:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return l})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return p}));var n=r(1),a=r(9),o=(r(0),r(425)),c=(r(434),r(429),r(424)),i={last_modified_on:"2023-06-07",$schema:"/.meta/.schemas/guides.json",title:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",author_github:"https://github.com/evoxmusic",tags:["type: guide","technology: helm"]},l={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",permalink:"/guides/advanced/helm-chart",readingTime:"1 min read",source:"@site/guides/advanced/helm-chart.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: helm",permalink:"/guides/tags/technology-helm"}],title:"Helm Charts",truncated:!1,prevItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"},nextItem:{title:"How to activate SSO to connect to your EKS cluster",permalink:"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster"}},u=[{value:"Resources",id:"resources",children:[]},{value:"Q&A",id:"qa",children:[]}],s={rightToc:u};function p(e){var t=e.components,r=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},s,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://helm.sh"}),"official website"),"."),Object(o.b)("h2",{id:"resources"},"Resources"),Object(o.b)("p",null,"Here are some resources you can use to deploy your Helm Charts with Qovery."),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Helm Charts is an advanced way to deploy your applications on Qovery. If you are new to Qovery, we recommend you to start with the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/"}),"Getting Started guide"),".")),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Title"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Official"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"Deploy your Helm Charts")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"How to deploy your Helm Charts (example with Kubecost)")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),"Forum")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),'List "Helm Charts" threads from Qovery community forum')),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"no")))),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}p.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),s=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i({},t,{},e)),r},p=function(e){var t=s(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(r),d=n,b=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?a.a.createElement(b,i({ref:t},u,{components:r})):a.a.createElement(b,i({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,c[1]=i;for(var u=2;u1?arguments[1]:void 0,r),l=c>2?arguments[2]:void 0,u=void 0===l?r:a(l,r);u>i;)t[i++]=e;return t}},428:function(e,t,r){var n=r(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||r(10)&&n(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,r){"use strict";r(428);var n=r(0),a=r.n(n),o=r(424);t.a=function(e){var t=e.children,r=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",r||"page"," assumes the following:"),t)}},433:function(e,t,r){"use strict";var n=r(435),a=r(51);function o(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var r=function(e){var t;switch(e.arrayFormat){case"index":return function(e,r,n){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return function(e,r,n){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};default:return function(e,t,r){void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t=a({arrayFormat:"none"},t)),n=Object.create(null);return"string"!=typeof e?n:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),r(decodeURIComponent(a),o,n)})),Object.keys(n).sort().reduce((function(e,t){var r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(r):e[t]=r,e}),Object.create(null))):n},t.stringify=function(e,t){var r=function(e){switch(e.arrayFormat){case"index":return function(t,r,n){return null===r?[o(t,e),"[",n,"]"].join(""):[o(t,e),"[",o(n,e),"]=",o(r,e)].join("")};case"bracket":return function(t,r){return null===r?o(t,e):[o(t,e),"[]=",o(r,e)].join("")};default:return function(t,r){return null===r?o(t,e):[o(t,e),"=",o(r,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(n){var a=e[n];if(void 0===a)return"";if(null===a)return o(n,t);if(Array.isArray(a)){var c=[];return a.slice().forEach((function(e){void 0!==e&&c.push(r(n,e,c.length))})),c.join("&")}return o(n,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,r){"use strict";var n=r(0),a=r.n(n),o=(r(423),r(433)),c=r.n(o);r(134);t.a=function(e){var t=e.children,r=e.headingDepth,o=e.hideFeedbackQuestion,i="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+i+" failed",body:"The tutorial on:\n\n"+i+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+c.a.stringify(l),s=Object(n.useState)(null),p=s[0],m=s[1];return a.a.createElement("div",{className:"steps steps--h"+r},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return m("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,r){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file +/*! For license information please see 8f02216a.73099afe.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{296:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return l})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return p}));var n=r(1),a=r(9),o=(r(0),r(425)),c=(r(434),r(429),r(424)),i={last_modified_on:"2023-12-20",$schema:"/.meta/.schemas/guides.json",title:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",author_github:"https://github.com/evoxmusic",tags:["type: guide","technology: helm"]},l={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",permalink:"/guides/advanced/helm-chart",readingTime:"1 min read",source:"@site/guides/advanced/helm-chart.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: helm",permalink:"/guides/tags/technology-helm"}],title:"Helm Charts",truncated:!1,prevItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"},nextItem:{title:"How to activate SSO to connect to your EKS cluster",permalink:"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster"}},u=[{value:"Resources",id:"resources",children:[]},{value:"Q&A",id:"qa",children:[]}],s={rightToc:u};function p(e){var t=e.components,r=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},s,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://helm.sh"}),"official website"),"."),Object(o.b)("h2",{id:"resources"},"Resources"),Object(o.b)("p",null,"Here are some resources you can use to deploy your Helm Charts with Qovery."),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Helm Charts is an advanced way to deploy your applications on Qovery. If you are new to Qovery, we recommend you to start with the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/"}),"Getting Started guide"),".")),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Title"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Official"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"Deploy your Helm Charts")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"How to deploy your Helm Charts (example with Kubecost)")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),"Forum")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),'List "Helm Charts" threads from Qovery community forum')),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"no")))),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}p.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),s=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i({},t,{},e)),r},p=function(e){var t=s(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(r),d=n,b=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?a.a.createElement(b,i({ref:t},u,{components:r})):a.a.createElement(b,i({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,c[1]=i;for(var u=2;u1?arguments[1]:void 0,r),l=c>2?arguments[2]:void 0,u=void 0===l?r:a(l,r);u>i;)t[i++]=e;return t}},428:function(e,t,r){var n=r(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||r(10)&&n(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,r){"use strict";r(428);var n=r(0),a=r.n(n),o=r(424);t.a=function(e){var t=e.children,r=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",r||"page"," assumes the following:"),t)}},433:function(e,t,r){"use strict";var n=r(435),a=r(51);function o(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var r=function(e){var t;switch(e.arrayFormat){case"index":return function(e,r,n){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return function(e,r,n){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};default:return function(e,t,r){void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t=a({arrayFormat:"none"},t)),n=Object.create(null);return"string"!=typeof e?n:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),r(decodeURIComponent(a),o,n)})),Object.keys(n).sort().reduce((function(e,t){var r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(r):e[t]=r,e}),Object.create(null))):n},t.stringify=function(e,t){var r=function(e){switch(e.arrayFormat){case"index":return function(t,r,n){return null===r?[o(t,e),"[",n,"]"].join(""):[o(t,e),"[",o(n,e),"]=",o(r,e)].join("")};case"bracket":return function(t,r){return null===r?o(t,e):[o(t,e),"[]=",o(r,e)].join("")};default:return function(t,r){return null===r?o(t,e):[o(t,e),"=",o(r,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(n){var a=e[n];if(void 0===a)return"";if(null===a)return o(n,t);if(Array.isArray(a)){var c=[];return a.slice().forEach((function(e){void 0!==e&&c.push(r(n,e,c.length))})),c.join("&")}return o(n,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,r){"use strict";var n=r(0),a=r.n(n),o=(r(423),r(433)),c=r.n(o);r(134);t.a=function(e){var t=e.children,r=e.headingDepth,o=e.hideFeedbackQuestion,i="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+i+" failed",body:"The tutorial on:\n\n"+i+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+c.a.stringify(l),s=Object(n.useState)(null),p=s[0],m=s[1];return a.a.createElement("div",{className:"steps steps--h"+r},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return m("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,r){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/8d1c77c1.1993c6dc.js.LICENSE.txt b/8f02216a.73099afe.js.LICENSE.txt similarity index 100% rename from 8d1c77c1.1993c6dc.js.LICENSE.txt rename to 8f02216a.73099afe.js.LICENSE.txt diff --git a/967beaa8.11f606ea.js b/967beaa8.cc029aba.js similarity index 98% rename from 967beaa8.11f606ea.js rename to 967beaa8.cc029aba.js index 5a8339c0ee..770b68d2a4 100644 --- a/967beaa8.11f606ea.js +++ b/967beaa8.cc029aba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{302:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),l=n(424),i=(n(437),n(429)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(449),i=n(423),c=n.n(i),u=n(433),s=n.n(u),b=n(448),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[150],{302:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return u})),n.d(t,"rightToc",(function(){return s})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),l=n(424),i=(n(437),n(429)),c={last_modified_on:"2023-07-29",$schema:"/.meta/.schemas/guides.json",title:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0},u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a Playground Environment on AWS",description:"Step-by-step guide to create a Playground environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws",readingTime:"3 min read",source:"@site/guides/tutorial/create-a-playground-environment-on-aws.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Create a Playground Environment on AWS",truncated:!1,prevItem:{title:"Create a blazingly fast REST API in Rust (Part 1/2)",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1"},nextItem:{title:"Create your Staging environment from your Production environment on AWS",permalink:"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws"}},s=[{value:"Create your Playground Environment",id:"create-your-playground-environment",children:[]},{value:"Delete your Playground Environment",id:"delete-your-playground-environment",children:[]},{value:"Optional: Create a Playground Cluster",id:"optional-create-a-playground-cluster",children:[]},{value:"Wrapping up",id:"wrapping-up",children:[]}],b={rightToc:s};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"The Qovery Playground is another concept than creating a Playground Environment. ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com/blog/discover-learn-and-experience-the-qovery-playground-is-now-open"}),"Read more about the Qovery Playground"),".")),Object(o.b)("p",null,"A Playground Environment is an environment where you can do all your testing without impacting an existing environment."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments.jpg",alt:"Playground environments"})),Object(o.b)("p",null,"Here are some use cases where a playground environment is helpful for:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Experimenting"),": Test your code without the fear to break anything from your original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Benchmarking"),": You want to stress your application without affecting the original environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Debugging"),": You have a bug in production that you want to reproduce but without impacting the production environment."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"Product Demo"),": Your Sales or Product Manager needs to make an important demo and want to be sure it will work.")),Object(o.b)(i.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You already have a production environment deployed with Qovery."))),Object(o.b)("p",null,"In this guide, we will create a playground environment on AWS."),Object(o.b)(l.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Quick Tip: Creating a playground environment results in using the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/#clone-environment"}),"Environment Clone")," feature to duplicate it! Nothing more.")),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/90cc74349adb42bc9630fb546886b586",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"create-your-playground-environment"},"Create your Playground Environment"),Object(o.b)("p",null,"To create your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the base environment that you want to clone"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Clone")," button"),Object(o.b)("li",{parentName:"ol"},"Enter a name for your playground environment"),Object(o.b)("li",{parentName:"ol"},"Select the cluster where you want to deploy it"),Object(o.b)("li",{parentName:"ol"},"Set the Environment mode to ",Object(o.b)("inlineCode",{parentName:"li"},"Development")),Object(o.b)("li",{parentName:"ol"},"Click on the Create button"),Object(o.b)("li",{parentName:"ol"},"Deploy your Playground Environment")),Object(o.b)("p",null,"Once deployed, your applications within this environment will have dedicated URLs to get access to. You can use these URLs to test your application."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/48290a88f2294b6f9c371879c2d25cdc",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Then you can check that your playground environment is working by visiting the temporary URL."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/3531b538f4ed47b49a1078303210da83",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"delete-your-playground-environment"},"Delete your Playground Environment"),Object(o.b)("p",null,"To delete your Playground Environment you simply need to:"),Object(o.b)("ol",null,Object(o.b)("li",{parentName:"ol"},"Go into the playground environment"),Object(o.b)("li",{parentName:"ol"},"Click on the ",Object(o.b)("inlineCode",{parentName:"li"},"Actions")," and ",Object(o.b)("inlineCode",{parentName:"li"},"Delete")," button"),Object(o.b)("li",{parentName:"ol"},"Confirm and Delete the environment")),Object(o.b)("p",null,"All the resources will be freed."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/951d93f22bbb45aba4a2162104fcdcd9",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"optional-create-a-playground-cluster"},"Optional: Create a Playground Cluster"),Object(o.b)("p",null,"To prevent your playground environment from impacting your production environment, you can create a dedicated cluster. So every playground environments will be on the same cluster and will not disturb your production."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/playground_environments_with_2_clusters.jpg",alt:"Playground environments with 2 clusters"})),Object(o.b)("p",null,"Here is how to create a playground cluster."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7cea821edfb7447a928dd707a7d428b5",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"And how to create a playground environment on our ",Object(o.b)("inlineCode",{parentName:"p"},"playground cluster"),"."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/82ccf107e3374c08a9f6b629451ef736",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"In this guide, we have covered everything you need to know to create a secure staging environment from your production. Now, you can take a look at ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/tutorial/data-seeding-in-postgres/"}),"how to seed your Staging database")," (Guide for Postgres but applicable for most databases)."))}d.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),l=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(n,"alert","alert--"+i,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),l=n(447),i=n(423),c=n.n(i),u=n(433),s=n.n(u),b=n(446),d=37,m=39;function p(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,u=e.values,s=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},u.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":s===t,className:c()("tab-item",{"tab-item--active":s===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function g(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var u=_.groupBy(c,"group");c=Object.keys(u).map((function(e){return{label:e,options:u[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:n,placeholder:t,value:i.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,u=e.select,y=e.size,h=(e.style,e.values),f=e.urlKey,v=Object(b.a)(),w=v.tabGroupChoices,O=v.setTabGroupChoices,j=Object(r.useState)(n),N=j[0],k=j[1];if(null!=l){var C=w[l];null!=C&&C!==N&&k(C)}var E=function(e){k(e),null!=l&&O(l,e)},P=[],S=function(e,t,n){switch(n.keyCode){case m:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case d:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&f){var e=s.a.parse(window.location.search);e[f]&&k(e[f])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(y||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),h.length>1&&(u?o.a.createElement(g,Object(a.a)({changeSelectedValue:E,handleKeydown:S,placeholder:c,selectedValue:N,size:y,tabRefs:P},e)):o.a.createElement(p,Object(a.a)({changeSelectedValue:E,handleKeydown:S,selectedValue:N,tabRefs:P},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}}}]); \ No newline at end of file diff --git a/ab8f5b83.46371bbd.js b/ab8f5b83.89894402.js similarity index 99% rename from ab8f5b83.46371bbd.js rename to ab8f5b83.89894402.js index d07dc7f7d9..65ac1f9e2c 100644 --- a/ab8f5b83.46371bbd.js +++ b/ab8f5b83.89894402.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{323:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(424),l=n(431),s=n(434),c=n(437),b=n(444),u=n(429),p={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},430:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(432),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},431:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(430),i=n(423),l=n.n(i);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},432:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(449),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(448),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{323:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(424),l=n(431),s=n(434),c=n(437),b=n(443),u=n(429),p={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},430:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(432),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},431:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(430),i=n(423),l=n.n(i);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},432:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(447),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(446),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/b4dda200.9bd97e60.js b/b4dda200.1e04ca2b.js similarity index 98% rename from b4dda200.9bd97e60.js rename to b4dda200.1e04ca2b.js index a318788c8f..47e6ca4c26 100644 --- a/b4dda200.9bd97e60.js +++ b/b4dda200.1e04ca2b.js @@ -1,2 +1,2 @@ -/*! For license information please see b4dda200.9bd97e60.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[179],{330:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return s})),r.d(t,"metadata",(function(){return u})),r.d(t,"rightToc",(function(){return l})),r.d(t,"default",(function(){return f}));var n=r(1),o=r(9),a=(r(0),r(425)),i=r(424),c=r(431),s={last_modified_on:"2023-11-02",title:"Troubleshoot",description:"Everything you need to troubleshoot your application with Qovery",sidebar_label:"hidden",hide_pagination:!0},u={id:"using-qovery/troubleshoot",title:"Troubleshoot",description:"Everything you need to troubleshoot your application with Qovery",source:"@site/docs/using-qovery/troubleshoot.md",permalink:"/docs/using-qovery/troubleshoot",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Image Mirroring",permalink:"/docs/using-qovery/deployment/image-mirroring"},next:{title:"Application Troubleshoot",permalink:"/docs/using-qovery/troubleshoot/application-troubleshoot"}},l=[],p={rightToc:l};function f(e){var t=e.components,r=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(n.a)({},p,r,{components:t,mdxType:"MDXLayout"}),Object(a.b)(i.a,{type:"info",mdxType:"Alert"},Object(a.b)("p",null,"In this guide, you'll find common mistakes, and how to resolve them. If you don't find what you need here, ",Object(a.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"please use the forum"),".")),Object(a.b)("p",null,"This guide is divided into three sections that will guide you through your troubleshooting depending on the issue you face"),Object(a.b)("ul",null,Object(a.b)("li",{parentName:"ul"},"Deployment issues: guide through to fix the deployment "),Object(a.b)("li",{parentName:"ul"},"Run issues : App in error -> provide Pod errors, performance issues (?), dropped request(nginx investigations)"),Object(a.b)("li",{parentName:"ul"},"Cluster issues: ")),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/application-troubleshoot/",mdxType:"Jump"},"Application troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/cluster-troubleshoot/",mdxType:"Jump"},"Cluster troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/database-troubleshoot/",mdxType:"Jump"},"Database troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/",mdxType:"Jump"},"Lifecycle troubleshoot"))}f.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=o.a.createContext({}),l=function(e){var t=o.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c({},t,{},e)),r},p=function(e){var t=l(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),d=n,b=p["".concat(i,".").concat(d)]||p[d]||f[d]||a;return r?o.a.createElement(b,c({ref:t},u,{components:r})):o.a.createElement(b,c({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,i[1]=c;for(var u=2;u1?arguments[1]:void 0,r),s=i>2?arguments[2]:void 0,u=void 0===s?r:o(s,r);u>c;)t[c++]=e;return t}},430:function(e,t,r){"use strict";var n=r(1),o=r(0),a=r.n(o),i=r(39),c=r(432),s=r(20),u=r.n(s);t.a=function(e){var t,r=e.to,s=e.href,l=r||s,p=Object(c.a)(l),f=Object(o.useRef)(!1),d=u.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&p&&window.docusaurus.prefetch(l),function(){d&&t&&t.disconnect()}}),[l,d,p]),l&&p?a.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){f.current||(window.docusaurus.preload(l),f.current=!0)},innerRef:function(e){var r,n;d&&e&&p&&(r=e,n=function(){window.docusaurus.prefetch(l)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){r===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(r),t.disconnect(),n())}))}))).observe(r))},to:l})):a.a.createElement("a",Object(n.a)({},e,{href:l}))}},431:function(e,t,r){"use strict";var n=r(0),o=r.n(n),a=r(430),i=r(423),c=r.n(i);r(133);t.a=function(e){var t=e.children,r=e.className,n=e.badge,i=e.leftIcon,s=e.rightIcon,u=e.size,l=e.target,p=e.to,f=c()("jump-to","jump-to--"+u,r),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return l?o.a.createElement("a",{href:p,target:l,className:f},d):o.a.createElement(a.a,{to:p,className:f},d)}},432:function(e,t,r){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}r.d(t,"a",(function(){return n}))}}]); \ No newline at end of file +/*! For license information please see b4dda200.1e04ca2b.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[179],{330:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return s})),r.d(t,"metadata",(function(){return u})),r.d(t,"rightToc",(function(){return l})),r.d(t,"default",(function(){return f}));var n=r(1),o=r(9),a=(r(0),r(425)),i=r(424),c=r(431),s={last_modified_on:"2023-12-22",title:"Troubleshoot",description:"Everything you need to troubleshoot your application with Qovery",sidebar_label:"hidden",hide_pagination:!0},u={id:"using-qovery/troubleshoot",title:"Troubleshoot",description:"Everything you need to troubleshoot your application with Qovery",source:"@site/docs/using-qovery/troubleshoot.md",permalink:"/docs/using-qovery/troubleshoot",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Image Mirroring",permalink:"/docs/using-qovery/deployment/image-mirroring"},next:{title:"Application Troubleshoot",permalink:"/docs/using-qovery/troubleshoot/application-troubleshoot"}},l=[],p={rightToc:l};function f(e){var t=e.components,r=Object(o.a)(e,["components"]);return Object(a.b)("wrapper",Object(n.a)({},p,r,{components:t,mdxType:"MDXLayout"}),Object(a.b)(i.a,{type:"info",mdxType:"Alert"},Object(a.b)("p",null,"In this guide, you'll find common mistakes, and how to resolve them. If you don't find what you need here, ",Object(a.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"please use the forum"),".")),Object(a.b)("p",null,"This guide is divided into three sections that will guide you through your troubleshooting depending on the issue you face"),Object(a.b)("ul",null,Object(a.b)("li",{parentName:"ul"},"Deployment issues: guide through to fix the deployment "),Object(a.b)("li",{parentName:"ul"},"Run issues : App in error -> provide Pod errors, performance issues (?), dropped request(nginx investigations)"),Object(a.b)("li",{parentName:"ul"},"Cluster issues: ")),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/application-troubleshoot/",mdxType:"Jump"},"Application troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/cluster-troubleshoot/",mdxType:"Jump"},"Cluster troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/database-troubleshoot/",mdxType:"Jump"},"Database troubleshoot"),Object(a.b)(c.a,{to:"/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/",mdxType:"Jump"},"Lifecycle troubleshoot"))}f.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=o.a.createContext({}),l=function(e){var t=o.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c({},t,{},e)),r},p=function(e){var t=l(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),d=n,b=p["".concat(i,".").concat(d)]||p[d]||f[d]||a;return r?o.a.createElement(b,c({ref:t},u,{components:r})):o.a.createElement(b,c({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,i[1]=c;for(var u=2;u1?arguments[1]:void 0,r),s=i>2?arguments[2]:void 0,u=void 0===s?r:o(s,r);u>c;)t[c++]=e;return t}},430:function(e,t,r){"use strict";var n=r(1),o=r(0),a=r.n(o),i=r(39),c=r(432),s=r(20),u=r.n(s);t.a=function(e){var t,r=e.to,s=e.href,l=r||s,p=Object(c.a)(l),f=Object(o.useRef)(!1),d=u.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&p&&window.docusaurus.prefetch(l),function(){d&&t&&t.disconnect()}}),[l,d,p]),l&&p?a.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){f.current||(window.docusaurus.preload(l),f.current=!0)},innerRef:function(e){var r,n;d&&e&&p&&(r=e,n=function(){window.docusaurus.prefetch(l)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){r===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(r),t.disconnect(),n())}))}))).observe(r))},to:l})):a.a.createElement("a",Object(n.a)({},e,{href:l}))}},431:function(e,t,r){"use strict";var n=r(0),o=r.n(n),a=r(430),i=r(423),c=r.n(i);r(133);t.a=function(e){var t=e.children,r=e.className,n=e.badge,i=e.leftIcon,s=e.rightIcon,u=e.size,l=e.target,p=e.to,f=c()("jump-to","jump-to--"+u,r),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},i&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+i})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return l?o.a.createElement("a",{href:p,target:l,className:f},d):o.a.createElement(a.a,{to:p,className:f},d)}},432:function(e,t,r){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}r.d(t,"a",(function(){return n}))}}]); \ No newline at end of file diff --git a/8f02216a.992fe6b6.js.LICENSE.txt b/b4dda200.1e04ca2b.js.LICENSE.txt similarity index 100% rename from 8f02216a.992fe6b6.js.LICENSE.txt rename to b4dda200.1e04ca2b.js.LICENSE.txt diff --git a/b565c464.b03ae35c.js b/b565c464.014da0f9.js similarity index 99% rename from b565c464.b03ae35c.js rename to b565c464.014da0f9.js index 03fd9c0072..3d8c0efe9f 100644 --- a/b565c464.b03ae35c.js +++ b/b565c464.014da0f9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[180],{331:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(425)),l=a(437),i=a(444),c=a(424),s=a(429),u=a(431),b={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to deploy Helm charts",permalink:"/guides/tutorial/how-to-deploy-helm-charts"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),r=a.n(n),o=a(423),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),r=a.n(n),o=a(424);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(432),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},431:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(430),l=a(423),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),r=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(449),i=a(423),c=a.n(i),s=a(433),u=a.n(s),b=a(448),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,y=Object(b.a)(),f=y.tabGroupChoices,v=y.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=f[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[180],{331:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return p})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),r=a(9),o=(a(0),a(425)),l=a(437),i=a(443),c=a(424),s=a(429),u=a(431),b={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},p={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"How to deploy a Rust REST API application on AWS with ease",description:"In this article, you will learn how to deploy a Rust REST API application on AWS with ease",permalink:"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",readingTime:"8 min read",source:"@site/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"How to deploy a Rust REST API application on AWS with ease",truncated:!1,prevItem:{title:"How to create an RDS instance through the AWS console",permalink:"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console"},nextItem:{title:"How to deploy Helm charts",permalink:"/guides/tutorial/how-to-deploy-helm-charts"}},m=[{value:"Create a Rust REST API app",id:"create-a-rust-rest-api-app",children:[]},{value:"Dockerized our Rust REST API app",id:"dockerized-our-rust-rest-api-app",children:[]},{value:"Deploy our Rust REST API app on AWS",id:"deploy-our-rust-rest-api-app-on-aws",children:[{value:"Sign up into Qovery",id:"sign-up-into-qovery",children:[]},{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Connect your AWS account",id:"connect-your-aws-account",children:[]},{value:"Deploy our Rust REST API app",id:"deploy-our-rust-rest-api-app",children:[]}]},{value:"Wrapping up",id:"wrapping-up",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],d={rightToc:m};function g(e){var t=e.components,a=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},d,a,{components:t,mdxType:"MDXLayout"}),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(o.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety."),Object(o.b)("p",null,"In this article, you will learn how to deploy a Rust API easily in a few steps. This article is separate into two parts:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Create a Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Dockerized our Rust REST API app"),Object(o.b)("li",{parentName:"ul"},"Deploy our Rust REST API app on AWS")),Object(o.b)(s.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Rust installed on your system (instructions ",Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.rust-lang.org/learn/get-started"}),"here"),")"),Object(o.b)("li",{parentName:"ul"},"You have an AWS account"),Object(o.b)("li",{parentName:"ul"},"You have a GitHub account"))),Object(o.b)("p",null,"Let's go!"),Object(o.b)("h2",{id:"create-a-rust-rest-api-app"},"Create a Rust REST API app"),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Check out the Rust REST API repo ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"here"),". You can fork it!")),Object(o.b)("p",null,"To illustrate the deployment of our Rust API application, we are going to create an API to know if a number is prime number. Let's create our Rust project using cargo"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="create our rust project"',title:'"create',our:!0,rust:!0,'project"':!0}),"cargo new --bin rust-prime-number-api\n")),Object(o.b)("p",null,"Now you must have a ",Object(o.b)("inlineCode",{parentName:"p"},"rust-prime-number-api")," folder with 2 files:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"Cargo.toml")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("inlineCode",{parentName:"li"},"src/main.rs"))),Object(o.b)("p",null,"To build our Rust REST API we are going to use Rocket - a web framework for Rust that makes it simple to write fast web application."),Object(o.b)("p",null,"Add the ",Object(o.b)("inlineCode",{parentName:"p"},"rocket")," and ",Object(o.b)("inlineCode",{parentName:"p"},"serde")," (JSON serializer/deserializer) dependencies to your ",Object(o.b)("inlineCode",{parentName:"p"},"Cargo.toml"),", then run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo fetch")," (optional) to update your local dependencies."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-toml",metastring:'title="Cargo.toml" {9-12}',title:'"Cargo.toml"',"{9-12}":!0}),'[package]\nname = "rust-prime-number-api"\nversion = "0.1.0"\nauthors = ["Romaric Philogene "]\nedition = "2018"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrocket = { version = "0.5.0-rc.1", features = ["json"] }\nserde = { version = "1.0.130", features = ["derive"] }\nserde_json = "1.0.68"\n')),Object(o.b)("p",null,"Put inside your ",Object(o.b)("inlineCode",{parentName:"p"},"src/main.rs")," the following Rust code"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'}),'#[macro_use]\nextern crate rocket;\n\nuse rocket::serde::json::Json;\nuse serde::Serialize;\nuse std::time::SystemTime;\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Serialize)]\nstruct NumberResponse {\n number: u64,\n is_prime_number: bool,\n execution_time_in_micros: u128\n}\n\n#[get("/")]\nfn index() -> &\'static str {\n "This is my Rust prime number REST API"\n}\n\n#[get("/isPrime?")]\nfn get_is_prime(number: u64) -> Json {\n let now = SystemTime::now();\n\n Json(NumberResponse {\n number,\n is_prime_number: is_prime(number),\n execution_time_in_micros: now.elapsed().unwrap().as_micros(),\n })\n}\n\nfn is_prime(n: u64) -> bool {\n if n <= 1 {\n return false;\n }\n\n for a in 2..n {\n if n % a == 0 {\n return false;\n }\n }\n\n true\n}\n\n#[rocket::main]\nasync fn main() {\n let mut config = rocket::config::Config::default();\n config.address = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));\n\n let _ = rocket::build()\n .configure(config)\n .mount("/", routes![index, get_is_prime])\n .launch()\n .await;\n}\n')),Object(o.b)("p",null,"Run ",Object(o.b)("inlineCode",{parentName:"p"},"cargo run")," and you are supposed to get the following output"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"\ud83d\udd27 Configured for debug.\n >> address: 0.0.0.0\n >> port: 8000\n >> workers: 16\n >> ident: Rocket\n >> keep-alive: 5s\n >> limits: bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\n >> tls: disabled\n >> temp dir: /var/folders/td/bjr48yg96gd2xgd3s44fg40c0000gn/T/\n >> log level: normal\n >> cli colors: true\n >> shutdown: ctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\n\ud83d\udef0 Routes:\n >> (index) GET /\n >> (get_is_prime) GET /isPrime?\n\ud83d\udce1 Fairings:\n >> Shield (liftoff, response, singleton)\n\ud83d\udee1\ufe0f Shield:\n >> X-Frame-Options: SAMEORIGIN\n >> Permissions-Policy: interest-cohort=()\n >> X-Content-Type-Options: nosniff\n\ud83d\ude80 Rocket has launched from http://127.0.0.1:8000\n")),Object(o.b)("p",null,"You can try your Rust REST API by opening ",Object(o.b)("inlineCode",{parentName:"p"},"http://127.0.0.1:8000/isPrime?number=9293029022983991")," in your browser."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-json"}),'{\n "number": 9293029022983992,\n "is_prime_number": false,\n "execution_time_in_micros": 942894\n}\n')),Object(o.b)("p",null,"Let's now containerized our app with Docker to deploy it on our AWS account."),Object(o.b)("h2",{id:"dockerized-our-rust-rest-api-app"},"Dockerized our Rust REST API app"),Object(o.b)("p",null,"To run our Rust app we need to provide a valid Dockerfile. If you are not familiar with Docker, you can take a look to ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-write-a-dockerfile/"}),"this article"),". Here is the content of our Dockerfile."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Our Dockerfile contains a multi-stage build. That is why we have two ",Object(o.b)("inlineCode",{parentName:"p"},"FROM")," instructions.\nOur final container image is optimized to be as light as possible.")),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Dockerfile"',title:'"Dockerfile"'}),'####################################################################################################\n## Builder\n####################################################################################################\nFROM rust:latest AS builder\n\nRUN rustup target add x86_64-unknown-linux-musl\nRUN apt update && apt install -y musl-tools musl-dev\nRUN update-ca-certificates\n\n# Create appuser\nENV USER=app\nENV UID=10001\n\nRUN adduser \\\n --disabled-password \\\n --gecos "" \\\n --home "/nonexistent" \\\n --shell "/sbin/nologin" \\\n --no-create-home \\\n --uid "${UID}" \\\n "${USER}"\n\nWORKDIR /app\n\nCOPY ./ .\n\nRUN cargo build --target x86_64-unknown-linux-musl --release\n\n####################################################################################################\n## Final image\n####################################################################################################\nFROM scratch\n\n# Import from builder.\nCOPY --from=builder /etc/passwd /etc/passwd\nCOPY --from=builder /etc/group /etc/group\n\nWORKDIR /app\n\n# Copy our build\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/rust-prime-number-api ./\n\n# Use an unprivileged user.\nUSER app:app\n\nCMD ["/app/rust-prime-number-api"]\n')),Object(o.b)("h2",{id:"deploy-our-rust-rest-api-app-on-aws"},"Deploy our Rust REST API app on AWS"),Object(o.b)("p",null,"To deploy our Rust app on AWS we are going to use Qovery. Qovery is the simplest way to deploy any app on AWS. It is the perfect candidate to deploy our Rust REST API in a few steps."),Object(o.b)("h3",{id:"sign-up-into-qovery"},"Sign up into Qovery"),Object(o.b)("p",null,"First, you need to sign up or sign in on Qovery."),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(i.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(i.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(i.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(i.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(i.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(i.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"connect-your-aws-account"},"Connect your AWS account"),Object(o.b)("p",null,"To connect your AWS account check out ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/"}),"this guide"),"."),Object(o.b)(c.a,{type:"success",mdxType:"Alert"},Object(o.b)("p",null,"Qovery installation on your AWS account takes up to 30 minutes. You will be notified by email when it is over.")),Object(o.b)("h3",{id:"deploy-our-rust-rest-api-app"},"Deploy our Rust REST API app"),Object(o.b)("p",null,"Once your AWS account is set-up, you can deploy your Rust app by.."),Object(o.b)("p",null,"Creating a project ",Object(o.b)("inlineCode",{parentName:"p"},"prime number"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_project.png",alt:"Create a project"})),Object(o.b)("p",null,"Creating an environment ",Object(o.b)("inlineCode",{parentName:"p"},"prod"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_environment.png",alt:"Create an environment"})),Object(o.b)("p",null,"Creating an app by selecting your Rust app repository, build mode > ",Object(o.b)("strong",{parentName:"p"},"Dockerfile"),", and the port ",Object(o.b)("strong",{parentName:"p"},"8000"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app.png",alt:"Create an app"})),Object(o.b)("p",null,"And deploy! That's it \ud83d\udd25... nothing more. Our Rust REST API app is ready"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust_prime_number_app_deployed.png",alt:"Our app is deployed"})),Object(o.b)("p",null,"Check out this video to see how I quickly deploy my Rust REST API with Qovery."),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/7ae48d3383da40159d8aa97c23aadb3e",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("p",null,"Watch this video showing the final result \ud83d\udc47"),Object(o.b)("div",{class:"video-container"},Object(o.b)("p",{align:"center"},Object(o.b)("iframe",{src:"https://www.loom.com/embed/30cc34ef166a4fdaaeb0a9e864bf7836",width:"100%",height:"100%",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0}))),Object(o.b)("h2",{id:"wrapping-up"},"Wrapping up"),Object(o.b)("p",null,"Rust combined to Rocket web framework turns building REST API super easy. Deploying your Rust app on AWS with Qovery is as simple as selecting your GitHub repository. Nothing more. Hope you liked it."),Object(o.b)("h2",{id:"useful-resources"},"Useful resources"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/rust-prime-number-api"}),"Source code")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://rocket.rs"}),"Rocket framework")),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(n.a)({parentName:"li"},{href:"https://circleci.com/blog/rust-cd/"}),"Rust Circle CI"))),Object(o.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),r=a.n(n),o=a(423),l=a.n(o);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,o=e.icon,i=e.type,c=null;switch(i){case"danger":c="alert-triangle";break;case"success":c="check-circle";break;case"warning":c="alert-triangle";break;default:c="info"}return r.a.createElement("div",{className:l()(a,"alert","alert--"+i,{"alert--fill":n,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:l()("feather","icon-"+(o||c))}),t)}},428:function(e,t,a){var n=a(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||a(10)&&n(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),r=a.n(n),o=a(424);t.a=function(e){var t=e.children,a=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),r=a(0),o=a.n(r),l=a(39),i=a(432),c=a(20),s=a.n(c);t.a=function(e){var t,a=e.to,c=e.href,u=a||c,b=Object(i.a)(u),p=Object(r.useRef)(!1),m=s.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!m&&b&&window.docusaurus.prefetch(u),function(){m&&t&&t.disconnect()}}),[u,m,b]),u&&b?o.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(u),p.current=!0)},innerRef:function(e){var a,n;m&&e&&b&&(a=e,n=function(){window.docusaurus.prefetch(u)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:u})):o.a.createElement("a",Object(n.a)({},e,{href:u}))}},431:function(e,t,a){"use strict";var n=a(0),r=a.n(n),o=a(430),l=a(423),i=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,c=e.rightIcon,s=e.size,u=e.target,b=e.to,p=i()("jump-to","jump-to--"+s,a),m=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},l&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+l})),r.a.createElement("div",{className:"jump-to--main"},n?r.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(c||"chevron-right")+" arrow"}))));return u?r.a.createElement("a",{href:b,target:u,className:p},m):r.a.createElement(o.a,{to:b,className:p},m)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),r=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),o=a.n(r),l=a(447),i=a(423),c=a.n(i),s=a(433),u=a.n(s),b=a(446),p=37,m=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,r=e.className,l=e.handleKeydown,i=e.style,s=e.values,u=e.selectedValue,b=e.tabRefs;return o.a.createElement("div",{className:a?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:c()("tabs",r,{"tabs--block":t}),style:i},s.map((function(e){var t=e.value,a=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":u===t,className:c()("tab-item",{"tab-item--active":u===t}),key:t,ref:function(e){return b.push(e)},onKeyDown:function(e){return l(b,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function g(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,r=e.size,i=e.values,c=i;if(c[0].group){var s=_.groupBy(c,"group");c=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return o.a.createElement(l.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:c,isClearable:a,placeholder:t,value:i.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,i=e.label,c=e.placeholder,s=e.select,h=e.size,O=(e.style,e.values),j=e.urlKey,y=Object(b.a)(),f=y.tabGroupChoices,v=y.setTabGroupChoices,w=Object(r.useState)(a),N=w[0],R=w[1];if(null!=l){var T=f[l];null!=T&&T!==N&&R(T)}var I=function(e){R(e),null!=l&&v(l,e)},k=[],S=function(e,t,a){switch(a.keyCode){case m:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=u.a.parse(window.location.search);e[j]&&R(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(h||"md")},i&&o.a.createElement("div",{className:"margin-vert--sm"},i),O.length>1&&(s?o.a.createElement(g,Object(n.a)({changeSelectedValue:I,handleKeydown:S,placeholder:c,selectedValue:N,size:h,tabRefs:k},e)):o.a.createElement(d,Object(n.a)({changeSelectedValue:I,handleKeydown:S,selectedValue:N,tabRefs:k},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,a){"use strict";var n=a(0),r=a.n(n);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/bb89e1a0.10ae3bee.js b/bb89e1a0.16b7ed81.js similarity index 98% rename from bb89e1a0.10ae3bee.js rename to bb89e1a0.16b7ed81.js index bb3097304d..e79efe8d77 100644 --- a/bb89e1a0.10ae3bee.js +++ b/bb89e1a0.16b7ed81.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[193],{344:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(425)),l=a(437),c=a(444),i=a(424),s=a(429),b=(a(431),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Install Qovery on your Amazon Web Services account",permalink:"/guides/cloud-provider/guide-amazon-web-services"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),o=a.n(n),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},428:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),o=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(432),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(430),l=a(423),c=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),o=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(449),c=a(423),i=a.n(c),s=a(433),b=a.n(s),u=a(448),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[193],{344:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return b})),a.d(t,"metadata",(function(){return u})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return d}));var n=a(1),o=a(9),r=(a(0),a(425)),l=a(437),c=a(443),i=a(424),s=a(429),b=(a(431),{last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","technology: qovery"],hide_pagination:!0}),u={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Import your environment variables with the Qovery CLI",description:"How to import your environment variables and secrets from your dotenv file with the Qovery CLI",permalink:"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli",readingTime:"5 min read",source:"@site/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Import your environment variables with the Qovery CLI",truncated:!1,prevItem:{title:"How to write a Dockerfile",permalink:"/guides/tutorial/how-to-write-a-dockerfile"},nextItem:{title:"Install Qovery on your Amazon Web Services account",permalink:"/guides/cloud-provider/guide-amazon-web-services"}},m=[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Set your context",id:"set-your-context",children:[]},{value:"Import",id:"import",children:[{value:"Environment Variables",id:"environment-variables",children:[]},{value:"Secrets",id:"secrets",children:[]}]},{value:"Check",id:"check",children:[]}],p={rightToc:m};function d(e){var t=e.components,a=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},p,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"The Qovery Web Interface support ",Object(r.b)("inlineCode",{parentName:"p"},".env")," (dot env) file import now. ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#import-environment-variables"}),"Check out the documentation"))),Object(r.b)("p",null,"When dealing with dozens of environment variables, it can be tedious to import them one by one. This is where the Qovery CLI with the env vars import feature helps. In this tutorial, you will learn how to import your environment variables and secrets via the Qovery CLI."),Object(r.b)(s.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Your dotenv (",Object(r.b)("inlineCode",{parentName:"li"},".env"),") file is ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://smartmob-rfc.readthedocs.io/en/latest/2-dotenv.html"}),"compliant to the following specs")),Object(r.b)("li",{parentName:"ul"},"You have created your application in Qovery"))),Object(r.b)("h2",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(c.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(l.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(r.b)("h2",{id:"set-your-context"},"Set your context"),Object(r.b)("p",null,"Once you are authenticated with ",Object(r.b)("inlineCode",{parentName:"p"},"qovery auth"),", you must choose the application where you want to set the environment variables with the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery context set"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="connect to qovery"',title:'"connect',to:!0,'qovery"':!0}),"$ qovery auth\n")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="set the context"',title:'"set',the:!0,'context"':!0}),"~/Desktop $ qovery context set\nQovery: Current context:\nOrganization | Qovery Community\nProject | posthog\nEnvironment | prod\nApplication | proxy\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery Realm\nProject:\n\u2714 Posthog\nEnvironment:\n\u2714 prod\nApplication:\n\u2714 nginx-proxy\n\nQovery: New context:\nOrganization | Qovery Realm\nProject | Posthog\nEnvironment | prod\nApplication | nginx-proxy\n")),Object(r.b)("h2",{id:"import"},"Import"),Object(r.b)("p",null,"With Qovery, you make the distinction between Environment Variables and Secrets. Basically, the value of a Secret is encrypted and cannot be revealed."),Object(r.b)("p",null,"Let's say that we have the following dotenv file ",Object(r.b)("inlineCode",{parentName:"p"},".env.development")," that we want to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-text",metastring:"title=.env.development",title:".env.development"}),"STRAPI_API_KEY=x.xxyyyzzz\nCOLOR_BACKGROUND=fff\nAUTH0_API_KEY_SECRET=0xb33f\nAPI_URL=https://api.mytld.com\n")),Object(r.b)("p",null,"The ",Object(r.b)("inlineCode",{parentName:"p"},"STRAPI_API_KEY")," and ",Object(r.b)("inlineCode",{parentName:"p"},"AUTH0_API_KEY_SECRET")," are Secrets. ",Object(r.b)("inlineCode",{parentName:"p"},"COLOR_BACKGROUND")," and ",Object(r.b)("inlineCode",{parentName:"p"},"API_URL")," are Environment Variables."),Object(r.b)("h3",{id:"environment-variables"},"Environment Variables"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Environment Variables works.")),Object(r.b)("p",null,"To import the Environment Variables from this file we run the command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and we select the environment variables to import:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Environment Variables\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [x] COLOR_BACKGROUND=fff\n [ ] AUTH0_API_KEY_SECRET=0xb33f\n> [x] API_URL=https://api.mytld.com\n [ ] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? COLOR_BACKGROUND=fff, API_URL=https://api.mytld.com\nQovery: \u2705 Environment Variables successfully imported!\n")),Object(r.b)("p",null,"If during the import something goes wrong, you will see the errors and why it failed."),Object(r.b)("h3",{id:"secrets"},"Secrets"),Object(r.b)(i.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"Check out the documentation")," to learn more on how Secrets works.")),Object(r.b)("p",null,"To import the Secrets, you need to run the same command ",Object(r.b)("inlineCode",{parentName:"p"},"qovery env import ")," and select the secrets to import."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery env import .env.development\n\nQovery: dot env file to import: '.env.development'\n? Do you want to import Environment Variables or Secrets? Secrets\n? What environment variables do you want to import? [Use arrows to move, space to select, to all, to none, type to filter]\n [ ] COLOR_BACKGROUND=fff\n [x] AUTH0_API_KEY_SECRET=0xb33f\n [ ] API_URL=https://api.mytld.com\n> [x] STRAPI_API_KEY=x.xxyyyzzz\n")),Object(r.b)("p",null,"Once validated you will see the following import validation:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"? What environment variables do you want to import? STRAPI_API_KEY=x.xxyyyzzz, AUTH0_API_KEY_SECRET=0xb33\nQovery: \u2705 Secrets successfully imported!\n")),Object(r.b)("h2",{id:"check"},"Check"),Object(r.b)("p",null,"Open your environment variables console to check that everything has been set correctly."))}d.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),o=a.n(n),r=a(423),l=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:l()(a,"alert","alert--"+c,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&o.a.createElement("i",{className:l()("feather","icon-"+(r||i))}),t)}},428:function(e,t,a){var n=a(28).f,o=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in o||a(10)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),o=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return o.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),o=a(0),r=a.n(o),l=a(39),c=a(432),i=a(20),s=a.n(i);t.a=function(e){var t,a=e.to,i=e.href,b=a||i,u=Object(c.a)(b),m=Object(o.useRef)(!1),p=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!p&&u&&window.docusaurus.prefetch(b),function(){p&&t&&t.disconnect()}}),[b,p,u]),b&&u?r.a.createElement(l.b,Object(n.a)({},e,{onMouseEnter:function(){m.current||(window.docusaurus.preload(b),m.current=!0)},innerRef:function(e){var a,n;p&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),o=a.n(n),r=a(430),l=a(423),c=a.n(l);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,l=e.leftIcon,i=e.rightIcon,s=e.size,b=e.target,u=e.to,m=c()("jump-to","jump-to--"+s,a),p=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},l&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+l})),o.a.createElement("div",{className:"jump-to--main"},n?o.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(i||"chevron-right")+" arrow"}))));return b?o.a.createElement("a",{href:u,target:b,className:m},p):o.a.createElement(r.a,{to:u,className:m},p)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},437:function(e,t,a){"use strict";var n=a(1),o=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(o),l=a(447),c=a(423),i=a.n(c),s=a(433),b=a.n(s),u=a(446),m=37,p=39;function d(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,o=e.className,l=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":t}),style:c},s.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:i()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return l(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function v(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return r.a.createElement(l.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:a,placeholder:t,value:c.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,l=e.groupId,c=e.label,i=e.placeholder,s=e.select,h=e.size,y=(e.style,e.values),O=e.urlKey,f=Object(u.a)(),j=f.tabGroupChoices,g=f.setTabGroupChoices,w=Object(o.useState)(a),N=w[0],x=w[1];if(null!=l){var I=j[l];null!=I&&I!==N&&x(I)}var T=function(e){x(e),null!=l&&g(l,e)},C=[],E=function(e,t,a){switch(a.keyCode){case p:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case m:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&x(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(h||"md")},c&&r.a.createElement("div",{className:"margin-vert--sm"},c),y.length>1&&(s?r.a.createElement(v,Object(n.a)({changeSelectedValue:T,handleKeydown:E,placeholder:i,selectedValue:N,size:h,tabRefs:C},e)):r.a.createElement(d,Object(n.a)({changeSelectedValue:T,handleKeydown:E,selectedValue:N,tabRefs:C},e)))),o.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,a){"use strict";var n=a(0),o=a.n(n);t.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/c24a85bb.97905c5d.js b/c24a85bb.2fb9f705.js similarity index 98% rename from c24a85bb.97905c5d.js rename to c24a85bb.2fb9f705.js index 27b4be4205..6bb88f2f5b 100644 --- a/c24a85bb.97905c5d.js +++ b/c24a85bb.2fb9f705.js @@ -1,2 +1,2 @@ -/*! For license information please see c24a85bb.97905c5d.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{353:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return l})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return p}));var n=r(1),a=r(9),o=(r(0),r(425)),c=(r(434),r(429),r(424)),i={last_modified_on:"2023-06-07",$schema:"/.meta/.schemas/guides.json",title:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",author_github:"https://github.com/evoxmusic",tags:["type: guide","technology: helm"]},l={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",permalink:"/guides/advanced/helm-chart",readingTime:"1 min read",source:"@site/guides/advanced/helm-chart.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: helm",permalink:"/guides/tags/technology-helm"}],title:"Helm Charts",truncated:!1,prevItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"},nextItem:{title:"How to activate SSO to connect to your EKS cluster",permalink:"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster"}},u=[{value:"Resources",id:"resources",children:[]},{value:"Q&A",id:"qa",children:[]}],s={rightToc:u};function p(e){var t=e.components,r=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},s,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://helm.sh"}),"official website"),"."),Object(o.b)("h2",{id:"resources"},"Resources"),Object(o.b)("p",null,"Here are some resources you can use to deploy your Helm Charts with Qovery."),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Helm Charts is an advanced way to deploy your applications on Qovery. If you are new to Qovery, we recommend you to start with the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/"}),"Getting Started guide"),".")),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Title"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Official"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"Deploy your Helm Charts")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"How to deploy your Helm Charts (example with Kubecost)")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),"Forum")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),'List "Helm Charts" threads from Qovery community forum')),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"no")))),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}p.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),s=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i({},t,{},e)),r},p=function(e){var t=s(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(r),d=n,b=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?a.a.createElement(b,i({ref:t},u,{components:r})):a.a.createElement(b,i({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,c[1]=i;for(var u=2;u1?arguments[1]:void 0,r),l=c>2?arguments[2]:void 0,u=void 0===l?r:a(l,r);u>i;)t[i++]=e;return t}},428:function(e,t,r){var n=r(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||r(10)&&n(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,r){"use strict";r(428);var n=r(0),a=r.n(n),o=r(424);t.a=function(e){var t=e.children,r=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",r||"page"," assumes the following:"),t)}},433:function(e,t,r){"use strict";var n=r(435),a=r(51);function o(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var r=function(e){var t;switch(e.arrayFormat){case"index":return function(e,r,n){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return function(e,r,n){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};default:return function(e,t,r){void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t=a({arrayFormat:"none"},t)),n=Object.create(null);return"string"!=typeof e?n:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),r(decodeURIComponent(a),o,n)})),Object.keys(n).sort().reduce((function(e,t){var r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(r):e[t]=r,e}),Object.create(null))):n},t.stringify=function(e,t){var r=function(e){switch(e.arrayFormat){case"index":return function(t,r,n){return null===r?[o(t,e),"[",n,"]"].join(""):[o(t,e),"[",o(n,e),"]=",o(r,e)].join("")};case"bracket":return function(t,r){return null===r?o(t,e):[o(t,e),"[]=",o(r,e)].join("")};default:return function(t,r){return null===r?o(t,e):[o(t,e),"=",o(r,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(n){var a=e[n];if(void 0===a)return"";if(null===a)return o(n,t);if(Array.isArray(a)){var c=[];return a.slice().forEach((function(e){void 0!==e&&c.push(r(n,e,c.length))})),c.join("&")}return o(n,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,r){"use strict";var n=r(0),a=r.n(n),o=(r(423),r(433)),c=r.n(o);r(134);t.a=function(e){var t=e.children,r=e.headingDepth,o=e.hideFeedbackQuestion,i="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+i+" failed",body:"The tutorial on:\n\n"+i+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+c.a.stringify(l),s=Object(n.useState)(null),p=s[0],m=s[1];return a.a.createElement("div",{className:"steps steps--h"+r},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return m("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,r){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file +/*! For license information please see c24a85bb.2fb9f705.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[202],{353:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return i})),r.d(t,"metadata",(function(){return l})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return p}));var n=r(1),a=r(9),o=(r(0),r(425)),c=(r(434),r(429),r(424)),i={last_modified_on:"2023-12-20",$schema:"/.meta/.schemas/guides.json",title:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",author_github:"https://github.com/evoxmusic",tags:["type: guide","technology: helm"]},l={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Helm Charts",description:"Learn how to deploy Helm charts with Qovery",permalink:"/guides/advanced/helm-chart",readingTime:"1 min read",source:"@site/guides/advanced/helm-chart.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: helm",permalink:"/guides/tags/technology-helm"}],title:"Helm Charts",truncated:!1,prevItem:{title:"Grafana setup with Qovery",permalink:"/guides/tutorial/grafana-install"},nextItem:{title:"How to activate SSO to connect to your EKS cluster",permalink:"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster"}},u=[{value:"Resources",id:"resources",children:[]},{value:"Q&A",id:"qa",children:[]}],s={rightToc:u};function p(e){var t=e.components,r=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},s,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://helm.sh"}),"official website"),"."),Object(o.b)("h2",{id:"resources"},"Resources"),Object(o.b)("p",null,"Here are some resources you can use to deploy your Helm Charts with Qovery."),Object(o.b)(c.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"Helm Charts is an advanced way to deploy your applications on Qovery. If you are new to Qovery, we recommend you to start with the ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/"}),"Getting Started guide"),".")),Object(o.b)("table",null,Object(o.b)("thead",{parentName:"table"},Object(o.b)("tr",{parentName:"thead"},Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Title"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Description"),Object(o.b)("th",Object(n.a)({parentName:"tr"},{align:null}),"Official"))),Object(o.b)("tbody",{parentName:"table"},Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"Deploy your Helm Charts")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"/guides/tutorial/how-to-deploy-helm-charts/"}),"How to deploy your Helm Charts (example with Kubecost)")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"Yes")),Object(o.b)("tr",{parentName:"tbody"},Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),"Forum")),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),Object(o.b)("a",Object(n.a)({parentName:"td"},{href:"https://discuss.qovery.com/search?q=helm%20charts"}),'List "Helm Charts" threads from Qovery community forum')),Object(o.b)("td",Object(n.a)({parentName:"tr"},{align:null}),"no")))),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(n.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}p.isMDXComponent=!0},423:function(e,t,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),s=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i({},t,{},e)),r},p=function(e){var t=s(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=Object(n.forwardRef)((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=s(r),d=n,b=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return r?a.a.createElement(b,i({ref:t},u,{components:r})):a.a.createElement(b,i({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,c[1]=i;for(var u=2;u1?arguments[1]:void 0,r),l=c>2?arguments[2]:void 0,u=void 0===l?r:a(l,r);u>i;)t[i++]=e;return t}},428:function(e,t,r){var n=r(28).f,a=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in a||r(10)&&n(a,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,r){"use strict";r(428);var n=r(0),a=r.n(n),o=r(424);t.a=function(e){var t=e.children,r=e.name;return a.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},a.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",r||"page"," assumes the following:"),t)}},433:function(e,t,r){"use strict";var n=r(435),a=r(51);function o(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var r=function(e){var t;switch(e.arrayFormat){case"index":return function(e,r,n){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return function(e,r,n){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};default:return function(e,t,r){void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t=a({arrayFormat:"none"},t)),n=Object.create(null);return"string"!=typeof e?n:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),a=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),r(decodeURIComponent(a),o,n)})),Object.keys(n).sort().reduce((function(e,t){var r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(r):e[t]=r,e}),Object.create(null))):n},t.stringify=function(e,t){var r=function(e){switch(e.arrayFormat){case"index":return function(t,r,n){return null===r?[o(t,e),"[",n,"]"].join(""):[o(t,e),"[",o(n,e),"]=",o(r,e)].join("")};case"bracket":return function(t,r){return null===r?o(t,e):[o(t,e),"[]=",o(r,e)].join("")};default:return function(t,r){return null===r?o(t,e):[o(t,e),"=",o(r,e)].join("")}}}(t=a({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(n){var a=e[n];if(void 0===a)return"";if(null===a)return o(n,t);if(Array.isArray(a)){var c=[];return a.slice().forEach((function(e){void 0!==e&&c.push(r(n,e,c.length))})),c.join("&")}return o(n,t)+"="+o(a,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,r){"use strict";var n=r(0),a=r.n(n),o=(r(423),r(433)),c=r.n(o);r(134);t.a=function(e){var t=e.children,r=e.headingDepth,o=e.hideFeedbackQuestion,i="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+i+" failed",body:"The tutorial on:\n\n"+i+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},u="https://github.com/qovery/documentation/issues/new?"+c.a.stringify(l),s=Object(n.useState)(null),p=s[0],m=s[1];return a.a.createElement("div",{className:"steps steps--h"+r},t,!o&&!p&&a.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",a.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return m("yes")}},"Yes"),"\xa0\xa0",a.a.createElement("a",{href:u,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==p&&a.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",a.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,r){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/b4dda200.9bd97e60.js.LICENSE.txt b/c24a85bb.2fb9f705.js.LICENSE.txt similarity index 100% rename from b4dda200.9bd97e60.js.LICENSE.txt rename to c24a85bb.2fb9f705.js.LICENSE.txt diff --git a/c4f5d8e4.7311bd1c.js b/c4f5d8e4.619f4eb2.js similarity index 99% rename from c4f5d8e4.7311bd1c.js rename to c4f5d8e4.619f4eb2.js index e9c2e4485e..0a237e461b 100644 --- a/c4f5d8e4.7311bd1c.js +++ b/c4f5d8e4.619f4eb2.js @@ -1,2 +1,2 @@ -/*! For license information please see c4f5d8e4.7311bd1c.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[204],{355:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(450),c=a(445),o=a(562);Object(l.a)("h2");t.default=function(){return r.a.createElement(c.a,{title:"Qovery Hub | Documentation, Guides, Tutorials",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Hub Resources"),r.a.createElement(o.a,{buttonClass:"highlight",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster.",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"docs",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-book"})),r.a.createElement("div",{className:"panel--title"},"Documentation"),r.a.createElement("div",{className:"panel--description"},"Read our product documentation"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-layers"})),r.a.createElement("div",{className:"panel--title"},"Guides"),r.a.createElement("div",{className:"panel--description"},"Get started using Qovery smoothly"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides/tutorial",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-bookmark"})),r.a.createElement("div",{className:"panel--title"},"Tutorials"),r.a.createElement("div",{className:"panel--description"},"Check out our community tutorials"))))),r.a.createElement("div",{className:"container",style:{marginTop:"10px"}},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Discord"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discord"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://roadmap.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-flag"})),r.a.createElement("div",{className:"panel--title"},"Roadmap"),r.a.createElement("div",{className:"panel--description"},"Check out our public Roadmap"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discuss.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/Qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},423:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},q=a(462),R=a(463),F=a(3);a(138);t.a=function(e){var t=Object(p.a)().siteConfig,a=void 0===t?{}:t,n=a.favicon,o=(a.tagline,a.title),i=a.themeConfig.image,s=a.url,m=e.children,u=e.title,d=e.noFooter,f=e.description,h=e.image,g=e.keywords,v=(e.permalink,e.version),b=u?u+" | "+o:o,E=h||i,y=s+Object(_.a)(E),N=Object(_.a)(n),w=Object(F.h)(),k=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(R.a,null,r.a.createElement(q.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&r.a.createElement("title",null,b),b&&r.a.createElement("meta",{property:"og:title",content:b}),n&&r.a.createElement("link",{rel:"shortcut icon",href:N}),f&&r.a.createElement("meta",{name:"description",content:f}),f&&r.a.createElement("meta",{property:"og:description",content:f}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:y}),E&&r.a.createElement("meta",{property:"twitter:image",content:y}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(Q,null)))}},450:function(e,t,a){"use strict";var n=a(9),r=a(0),l=a.n(r),c=a(423),o=a.n(c),i=a(436),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,c=Object(n.a)(t,["id"]),s=Object(i.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,p=void 0!==f&&f;return r?l.a.createElement(e,c,l.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(a={},a[m.a.enhancedAnchor]=!p,a)),id:r}),l.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),c.children):l.a.createElement(e,c)}}},454:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},479:function(e,t){var a,n,r=e.exports={};function l(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function o(e){if(a===setTimeout)return setTimeout(e,0);if((a===l||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:l}catch(e){a=l}try{n="function"==typeof clearTimeout?clearTimeout:c}catch(e){n=c}}();var i,s=[],m=!1,u=-1;function d(){m&&i&&(m=!1,i.length?s=i.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=o(d);m=!0;for(var t=s.length;t;){for(i=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(479))},556:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,l=r-(n||r);e.diff=l,e.prev=n,e.curr=r,n=r;for(var c=new Array(arguments.length),o=0;o0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"days":case"day":case"d":return c*l;case"hours":case"hour":case"hrs":case"hr":case"h":return c*r;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===i&&!1===isNaN(e))return t.long?c(o=e,l,"day")||c(o,r,"hour")||c(o,n,"minute")||c(o,a,"second")||o+" ms":function(e){if(e>=l)return Math.round(e/l)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},558:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},562:function(e,t,a){"use strict";a(446),a(447);var n=a(0),r=a.n(n),l=a(423),c=a.n(l),o=(a(58),a(21),a(554)),i=a.n(o),s=a(558),m=function(e){return new Promise((function(t,a){return i()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var l="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?l=t:"string"==typeof a&&(l=a);var c="&EMAIL="+r+u(t),o=""+l+c;return m(o)};a(152),t.a=function(e){var t,a=e.block,l=e.buttonClass,o=e.center,i=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),p=f[0],h=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],N=E[1],w=Object(n.useState)("Could not subscribe :("),k=w[0],_=w[1];return r.a.createElement("div",{className:c()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":o},t["mailing-list--"+m]=m,t))},!1!==i&&r.a.createElement("div",{className:"mailing-list--description"},i),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(p).then((function(e){"success"===e.result?(b(!0),y&&N(!1)):(N(!0),e.msg.includes(p+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){N(!0)}))}(e)},className:c()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return h(e.target.value)},className:c()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:c()("button","button--"+(l||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file +/*! For license information please see c4f5d8e4.619f4eb2.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[204],{355:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(450),c=a(445),o=a(562);Object(l.a)("h2");t.default=function(){return r.a.createElement(c.a,{title:"Qovery Hub | Documentation, Guides, Tutorials",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster."},r.a.createElement("header",{className:"hero"},r.a.createElement("div",{className:"container container--fluid"},r.a.createElement("h1",null,"Qovery Hub Resources"),r.a.createElement(o.a,{buttonClass:"highlight",description:"Qovery is an Internal Developer Platform Helping Platform Engineers and Developers To Ship Faster.",center:!0,size:"lg"}))),r.a.createElement("main",null,r.a.createElement("section",null,r.a.createElement("div",{className:"container"},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"docs",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-book"})),r.a.createElement("div",{className:"panel--title"},"Documentation"),r.a.createElement("div",{className:"panel--description"},"Read our product documentation"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-layers"})),r.a.createElement("div",{className:"panel--title"},"Guides"),r.a.createElement("div",{className:"panel--description"},"Get started using Qovery smoothly"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"guides/tutorial",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-bookmark"})),r.a.createElement("div",{className:"panel--title"},"Tutorials"),r.a.createElement("div",{className:"panel--description"},"Check out our community tutorials"))))),r.a.createElement("div",{className:"container",style:{marginTop:"10px"}},r.a.createElement("div",{className:"row"},r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Discord"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discord"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://roadmap.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-flag"})),r.a.createElement("div",{className:"panel--title"},"Roadmap"),r.a.createElement("div",{className:"panel--description"},"Check out our public Roadmap"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://discuss.qovery.com",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-message-circle"})),r.a.createElement("div",{className:"panel--title"},"Forum"),r.a.createElement("div",{className:"panel--description"},"Join our community on Discourse"))),r.a.createElement("div",{className:"col"},r.a.createElement("a",{href:"https://github.com/Qovery",target:"_blank",className:"panel panel--link text--center"},r.a.createElement("div",{className:"panel--icon"},r.a.createElement("i",{className:"feather icon-github"})),r.a.createElement("div",{className:"panel--title"},"Github"),r.a.createElement("div",{className:"panel--description"},"Issues, code, and development"))))))))}},423:function(e,t,a){var n;!function(){"use strict";var a={}.hasOwnProperty;function r(){for(var e=[],t=0;t0&&r.a.createElement("div",{className:"row footer__links"},r.a.createElement("div",{className:"col col--5 footer__col"},r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement(u.a,{className:"navbar__logo",src:f,alt:"Qovery",width:"150",height:"auto"})),r.a.createElement("div",{className:"margin-bottom--md"},r.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),r.a.createElement("div",null,r.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},r.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},r.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},r.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",r.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},r.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),i.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(z,e))}))):null)}))),(m||c)&&r.a.createElement("div",{className:"text--center"},m&&m.src&&r.a.createElement("div",{className:"margin-bottom--sm"},m.href?r.a.createElement("a",{href:m.href,target:"_blank",rel:"noopener noreferrer",className:M.a.footerLogoLink},r.a.createElement(P,{alt:m.alt,url:d})):r.a.createElement(P,{alt:m.alt,url:d})),r.a.createElement("small",null,c),r.a.createElement("br",null))))},q=a(462),R=a(463),F=a(3);a(138);t.a=function(e){var t=Object(p.a)().siteConfig,a=void 0===t?{}:t,n=a.favicon,o=(a.tagline,a.title),i=a.themeConfig.image,s=a.url,m=e.children,u=e.title,d=e.noFooter,f=e.description,h=e.image,g=e.keywords,v=(e.permalink,e.version),b=u?u+" | "+o:o,E=h||i,y=s+Object(_.a)(E),N=Object(_.a)(n),w=Object(F.h)(),k=w?"https://docs.qovery.com"+(w.pathname.endsWith("/")?w.pathname:w.pathname+"/"):null;return r.a.createElement(R.a,null,r.a.createElement(q.a,null,r.a.createElement(c.a,null,r.a.createElement("html",{lang:"en"}),r.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),b&&r.a.createElement("title",null,b),b&&r.a.createElement("meta",{property:"og:title",content:b}),n&&r.a.createElement("link",{rel:"shortcut icon",href:N}),f&&r.a.createElement("meta",{name:"description",content:f}),f&&r.a.createElement("meta",{property:"og:description",content:f}),v&&r.a.createElement("meta",{name:"docsearch:version",content:v}),g&&g.length&&r.a.createElement("meta",{name:"keywords",content:g.join(",")}),E&&r.a.createElement("meta",{property:"og:image",content:y}),E&&r.a.createElement("meta",{property:"twitter:image",content:y}),E&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),k&&r.a.createElement("meta",{property:"og:url",content:k}),r.a.createElement("meta",{name:"twitter:card",content:"summary"}),k&&r.a.createElement("link",{rel:"canonical",href:k})),r.a.createElement(l.a,null),r.a.createElement(S,null),r.a.createElement("div",{className:"main-wrapper"},m),!d&&r.a.createElement(Q,null)))}},450:function(e,t,a){"use strict";var n=a(9),r=a(0),l=a.n(r),c=a(423),o=a.n(c),i=a(436),s=(a(139),a(140)),m=a.n(s);t.a=function(e){return function(t){var a,r=t.id,c=Object(n.a)(t,["id"]),s=Object(i.a)().siteConfig,u=(s=void 0===s?{}:s).themeConfig,d=(u=void 0===u?{}:u).navbar,f=(d=void 0===d?{}:d).hideOnScroll,p=void 0!==f&&f;return r?l.a.createElement(e,c,l.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:o()("anchor",(a={},a[m.a.enhancedAnchor]=!p,a)),id:r}),l.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+r,title:"Direct link to heading"},"#"),c.children):l.a.createElement(e,c)}}},454:function(e,t,a){"use strict";var n=a(0),r=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=r},479:function(e,t){var a,n,r=e.exports={};function l(){throw new Error("setTimeout has not been defined")}function c(){throw new Error("clearTimeout has not been defined")}function o(e){if(a===setTimeout)return setTimeout(e,0);if((a===l||!a)&&setTimeout)return a=setTimeout,setTimeout(e,0);try{return a(e,0)}catch(t){try{return a.call(null,e,0)}catch(t){return a.call(this,e,0)}}}!function(){try{a="function"==typeof setTimeout?setTimeout:l}catch(e){a=l}try{n="function"==typeof clearTimeout?clearTimeout:c}catch(e){n=c}}();var i,s=[],m=!1,u=-1;function d(){m&&i&&(m=!1,i.length?s=i.concat(s):u=-1,s.length&&f())}function f(){if(!m){var e=o(d);m=!0;for(var t=s.length;t;){for(i=s,s=[];++u1)for(var a=1;a=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},t.enable(r())}).call(this,a(479))},556:function(e,t,a){var n;function r(e){function a(){if(a.enabled){var e=a,r=+new Date,l=r-(n||r);e.diff=l,e.prev=n,e.curr=r,n=r;for(var c=new Array(arguments.length),o=0;o0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var c=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*c;case"days":case"day":case"d":return c*l;case"hours":case"hour":case"hrs":case"hr":case"h":return c*r;case"minutes":case"minute":case"mins":case"min":case"m":return c*n;case"seconds":case"second":case"secs":case"sec":case"s":return c*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(e);if("number"===i&&!1===isNaN(e))return t.long?c(o=e,l,"day")||c(o,r,"hour")||c(o,n,"minute")||c(o,a,"second")||o+" ms":function(e){if(e>=l)return Math.round(e/l)+"d";if(e>=r)return Math.round(e/r)+"h";if(e>=n)return Math.round(e/n)+"m";if(e>=a)return Math.round(e/a)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},558:function(e,t,a){"use strict";var n=/^[-!#$%&'*+\/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;t.validate=function(e){if(!e)return!1;if(e.length>254)return!1;if(!n.test(e))return!1;var t=e.split("@");return!(t[0].length>64)&&!t[1].split(".").some((function(e){return e.length>63}))}},562:function(e,t,a){"use strict";a(448),a(449);var n=a(0),r=a.n(n),l=a(423),c=a.n(l),o=(a(58),a(21),a(554)),i=a.n(o),s=a(558),m=function(e){return new Promise((function(t,a){return i()(e,{param:"c",timeout:3500},(function(e,n){e&&a(e),n&&t(n)}))}))},u=function(e){var t="";for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){var n="group["===a.substring(0,6)?a:a.toUpperCase();t=t.concat("&"+n+"="+e[a])}return t},d=function(e,t,a){var n=Object(s.validate)(e),r=encodeURIComponent(e);if(!n)return Promise.resolve({result:"error",msg:"The email you entered is not valid."});var l="https://qovery.us4.list-manage.com/subscribe/post-json?u=3c76e7a2087d5bc4020348c46&id=63bd993879";arguments.length<3&&"string"==typeof t?l=t:"string"==typeof a&&(l=a);var c="&EMAIL="+r+u(t),o=""+l+c;return m(o)};a(152),t.a=function(e){var t,a=e.block,l=e.buttonClass,o=e.center,i=e.description,s=e.subscriptionEnabled,m=e.size,u=e.width,f=Object(n.useState)(""),p=f[0],h=f[1],g=Object(n.useState)(!1),v=g[0],b=g[1],E=Object(n.useState)(!1),y=E[0],N=E[1],w=Object(n.useState)("Could not subscribe :("),k=w[0],_=w[1];return r.a.createElement("div",{className:c()("mailing-list",(t={"mailing-list--block":a,"mailing-list--center":o},t["mailing-list--"+m]=m,t))},!1!==i&&r.a.createElement("div",{className:"mailing-list--description"},i),s&&!v&&r.a.createElement("form",{onSubmit:function(e){return function(e){e.preventDefault(),d(p).then((function(e){"success"===e.result?(b(!0),y&&N(!1)):(N(!0),e.msg.includes(p+" is already subscribed")?_("This email is already subscribed to the newsletter"):_("Could not subscribe :("))})).catch((function(e){N(!0)}))}(e)},className:c()("mailing-list--form")},r.a.createElement("input",{onChange:function(e){return h(e.target.value)},className:c()("input","input--"+m),name:"email",placeholder:"you@email.com",type:"email",style:{width:u}}),r.a.createElement("button",{className:c()("button","button--"+(l||"primary"),"button--"+m),type:"submit"},"Subscribe")),y&&r.a.createElement("span",{className:"badge badge--secondary"},k),r.a.createElement("div",{style:{textAlign:"center"}},s&&v&&r.a.createElement("span",{className:"badge badge--primary"},"Subscribed!")))}}}]); \ No newline at end of file diff --git a/c24a85bb.97905c5d.js.LICENSE.txt b/c4f5d8e4.619f4eb2.js.LICENSE.txt similarity index 100% rename from c24a85bb.97905c5d.js.LICENSE.txt rename to c4f5d8e4.619f4eb2.js.LICENSE.txt diff --git a/c6d06197.f2d04dec.js b/c6d06197.1de63217.js similarity index 99% rename from c6d06197.f2d04dec.js rename to c6d06197.1de63217.js index 1cd6f8876e..4ca995da9d 100644 --- a/c6d06197.f2d04dec.js +++ b/c6d06197.1de63217.js @@ -1,2 +1,2 @@ -/*! For license information please see c6d06197.f2d04dec.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[206],{357:function(t,e,r){"use strict";r.r(e);r(446),r(447),r(473),r(442),r(29),r(22),r(21),r(52),r(428);var n=r(0),o=r.n(n),i=r(503),u=r(516),a=r(450),c=r(445),l=r(430),f=r(504),s=r.n(f),p=(r(358),Object(a.a)("h2"));function v(t){var e=t.filtering,r=t.items;if(0==r.length)return o.a.createElement(i.a,{text:"no guides found"});if(e)return o.a.createElement(u.a,{items:r});var n=r.filter((function(t){return"getting-started"==t.content.metadata.categories[0].name})),a=r.filter((function(t){return"cloud-provider"==t.content.metadata.categories[0].name})),c=a[0].content.metadata.categories[0],l=r.filter((function(t){return"provider"==t.content.metadata.categories[0].name})),f=l[0].content.metadata.categories[0],s=r.filter((function(t){return"advanced"==t.content.metadata.categories[0].name})),v=s[0].content.metadata.categories[0],d=r.filter((function(t){return"tutorial"==t.content.metadata.categories[0].name})),h=d[0].content.metadata.categories[0];return o.a.createElement(o.a.Fragment,null,o.a.createElement("section",null,o.a.createElement(u.a,{items:n,staggered:!0})),o.a.createElement("section",null,o.a.createElement(p,{id:c.permalink},c.title),c.description&&o.a.createElement("div",{className:"sub-title"},c.description),o.a.createElement(u.a,{items:a,large:!1})),o.a.createElement("section",null,o.a.createElement(p,{id:f.permalink},f.title),f.description&&o.a.createElement("div",{className:"sub-title"},f.description),o.a.createElement(u.a,{items:l,large:!1})),o.a.createElement("section",null,o.a.createElement(p,{id:v.permalink},v.title),v.description&&o.a.createElement("div",{className:"sub-title"},v.description),o.a.createElement(u.a,{items:s,large:!1})),o.a.createElement("section",null,o.a.createElement(p,{id:h.permalink},h.title),h.description&&o.a.createElement("div",{className:"sub-title"},h.description),o.a.createElement(u.a,{items:d,large:!1})))}e.default=function(t){t.metadata;var e=t.items,r=t.location?s.a.parse(t.location.search,{ignoreQueryPrefix:!0}):{},i=Object(n.useState)(r.search),u=i[0],a=i[1],f=!1,p=e.filter((function(t){var e=t.content.metadata.tags,r=e.some((function(t){return t.label.startsWith("platform: ")})),n=e.some((function(t){return t.label.startsWith("source: ")})),o=e.some((function(t){return t.label.startsWith("sink: ")}));return!((r||n)&&o)}));return u&&(f=!0,p=p.filter((function(t){var e=u.toLowerCase(),r=(t.content.frontMatter,t.content.metadata);return!!r.coverLabel.toLowerCase().includes(e)||!!r.tags.some((function(t){return t.label.toLowerCase().includes(e)}))}))),o.a.createElement(c.a,{title:"Guides",description:"Guides, tutorials, and education."},o.a.createElement("header",{className:"hero hero--clean"},o.a.createElement("div",{className:"container"},o.a.createElement("h1",null,"Qovery Guides"),o.a.createElement("div",{className:"hero--subtitle"},"Thoughtful guides to help you get the most out of Qovery. Created and curated by the ",o.a.createElement(l.a,{to:"https://www.qovery.com/team"},"Qovery team"),"."),o.a.createElement("div",{className:"hero--search"},o.a.createElement("input",{type:"text",className:"input--text input--xl",onChange:function(t){return a(t.currentTarget.value)},placeholder:"\ud83d\udd0d Search by language, framework, providers, database or tag..."})))),o.a.createElement("main",{className:"container container--s"},o.a.createElement(v,{filtering:f,items:p})))}},423:function(t,e,r){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var t=[],e=0;e1?arguments[1]:void 0)}}),r(74)("find")},442:function(t,e,r){"use strict";var n=r(8),o=r(486),i=r(55);r(56)("search",1,(function(t,e,r,u){return[function(r){var n=t(this),o=null==r?void 0:r[e];return void 0!==o?o.call(r,n):new RegExp(r)[e](String(n))},function(t){var e=u(r,t,this);if(e.done)return e.value;var a=n(t),c=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var f=i(a,c);return o(a.lastIndex,l)||(a.lastIndex=l),null===f?-1:f.index}]}))},445:function(t,e,r){"use strict";r(457);var n=r(0),o=r.n(n),i=r(458),u=r(443),a=r(1),c=(r(446),r(447),r(459),r(430)),l=r(460),f=r(440),s=r.n(f),p=r(461),v=r.n(p),d=r(436),h=r(423),y=r.n(h),g=r(135),m=r.n(g),D=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.moon)})},_=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.sun)})},b=function(t){var e=Object(d.a)().isClient;return o.a.createElement(v.a,Object(a.a)({disabled:!e,icons:{checked:o.a.createElement(D,null),unchecked:o.a.createElement(_,null)}},t))};function E(){var t=Object(d.a)().siteConfig,e=(void 0===t?{}:t).customFields.metadata.latest_post,r=Date.parse(e.date),n=new Date,o=Math.abs(n-r),i=Math.ceil(o/864e5),u=null;return"undefined"!=typeof window&&(u=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!u||u0&&o.a.createElement("div",{className:"row footer__links"},o.a.createElement("div",{className:"col col--5 footer__col"},o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement(s.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),o.a.createElement("div",null,o.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},o.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},o.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},o.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},o.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(t,e){return o.a.createElement("div",{key:e,className:"col footer__col"},null!=t.title?o.a.createElement("h4",{className:"footer__title"},t.title):null,null!=t.items&&Array.isArray(t.items)&&t.items.length>0?o.a.createElement("ul",{className:"footer__items"},t.items.map((function(t,e){return t.html?o.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):o.a.createElement("li",{key:t.href||t.to,className:"footer__item"},o.a.createElement(B,t))}))):null)}))),(f||u)&&o.a.createElement("div",{className:"text--center"},f&&f.src&&o.a.createElement("div",{className:"margin-bottom--sm"},f.href?o.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},o.a.createElement(L,{alt:f.alt,url:p})):o.a.createElement(L,{alt:f.alt,url:p})),o.a.createElement("small",null,u),o.a.createElement("br",null))))},M=r(462),W=r(463),U=r(3);r(138);e.a=function(t){var e=Object(d.a)().siteConfig,r=void 0===e?{}:e,n=r.favicon,a=(r.tagline,r.title),c=r.themeConfig.image,l=r.url,f=t.children,s=t.title,p=t.noFooter,v=t.description,h=t.image,y=t.keywords,g=(t.permalink,t.version),m=s?s+" | "+a:a,D=h||c,_=l+Object(F.a)(D),b=Object(F.a)(n),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return o.a.createElement(W.a,null,o.a.createElement(M.a,null,o.a.createElement(u.a,null,o.a.createElement("html",{lang:"en"}),o.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),m&&o.a.createElement("title",null,m),m&&o.a.createElement("meta",{property:"og:title",content:m}),n&&o.a.createElement("link",{rel:"shortcut icon",href:b}),v&&o.a.createElement("meta",{name:"description",content:v}),v&&o.a.createElement("meta",{property:"og:description",content:v}),g&&o.a.createElement("meta",{name:"docsearch:version",content:g}),y&&y.length&&o.a.createElement("meta",{name:"keywords",content:y.join(",")}),D&&o.a.createElement("meta",{property:"og:image",content:_}),D&&o.a.createElement("meta",{property:"twitter:image",content:_}),D&&o.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+m}),w&&o.a.createElement("meta",{property:"og:url",content:w}),o.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&o.a.createElement("link",{rel:"canonical",href:w})),o.a.createElement(i.a,null),o.a.createElement(N,null),o.a.createElement("div",{className:"main-wrapper"},f),!p&&o.a.createElement(T,null)))}},450:function(t,e,r){"use strict";var n=r(9),o=r(0),i=r.n(o),u=r(423),a=r.n(u),c=r(436),l=(r(139),r(140)),f=r.n(l);e.a=function(t){return function(e){var r,o=e.id,u=Object(n.a)(e,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,p=(s=void 0===s?{}:s).navbar,v=(p=void 0===p?{}:p).hideOnScroll,d=void 0!==v&&v;return o?i.a.createElement(t,u,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(r={},r[f.a.enhancedAnchor]=!d,r)),id:o}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+o,title:"Direct link to heading"},"#"),u.children):i.a.createElement(t,u)}}},451:function(t,e,r){(function(t,n){var o;(function(){var i="Expected a function",u="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",p="[object Error]",v="[object Function]",d="[object GeneratorFunction]",h="[object Map]",y="[object Number]",g="[object Object]",m="[object RegExp]",D="[object Set]",_="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",j="[object Float32Array]",A="[object Float64Array]",x="[object Int8Array]",O="[object Int16Array]",S="[object Int32Array]",k="[object Uint8Array]",C="[object Uint16Array]",N="[object Uint32Array]",P=/\b__p \+= '';/g,I=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,B=/&(?:amp|lt|gt|quot|#39);/g,L=/[&<>"']/g,T=RegExp(B.source),M=RegExp(L.source),W=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,H=RegExp(V.source),Q=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,K=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,tt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,et=/\\(\\)?/g,rt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nt=/\w*$/,ot=/^[-+]0x[0-9a-f]+$/i,it=/^0b[01]+$/i,ut=/^\[object .+?Constructor\]$/,at=/^0o[0-7]+$/i,ct=/^(?:0|[1-9]\d*)$/,lt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ft=/($^)/,st=/['\n\r\u2028\u2029\\]/g,pt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",dt="[\\ud800-\\udfff]",ht="["+vt+"]",yt="["+pt+"]",gt="\\d+",mt="[\\u2700-\\u27bf]",Dt="[a-z\\xdf-\\xf6\\xf8-\\xff]",_t="[^\\ud800-\\udfff"+vt+gt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",bt="\\ud83c[\\udffb-\\udfff]",Et="[^\\ud800-\\udfff]",wt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ft="[\\ud800-\\udbff][\\udc00-\\udfff]",jt="[A-Z\\xc0-\\xd6\\xd8-\\xde]",At="(?:"+Dt+"|"+_t+")",xt="(?:"+jt+"|"+_t+")",Ot="(?:"+yt+"|"+bt+")"+"?",St="[\\ufe0e\\ufe0f]?"+Ot+("(?:\\u200d(?:"+[Et,wt,Ft].join("|")+")[\\ufe0e\\ufe0f]?"+Ot+")*"),kt="(?:"+[mt,wt,Ft].join("|")+")"+St,Ct="(?:"+[Et+yt+"?",yt,wt,Ft,dt].join("|")+")",Nt=RegExp("['\u2019]","g"),Pt=RegExp(yt,"g"),It=RegExp(bt+"(?="+bt+")|"+Ct+St,"g"),Rt=RegExp([jt+"?"+Dt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[ht,jt,"$"].join("|")+")",xt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[ht,jt+At,"$"].join("|")+")",jt+"?"+At+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",jt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gt,kt].join("|"),"g"),Bt=RegExp("[\\u200d\\ud800-\\udfff"+pt+"\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Tt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mt=-1,Wt={};Wt[j]=Wt[A]=Wt[x]=Wt[O]=Wt[S]=Wt[k]=Wt["[object Uint8ClampedArray]"]=Wt[C]=Wt[N]=!0,Wt[c]=Wt[l]=Wt[w]=Wt[f]=Wt[F]=Wt[s]=Wt[p]=Wt[v]=Wt[h]=Wt[y]=Wt[g]=Wt[m]=Wt[D]=Wt[_]=Wt[E]=!1;var Ut={};Ut[c]=Ut[l]=Ut[w]=Ut[F]=Ut[f]=Ut[s]=Ut[j]=Ut[A]=Ut[x]=Ut[O]=Ut[S]=Ut[h]=Ut[y]=Ut[g]=Ut[m]=Ut[D]=Ut[_]=Ut[b]=Ut[k]=Ut["[object Uint8ClampedArray]"]=Ut[C]=Ut[N]=!0,Ut[p]=Ut[v]=Ut[E]=!1;var zt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$t=parseFloat,qt=parseInt,Gt="object"==typeof t&&t&&t.Object===Object&&t,Vt="object"==typeof self&&self&&self.Object===Object&&self,Ht=Gt||Vt||Function("return this")(),Qt=e&&!e.nodeType&&e,Jt=Qt&&"object"==typeof n&&n&&!n.nodeType&&n,Zt=Jt&&Jt.exports===Qt,Kt=Zt&&Gt.process,Yt=function(){try{var t=Jt&&Jt.require&&Jt.require("util").types;return t||Kt&&Kt.binding&&Kt.binding("util")}catch(e){}}(),Xt=Yt&&Yt.isArrayBuffer,te=Yt&&Yt.isDate,ee=Yt&&Yt.isMap,re=Yt&&Yt.isRegExp,ne=Yt&&Yt.isSet,oe=Yt&&Yt.isTypedArray;function ie(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}function ue(t,e,r,n){for(var o=-1,i=null==t?0:t.length;++o-1}function pe(t,e,r){for(var n=-1,o=null==t?0:t.length;++n-1;);return r}function Ie(t,e){for(var r=t.length;r--&&be(e,t[r],0)>-1;);return r}function Re(t,e){for(var r=t.length,n=0;r--;)t[r]===e&&++n;return n}var Be=Ae({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Le=Ae({"&":"&","<":"<",">":">",'"':""","'":"'"});function Te(t){return"\\"+zt[t]}function Me(t){return Bt.test(t)}function We(t){var e=-1,r=Array(t.size);return t.forEach((function(t,n){r[++e]=[n,t]})),r}function Ue(t,e){return function(r){return t(e(r))}}function ze(t,e){for(var r=-1,n=t.length,o=0,i=[];++r",""":'"',"'":"'"});var Qe=function t(e){var r,n=(e=null==e?Ht:Qe.defaults(Ht.Object(),e,Qe.pick(Ht,Tt))).Array,o=e.Date,pt=e.Error,vt=e.Function,dt=e.Math,ht=e.Object,yt=e.RegExp,gt=e.String,mt=e.TypeError,Dt=n.prototype,_t=vt.prototype,bt=ht.prototype,Et=e["__core-js_shared__"],wt=_t.toString,Ft=bt.hasOwnProperty,jt=0,At=(r=/[^.]+$/.exec(Et&&Et.keys&&Et.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",xt=bt.toString,Ot=wt.call(ht),St=Ht._,kt=yt("^"+wt.call(Ft).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ct=Zt?e.Buffer:void 0,It=e.Symbol,Bt=e.Uint8Array,zt=Ct?Ct.allocUnsafe:void 0,Gt=Ue(ht.getPrototypeOf,ht),Vt=ht.create,Qt=bt.propertyIsEnumerable,Jt=Dt.splice,Kt=It?It.isConcatSpreadable:void 0,Yt=It?It.iterator:void 0,me=It?It.toStringTag:void 0,Ae=function(){try{var t=ti(ht,"defineProperty");return t({},"",{}),t}catch(e){}}(),Je=e.clearTimeout!==Ht.clearTimeout&&e.clearTimeout,Ze=o&&o.now!==Ht.Date.now&&o.now,Ke=e.setTimeout!==Ht.setTimeout&&e.setTimeout,Ye=dt.ceil,Xe=dt.floor,tr=ht.getOwnPropertySymbols,er=Ct?Ct.isBuffer:void 0,rr=e.isFinite,nr=Dt.join,or=Ue(ht.keys,ht),ir=dt.max,ur=dt.min,ar=o.now,cr=e.parseInt,lr=dt.random,fr=Dt.reverse,sr=ti(e,"DataView"),pr=ti(e,"Map"),vr=ti(e,"Promise"),dr=ti(e,"Set"),hr=ti(e,"WeakMap"),yr=ti(ht,"create"),gr=hr&&new hr,mr={},Dr=xi(sr),_r=xi(pr),br=xi(vr),Er=xi(dr),wr=xi(hr),Fr=It?It.prototype:void 0,jr=Fr?Fr.valueOf:void 0,Ar=Fr?Fr.toString:void 0;function xr(t){if(qu(t)&&!Pu(t)&&!(t instanceof Cr)){if(t instanceof kr)return t;if(Ft.call(t,"__wrapped__"))return Oi(t)}return new kr(t)}var Or=function(){function t(){}return function(e){if(!$u(e))return{};if(Vt)return Vt(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();function Sr(){}function kr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Cr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nr(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Jr(t,e,r,n,o,i){var u,a=1&e,l=2&e,p=4&e;if(r&&(u=o?r(t,n,o,i):r(t)),void 0!==u)return u;if(!$u(t))return t;var E=Pu(t);if(E){if(u=function(t){var e=t.length,r=new t.constructor(e);e&&"string"==typeof t[0]&&Ft.call(t,"index")&&(r.index=t.index,r.input=t.input);return r}(t),!a)return mo(t,u)}else{var P=ni(t),I=P==v||P==d;if(Lu(t))return so(t,a);if(P==g||P==c||I&&!o){if(u=l||I?{}:ii(t),!a)return l?function(t,e){return Do(t,ri(t),e)}(t,function(t,e){return t&&Do(e,ba(e),t)}(u,t)):function(t,e){return Do(t,ei(t),e)}(t,Gr(u,t))}else{if(!Ut[P])return o?t:{};u=function(t,e,r){var n=t.constructor;switch(e){case w:return po(t);case f:case s:return new n(+t);case F:return function(t,e){var r=e?po(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}(t,r);case j:case A:case x:case O:case S:case k:case"[object Uint8ClampedArray]":case C:case N:return vo(t,r);case h:return new n;case y:case _:return new n(t);case m:return function(t){var e=new t.constructor(t.source,nt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case D:return new n;case b:return o=t,jr?ht(jr.call(o)):{}}var o}(t,P,a)}}i||(i=new Br);var R=i.get(t);if(R)return R;i.set(t,u),Ju(t)?t.forEach((function(n){u.add(Jr(n,e,r,n,t,i))})):Gu(t)&&t.forEach((function(n,o){u.set(o,Jr(n,e,r,o,t,i))}));var B=E?void 0:(p?l?Ho:Vo:l?ba:_a)(t);return ae(B||t,(function(n,o){B&&(n=t[o=n]),zr(u,o,Jr(n,e,r,o,t,i))})),u}function Zr(t,e,r){var n=r.length;if(null==t)return!n;for(t=ht(t);n--;){var o=r[n],i=e[o],u=t[o];if(void 0===u&&!(o in t)||!i(u))return!1}return!0}function Kr(t,e,r){if("function"!=typeof t)throw new mt(i);return _i((function(){t.apply(void 0,r)}),e)}function Yr(t,e,r,n){var o=-1,i=se,u=!0,a=t.length,c=[],l=e.length;if(!a)return c;r&&(e=ve(e,ke(r))),n?(i=pe,u=!1):e.length>=200&&(i=Ne,u=!1,e=new Rr(e));t:for(;++o-1},Pr.prototype.set=function(t,e){var r=this.__data__,n=$r(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this},Ir.prototype.clear=function(){this.size=0,this.__data__={hash:new Nr,map:new(pr||Pr),string:new Nr}},Ir.prototype.delete=function(t){var e=Yo(this,t).delete(t);return this.size-=e?1:0,e},Ir.prototype.get=function(t){return Yo(this,t).get(t)},Ir.prototype.has=function(t){return Yo(this,t).has(t)},Ir.prototype.set=function(t,e){var r=Yo(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this},Rr.prototype.add=Rr.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Rr.prototype.has=function(t){return this.__data__.has(t)},Br.prototype.clear=function(){this.__data__=new Pr,this.size=0},Br.prototype.delete=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r},Br.prototype.get=function(t){return this.__data__.get(t)},Br.prototype.has=function(t){return this.__data__.has(t)},Br.prototype.set=function(t,e){var r=this.__data__;if(r instanceof Pr){var n=r.__data__;if(!pr||n.length<199)return n.push([t,e]),this.size=++r.size,this;r=this.__data__=new Ir(n)}return r.set(t,e),this.size=r.size,this};var Xr=Eo(cn),tn=Eo(ln,!0);function en(t,e){var r=!0;return Xr(t,(function(t,n,o){return r=!!e(t,n,o)})),r}function rn(t,e,r){for(var n=-1,o=t.length;++n0&&r(a)?e>1?on(a,e-1,r,n,o):de(o,a):n||(o[o.length]=a)}return o}var un=wo(),an=wo(!0);function cn(t,e){return t&&un(t,e,_a)}function ln(t,e){return t&&an(t,e,_a)}function fn(t,e){return fe(e,(function(e){return Wu(t[e])}))}function sn(t,e){for(var r=0,n=(e=ao(e,t)).length;null!=t&&re}function hn(t,e){return null!=t&&Ft.call(t,e)}function yn(t,e){return null!=t&&e in ht(t)}function gn(t,e,r){for(var o=r?pe:se,i=t[0].length,u=t.length,a=u,c=n(u),l=1/0,f=[];a--;){var s=t[a];a&&e&&(s=ve(s,ke(e))),l=ur(s.length,l),c[a]=!r&&(e||i>=120&&s.length>=120)?new Rr(a&&s):void 0}s=t[0];var p=-1,v=c[0];t:for(;++p=a)return c;var l=r[n];return c*("desc"==l?-1:1)}}return t.index-e.index}(t,e,r)}))}function Pn(t,e,r){for(var n=-1,o=e.length,i={};++n-1;)a!==t&&Jt.call(a,c,1),Jt.call(t,c,1);return t}function Rn(t,e){for(var r=t?e.length:0,n=r-1;r--;){var o=e[r];if(r==n||o!==i){var i=o;ai(o)?Jt.call(t,o,1):Xn(t,o)}}return t}function Bn(t,e){return t+Xe(lr()*(e-t+1))}function Ln(t,e){var r="";if(!t||e<1||e>9007199254740991)return r;do{e%2&&(r+=t),(e=Xe(e/2))&&(t+=t)}while(e);return r}function Tn(t,e){return bi(hi(t,e,Va),t+"")}function Mn(t){return Tr(Sa(t))}function Wn(t,e){var r=Sa(t);return Fi(r,Qr(e,0,r.length))}function Un(t,e,r,n){if(!$u(t))return t;for(var o=-1,i=(e=ao(e,t)).length,u=i-1,a=t;null!=a&&++oi?0:i+e),(r=r>i?i:r)<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var u=n(i);++o>>1,u=t[i];null!==u&&!Ku(u)&&(r?u<=e:u=200){var l=e?null:To(t);if(l)return $e(l);u=!1,o=Ne,c=new Rr}else c=e?[]:a;t:for(;++n=n?t:Gn(t,e,r)}var fo=Je||function(t){return Ht.clearTimeout(t)};function so(t,e){if(e)return t.slice();var r=t.length,n=zt?zt(r):new t.constructor(r);return t.copy(n),n}function po(t){var e=new t.constructor(t.byteLength);return new Bt(e).set(new Bt(t)),e}function vo(t,e){var r=e?po(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}function ho(t,e){if(t!==e){var r=void 0!==t,n=null===t,o=t==t,i=Ku(t),u=void 0!==e,a=null===e,c=e==e,l=Ku(e);if(!a&&!l&&!i&&t>e||i&&u&&c&&!a&&!l||n&&u&&c||!r&&c||!o)return 1;if(!n&&!i&&!l&&t1?r[o-1]:void 0,u=o>2?r[2]:void 0;for(i=t.length>3&&"function"==typeof i?(o--,i):void 0,u&&ci(r[0],r[1],u)&&(i=o<3?void 0:i,o=1),e=ht(e);++n-1?o[i?e[u]:u]:void 0}}function Oo(t){return Go((function(e){var r=e.length,n=r,o=kr.prototype.thru;for(t&&e.reverse();n--;){var u=e[n];if("function"!=typeof u)throw new mt(i);if(o&&!a&&"wrapper"==Jo(u))var a=new kr([],!0)}for(n=a?n:r;++n1&&D.reverse(),s&&la))return!1;var l=i.get(t);if(l&&i.get(e))return l==e;var f=-1,s=!0,p=2&r?new Rr:void 0;for(i.set(t,e),i.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[n],e=e.join(r>2?", ":" "),t.replace(K,"{\n/* [wrapped with "+e+"] */\n")}(n,function(t,e){return ae(a,(function(r){var n="_."+r[0];e&r[1]&&!se(t,n)&&t.push(n)})),t.sort()}(function(t){var e=t.match(Y);return e?e[1].split(X):[]}(n),r)))}function wi(t){var e=0,r=0;return function(){var n=ar(),o=16-(n-r);if(r=n,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Fi(t,e){var r=-1,n=t.length,o=n-1;for(e=void 0===e?n:e;++r1?t[e-1]:void 0;return r="function"==typeof r?(t.pop(),r):void 0,Qi(t,r)}));function eu(t){var e=xr(t);return e.__chain__=!0,e}function ru(t,e){return e(t)}var nu=Go((function(t){var e=t.length,r=e?t[0]:0,n=this.__wrapped__,o=function(e){return Hr(e,t)};return!(e>1||this.__actions__.length)&&n instanceof Cr&&ai(r)?((n=n.slice(r,+r+(e?1:0))).__actions__.push({func:ru,args:[o],thisArg:void 0}),new kr(n,this.__chain__).thru((function(t){return e&&!t.length&&t.push(void 0),t}))):this.thru(o)}));var ou=_o((function(t,e,r){Ft.call(t,r)?++t[r]:Vr(t,r,1)}));var iu=xo(Ni),uu=xo(Pi);function au(t,e){return(Pu(t)?ae:Xr)(t,Ko(e,3))}function cu(t,e){return(Pu(t)?ce:tn)(t,Ko(e,3))}var lu=_o((function(t,e,r){Ft.call(t,r)?t[r].push(e):Vr(t,r,[e])}));var fu=Tn((function(t,e,r){var o=-1,i="function"==typeof e,u=Ru(t)?n(t.length):[];return Xr(t,(function(t){u[++o]=i?ie(e,t,r):mn(t,e,r)})),u})),su=_o((function(t,e,r){Vr(t,r,e)}));function pu(t,e){return(Pu(t)?ve:xn)(t,Ko(e,3))}var vu=_o((function(t,e,r){t[r?0:1].push(e)}),(function(){return[[],[]]}));var du=Tn((function(t,e){if(null==t)return[];var r=e.length;return r>1&&ci(t,e[0],e[1])?e=[]:r>2&&ci(e[0],e[1],e[2])&&(e=[e[0]]),Nn(t,on(e,1),[])})),hu=Ze||function(){return Ht.Date.now()};function yu(t,e,r){return e=r?void 0:e,Wo(t,128,void 0,void 0,void 0,void 0,e=t&&null==e?t.length:e)}function gu(t,e){var r;if("function"!=typeof e)throw new mt(i);return t=na(t),function(){return--t>0&&(r=e.apply(this,arguments)),t<=1&&(e=void 0),r}}var mu=Tn((function(t,e,r){var n=1;if(r.length){var o=ze(r,Zo(mu));n|=32}return Wo(t,n,e,r,o)})),Du=Tn((function(t,e,r){var n=3;if(r.length){var o=ze(r,Zo(Du));n|=32}return Wo(e,n,t,r,o)}));function _u(t,e,r){var n,o,u,a,c,l,f=0,s=!1,p=!1,v=!0;if("function"!=typeof t)throw new mt(i);function d(e){var r=n,i=o;return n=o=void 0,f=e,a=t.apply(i,r)}function h(t){return f=t,c=_i(g,e),s?d(t):a}function y(t){var r=t-l;return void 0===l||r>=e||r<0||p&&t-f>=u}function g(){var t=hu();if(y(t))return m(t);c=_i(g,function(t){var r=e-(t-l);return p?ur(r,u-(t-f)):r}(t))}function m(t){return c=void 0,v&&n?d(t):(n=o=void 0,a)}function D(){var t=hu(),r=y(t);if(n=arguments,o=this,l=t,r){if(void 0===c)return h(l);if(p)return fo(c),c=_i(g,e),d(l)}return void 0===c&&(c=_i(g,e)),a}return e=ia(e)||0,$u(r)&&(s=!!r.leading,u=(p="maxWait"in r)?ir(ia(r.maxWait)||0,e):u,v="trailing"in r?!!r.trailing:v),D.cancel=function(){void 0!==c&&fo(c),f=0,n=l=o=c=void 0},D.flush=function(){return void 0===c?a:m(hu())},D}var bu=Tn((function(t,e){return Kr(t,1,e)})),Eu=Tn((function(t,e,r){return Kr(t,ia(e)||0,r)}));function wu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new mt(i);var r=function(){var n=arguments,o=e?e.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return r.cache=i.set(o,u)||i,u};return r.cache=new(wu.Cache||Ir),r}function Fu(t){if("function"!=typeof t)throw new mt(i);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}wu.Cache=Ir;var ju=co((function(t,e){var r=(e=1==e.length&&Pu(e[0])?ve(e[0],ke(Ko())):ve(on(e,1),ke(Ko()))).length;return Tn((function(n){for(var o=-1,i=ur(n.length,r);++o=e})),Nu=Dn(function(){return arguments}())?Dn:function(t){return qu(t)&&Ft.call(t,"callee")&&!Qt.call(t,"callee")},Pu=n.isArray,Iu=Xt?ke(Xt):function(t){return qu(t)&&vn(t)==w};function Ru(t){return null!=t&&zu(t.length)&&!Wu(t)}function Bu(t){return qu(t)&&Ru(t)}var Lu=er||ic,Tu=te?ke(te):function(t){return qu(t)&&vn(t)==s};function Mu(t){if(!qu(t))return!1;var e=vn(t);return e==p||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!Hu(t)}function Wu(t){if(!$u(t))return!1;var e=vn(t);return e==v||e==d||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Uu(t){return"number"==typeof t&&t==na(t)}function zu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}function $u(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function qu(t){return null!=t&&"object"==typeof t}var Gu=ee?ke(ee):function(t){return qu(t)&&ni(t)==h};function Vu(t){return"number"==typeof t||qu(t)&&vn(t)==y}function Hu(t){if(!qu(t)||vn(t)!=g)return!1;var e=Gt(t);if(null===e)return!0;var r=Ft.call(e,"constructor")&&e.constructor;return"function"==typeof r&&r instanceof r&&wt.call(r)==Ot}var Qu=re?ke(re):function(t){return qu(t)&&vn(t)==m};var Ju=ne?ke(ne):function(t){return qu(t)&&ni(t)==D};function Zu(t){return"string"==typeof t||!Pu(t)&&qu(t)&&vn(t)==_}function Ku(t){return"symbol"==typeof t||qu(t)&&vn(t)==b}var Yu=oe?ke(oe):function(t){return qu(t)&&zu(t.length)&&!!Wt[vn(t)]};var Xu=Ro(An),ta=Ro((function(t,e){return t<=e}));function ea(t){if(!t)return[];if(Ru(t))return Zu(t)?Ve(t):mo(t);if(Yt&&t[Yt])return function(t){for(var e,r=[];!(e=t.next()).done;)r.push(e.value);return r}(t[Yt]());var e=ni(t);return(e==h?We:e==D?$e:Sa)(t)}function ra(t){return t?(t=ia(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function na(t){var e=ra(t),r=e%1;return e==e?r?e-r:e:0}function oa(t){return t?Qr(na(t),0,4294967295):0}function ia(t){if("number"==typeof t)return t;if(Ku(t))return NaN;if($u(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=$u(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Q,"");var r=it.test(t);return r||at.test(t)?qt(t.slice(2),r?2:8):ot.test(t)?NaN:+t}function ua(t){return Do(t,ba(t))}function aa(t){return null==t?"":Kn(t)}var ca=bo((function(t,e){if(pi(e)||Ru(e))Do(e,_a(e),t);else for(var r in e)Ft.call(e,r)&&zr(t,r,e[r])})),la=bo((function(t,e){Do(e,ba(e),t)})),fa=bo((function(t,e,r,n){Do(e,ba(e),t,n)})),sa=bo((function(t,e,r,n){Do(e,_a(e),t,n)})),pa=Go(Hr);var va=Tn((function(t,e){t=ht(t);var r=-1,n=e.length,o=n>2?e[2]:void 0;for(o&&ci(e[0],e[1],o)&&(n=1);++r1),e})),Do(t,Ho(t),r),n&&(r=Jr(r,7,$o));for(var o=e.length;o--;)Xn(r,e[o]);return r}));var ja=Go((function(t,e){return null==t?{}:function(t,e){return Pn(t,e,(function(e,r){return ya(t,r)}))}(t,e)}));function Aa(t,e){if(null==t)return{};var r=ve(Ho(t),(function(t){return[t]}));return e=Ko(e),Pn(t,r,(function(t,r){return e(t,r[0])}))}var xa=Mo(_a),Oa=Mo(ba);function Sa(t){return null==t?[]:Ce(t,_a(t))}var ka=jo((function(t,e,r){return e=e.toLowerCase(),t+(r?Ca(e):e)}));function Ca(t){return Ma(aa(t).toLowerCase())}function Na(t){return(t=aa(t))&&t.replace(lt,Be).replace(Pt,"")}var Pa=jo((function(t,e,r){return t+(r?"-":"")+e.toLowerCase()})),Ia=jo((function(t,e,r){return t+(r?" ":"")+e.toLowerCase()})),Ra=Fo("toLowerCase");var Ba=jo((function(t,e,r){return t+(r?"_":"")+e.toLowerCase()}));var La=jo((function(t,e,r){return t+(r?" ":"")+Ma(e)}));var Ta=jo((function(t,e,r){return t+(r?" ":"")+e.toUpperCase()})),Ma=Fo("toUpperCase");function Wa(t,e,r){return t=aa(t),void 0===(e=r?void 0:e)?function(t){return Lt.test(t)}(t)?function(t){return t.match(Rt)||[]}(t):function(t){return t.match(tt)||[]}(t):t.match(e)||[]}var Ua=Tn((function(t,e){try{return ie(t,void 0,e)}catch(r){return Mu(r)?r:new pt(r)}})),za=Go((function(t,e){return ae(e,(function(e){e=Ai(e),Vr(t,e,mu(t[e],t))})),t}));function $a(t){return function(){return t}}var qa=Oo(),Ga=Oo(!0);function Va(t){return t}function Ha(t){return wn("function"==typeof t?t:Jr(t,1))}var Qa=Tn((function(t,e){return function(r){return mn(r,t,e)}})),Ja=Tn((function(t,e){return function(r){return mn(t,r,e)}}));function Za(t,e,r){var n=_a(e),o=fn(e,n);null!=r||$u(e)&&(o.length||!n.length)||(r=e,e=t,t=this,o=fn(e,_a(e)));var i=!($u(r)&&"chain"in r&&!r.chain),u=Wu(t);return ae(o,(function(r){var n=e[r];t[r]=n,u&&(t.prototype[r]=function(){var e=this.__chain__;if(i||e){var r=t(this.__wrapped__),o=r.__actions__=mo(this.__actions__);return o.push({func:n,args:arguments,thisArg:t}),r.__chain__=e,r}return n.apply(t,de([this.value()],arguments))})})),t}function Ka(){}var Ya=No(ve),Xa=No(le),tc=No(ge);function ec(t){return li(t)?je(Ai(t)):function(t){return function(e){return sn(e,t)}}(t)}var rc=Io(),nc=Io(!0);function oc(){return[]}function ic(){return!1}var uc=Co((function(t,e){return t+e}),0),ac=Lo("ceil"),cc=Co((function(t,e){return t/e}),1),lc=Lo("floor");var fc,sc=Co((function(t,e){return t*e}),1),pc=Lo("round"),vc=Co((function(t,e){return t-e}),0);return xr.after=function(t,e){if("function"!=typeof e)throw new mt(i);return t=na(t),function(){if(--t<1)return e.apply(this,arguments)}},xr.ary=yu,xr.assign=ca,xr.assignIn=la,xr.assignInWith=fa,xr.assignWith=sa,xr.at=pa,xr.before=gu,xr.bind=mu,xr.bindAll=za,xr.bindKey=Du,xr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Pu(t)?t:[t]},xr.chain=eu,xr.chunk=function(t,e,r){e=(r?ci(t,e,r):void 0===e)?1:ir(na(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var i=0,u=0,a=n(Ye(o/e));io?0:o+r),(n=void 0===n||n>o?o:na(n))<0&&(n+=o),n=r>n?0:oa(n);r>>0)?(t=aa(t))&&("string"==typeof e||null!=e&&!Qu(e))&&!(e=Kn(e))&&Me(t)?lo(Ve(t),0,r):t.split(e,r):[]},xr.spread=function(t,e){if("function"!=typeof t)throw new mt(i);return e=null==e?0:ir(na(e),0),Tn((function(r){var n=r[e],o=lo(r,0,e);return n&&de(o,n),ie(t,this,o)}))},xr.tail=function(t){var e=null==t?0:t.length;return e?Gn(t,1,e):[]},xr.take=function(t,e,r){return t&&t.length?Gn(t,0,(e=r||void 0===e?1:na(e))<0?0:e):[]},xr.takeRight=function(t,e,r){var n=null==t?0:t.length;return n?Gn(t,(e=n-(e=r||void 0===e?1:na(e)))<0?0:e,n):[]},xr.takeRightWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3),!1,!0):[]},xr.takeWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3)):[]},xr.tap=function(t,e){return e(t),t},xr.throttle=function(t,e,r){var n=!0,o=!0;if("function"!=typeof t)throw new mt(i);return $u(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),_u(t,e,{leading:n,maxWait:e,trailing:o})},xr.thru=ru,xr.toArray=ea,xr.toPairs=xa,xr.toPairsIn=Oa,xr.toPath=function(t){return Pu(t)?ve(t,Ai):Ku(t)?[t]:mo(ji(aa(t)))},xr.toPlainObject=ua,xr.transform=function(t,e,r){var n=Pu(t),o=n||Lu(t)||Yu(t);if(e=Ko(e,4),null==r){var i=t&&t.constructor;r=o?n?new i:[]:$u(t)&&Wu(i)?Or(Gt(t)):{}}return(o?ae:cn)(t,(function(t,n,o){return e(r,t,n,o)})),r},xr.unary=function(t){return yu(t,1)},xr.union=qi,xr.unionBy=Gi,xr.unionWith=Vi,xr.uniq=function(t){return t&&t.length?Yn(t):[]},xr.uniqBy=function(t,e){return t&&t.length?Yn(t,Ko(e,2)):[]},xr.uniqWith=function(t,e){return e="function"==typeof e?e:void 0,t&&t.length?Yn(t,void 0,e):[]},xr.unset=function(t,e){return null==t||Xn(t,e)},xr.unzip=Hi,xr.unzipWith=Qi,xr.update=function(t,e,r){return null==t?t:to(t,e,uo(r))},xr.updateWith=function(t,e,r,n){return n="function"==typeof n?n:void 0,null==t?t:to(t,e,uo(r),n)},xr.values=Sa,xr.valuesIn=function(t){return null==t?[]:Ce(t,ba(t))},xr.without=Ji,xr.words=Wa,xr.wrap=function(t,e){return Au(uo(e),t)},xr.xor=Zi,xr.xorBy=Ki,xr.xorWith=Yi,xr.zip=Xi,xr.zipObject=function(t,e){return oo(t||[],e||[],zr)},xr.zipObjectDeep=function(t,e){return oo(t||[],e||[],Un)},xr.zipWith=tu,xr.entries=xa,xr.entriesIn=Oa,xr.extend=la,xr.extendWith=fa,Za(xr,xr),xr.add=uc,xr.attempt=Ua,xr.camelCase=ka,xr.capitalize=Ca,xr.ceil=ac,xr.clamp=function(t,e,r){return void 0===r&&(r=e,e=void 0),void 0!==r&&(r=(r=ia(r))==r?r:0),void 0!==e&&(e=(e=ia(e))==e?e:0),Qr(ia(t),e,r)},xr.clone=function(t){return Jr(t,4)},xr.cloneDeep=function(t){return Jr(t,5)},xr.cloneDeepWith=function(t,e){return Jr(t,5,e="function"==typeof e?e:void 0)},xr.cloneWith=function(t,e){return Jr(t,4,e="function"==typeof e?e:void 0)},xr.conformsTo=function(t,e){return null==e||Zr(t,e,_a(e))},xr.deburr=Na,xr.defaultTo=function(t,e){return null==t||t!=t?e:t},xr.divide=cc,xr.endsWith=function(t,e,r){t=aa(t),e=Kn(e);var n=t.length,o=r=void 0===r?n:Qr(na(r),0,n);return(r-=e.length)>=0&&t.slice(r,o)==e},xr.eq=Su,xr.escape=function(t){return(t=aa(t))&&M.test(t)?t.replace(L,Le):t},xr.escapeRegExp=function(t){return(t=aa(t))&&H.test(t)?t.replace(V,"\\$&"):t},xr.every=function(t,e,r){var n=Pu(t)?le:en;return r&&ci(t,e,r)&&(e=void 0),n(t,Ko(e,3))},xr.find=iu,xr.findIndex=Ni,xr.findKey=function(t,e){return De(t,Ko(e,3),cn)},xr.findLast=uu,xr.findLastIndex=Pi,xr.findLastKey=function(t,e){return De(t,Ko(e,3),ln)},xr.floor=lc,xr.forEach=au,xr.forEachRight=cu,xr.forIn=function(t,e){return null==t?t:un(t,Ko(e,3),ba)},xr.forInRight=function(t,e){return null==t?t:an(t,Ko(e,3),ba)},xr.forOwn=function(t,e){return t&&cn(t,Ko(e,3))},xr.forOwnRight=function(t,e){return t&&ln(t,Ko(e,3))},xr.get=ha,xr.gt=ku,xr.gte=Cu,xr.has=function(t,e){return null!=t&&oi(t,e,hn)},xr.hasIn=ya,xr.head=Ri,xr.identity=Va,xr.includes=function(t,e,r,n){t=Ru(t)?t:Sa(t),r=r&&!n?na(r):0;var o=t.length;return r<0&&(r=ir(o+r,0)),Zu(t)?r<=o&&t.indexOf(e,r)>-1:!!o&&be(t,e,r)>-1},xr.indexOf=function(t,e,r){var n=null==t?0:t.length;if(!n)return-1;var o=null==r?0:na(r);return o<0&&(o=ir(n+o,0)),be(t,e,o)},xr.inRange=function(t,e,r){return e=ra(e),void 0===r?(r=e,e=0):r=ra(r),function(t,e,r){return t>=ur(e,r)&&t=-9007199254740991&&t<=9007199254740991},xr.isSet=Ju,xr.isString=Zu,xr.isSymbol=Ku,xr.isTypedArray=Yu,xr.isUndefined=function(t){return void 0===t},xr.isWeakMap=function(t){return qu(t)&&ni(t)==E},xr.isWeakSet=function(t){return qu(t)&&"[object WeakSet]"==vn(t)},xr.join=function(t,e){return null==t?"":nr.call(t,e)},xr.kebabCase=Pa,xr.last=Mi,xr.lastIndexOf=function(t,e,r){var n=null==t?0:t.length;if(!n)return-1;var o=n;return void 0!==r&&(o=(o=na(r))<0?ir(n+o,0):ur(o,n-1)),e==e?function(t,e,r){for(var n=r+1;n--;)if(t[n]===e)return n;return n}(t,e,o):_e(t,we,o,!0)},xr.lowerCase=Ia,xr.lowerFirst=Ra,xr.lt=Xu,xr.lte=ta,xr.max=function(t){return t&&t.length?rn(t,Va,dn):void 0},xr.maxBy=function(t,e){return t&&t.length?rn(t,Ko(e,2),dn):void 0},xr.mean=function(t){return Fe(t,Va)},xr.meanBy=function(t,e){return Fe(t,Ko(e,2))},xr.min=function(t){return t&&t.length?rn(t,Va,An):void 0},xr.minBy=function(t,e){return t&&t.length?rn(t,Ko(e,2),An):void 0},xr.stubArray=oc,xr.stubFalse=ic,xr.stubObject=function(){return{}},xr.stubString=function(){return""},xr.stubTrue=function(){return!0},xr.multiply=sc,xr.nth=function(t,e){return t&&t.length?Cn(t,na(e)):void 0},xr.noConflict=function(){return Ht._===this&&(Ht._=St),this},xr.noop=Ka,xr.now=hu,xr.pad=function(t,e,r){t=aa(t);var n=(e=na(e))?Ge(t):0;if(!e||n>=e)return t;var o=(e-n)/2;return Po(Xe(o),r)+t+Po(Ye(o),r)},xr.padEnd=function(t,e,r){t=aa(t);var n=(e=na(e))?Ge(t):0;return e&&ne){var n=t;t=e,e=n}if(r||t%1||e%1){var o=lr();return ur(t+o*(e-t+$t("1e-"+((o+"").length-1))),e)}return Bn(t,e)},xr.reduce=function(t,e,r){var n=Pu(t)?he:xe,o=arguments.length<3;return n(t,Ko(e,4),r,o,Xr)},xr.reduceRight=function(t,e,r){var n=Pu(t)?ye:xe,o=arguments.length<3;return n(t,Ko(e,4),r,o,tn)},xr.repeat=function(t,e,r){return e=(r?ci(t,e,r):void 0===e)?1:na(e),Ln(aa(t),e)},xr.replace=function(){var t=arguments,e=aa(t[0]);return t.length<3?e:e.replace(t[1],t[2])},xr.result=function(t,e,r){var n=-1,o=(e=ao(e,t)).length;for(o||(o=1,t=void 0);++n9007199254740991)return[];var r=4294967295,n=ur(t,4294967295);t-=4294967295;for(var o=Se(n,e=Ko(e));++r=i)return t;var a=r-Ge(n);if(a<1)return n;var c=u?lo(u,0,a).join(""):t.slice(0,a);if(void 0===o)return c+n;if(u&&(a+=c.length-a),Qu(o)){if(t.slice(a).search(o)){var l,f=c;for(o.global||(o=yt(o.source,aa(nt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(t.indexOf(Kn(o),a)!=a){var p=c.lastIndexOf(o);p>-1&&(c=c.slice(0,p))}return c+n},xr.unescape=function(t){return(t=aa(t))&&T.test(t)?t.replace(B,He):t},xr.uniqueId=function(t){var e=++jt;return aa(t)+e},xr.upperCase=Ta,xr.upperFirst=Ma,xr.each=au,xr.eachRight=cu,xr.first=Ri,Za(xr,(fc={},cn(xr,(function(t,e){Ft.call(xr.prototype,e)||(fc[e]=t)})),fc),{chain:!1}),xr.VERSION="4.17.15",ae(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){xr[t].placeholder=xr})),ae(["drop","take"],(function(t,e){Cr.prototype[t]=function(r){r=void 0===r?1:ir(na(r),0);var n=this.__filtered__&&!e?new Cr(this):this.clone();return n.__filtered__?n.__takeCount__=ur(r,n.__takeCount__):n.__views__.push({size:ur(r,4294967295),type:t+(n.__dir__<0?"Right":"")}),n},Cr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),ae(["filter","map","takeWhile"],(function(t,e){var r=e+1,n=1==r||3==r;Cr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Ko(t,3),type:r}),e.__filtered__=e.__filtered__||n,e}})),ae(["head","last"],(function(t,e){var r="take"+(e?"Right":"");Cr.prototype[t]=function(){return this[r](1).value()[0]}})),ae(["initial","tail"],(function(t,e){var r="drop"+(e?"":"Right");Cr.prototype[t]=function(){return this.__filtered__?new Cr(this):this[r](1)}})),Cr.prototype.compact=function(){return this.filter(Va)},Cr.prototype.find=function(t){return this.filter(t).head()},Cr.prototype.findLast=function(t){return this.reverse().find(t)},Cr.prototype.invokeMap=Tn((function(t,e){return"function"==typeof t?new Cr(this):this.map((function(r){return mn(r,t,e)}))})),Cr.prototype.reject=function(t){return this.filter(Fu(Ko(t)))},Cr.prototype.slice=function(t,e){t=na(t);var r=this;return r.__filtered__&&(t>0||e<0)?new Cr(r):(t<0?r=r.takeRight(-t):t&&(r=r.drop(t)),void 0!==e&&(r=(e=na(e))<0?r.dropRight(-e):r.take(e-t)),r)},Cr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Cr.prototype.toArray=function(){return this.take(4294967295)},cn(Cr.prototype,(function(t,e){var r=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),o=xr[n?"take"+("last"==e?"Right":""):e],i=n||/^find/.test(e);o&&(xr.prototype[e]=function(){var e=this.__wrapped__,u=n?[1]:arguments,a=e instanceof Cr,c=u[0],l=a||Pu(e),f=function(t){var e=o.apply(xr,de([t],u));return n&&s?e[0]:e};l&&r&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,p=!!this.__actions__.length,v=i&&!s,d=a&&!p;if(!i&&l){e=d?e:new Cr(this);var h=t.apply(e,u);return h.__actions__.push({func:ru,args:[f],thisArg:void 0}),new kr(h,s)}return v&&d?t.apply(this,u):(h=this.thru(f),v?n?h.value()[0]:h.value():h)})})),ae(["pop","push","shift","sort","splice","unshift"],(function(t){var e=Dt[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",n=/^(?:pop|shift)$/.test(t);xr.prototype[t]=function(){var t=arguments;if(n&&!this.__chain__){var o=this.value();return e.apply(Pu(o)?o:[],t)}return this[r]((function(r){return e.apply(Pu(r)?r:[],t)}))}})),cn(Cr.prototype,(function(t,e){var r=xr[e];if(r){var n=r.name+"";Ft.call(mr,n)||(mr[n]=[]),mr[n].push({name:e,func:r})}})),mr[So(void 0,2).name]=[{name:"wrapper",func:void 0}],Cr.prototype.clone=function(){var t=new Cr(this.__wrapped__);return t.__actions__=mo(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=mo(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=mo(this.__views__),t},Cr.prototype.reverse=function(){if(this.__filtered__){var t=new Cr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Cr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,r=Pu(t),n=e<0,o=r?t.length:0,i=function(t,e,r){var n=-1,o=r.length;for(;++n=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},xr.prototype.plant=function(t){for(var e,r=this;r instanceof Sr;){var n=Oi(r);n.__index__=0,n.__values__=void 0,e?o.__wrapped__=n:e=n;var o=n;r=r.__wrapped__}return o.__wrapped__=t,e},xr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Cr){var e=t;return this.__actions__.length&&(e=new Cr(this)),(e=e.reverse()).__actions__.push({func:ru,args:[$i],thisArg:void 0}),new kr(e,this.__chain__)}return this.thru($i)},xr.prototype.toJSON=xr.prototype.valueOf=xr.prototype.value=function(){return ro(this.__wrapped__,this.__actions__)},xr.prototype.first=xr.prototype.head,Yt&&(xr.prototype[Yt]=function(){return this}),xr}();Ht._=Qe,void 0===(o=function(){return Qe}.call(e,r,e,n))||(n.exports=o)}).call(this)}).call(this,r(76),r(456)(t))},454:function(t,e,r){"use strict";var n=r(0),o=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=o},455:function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));r(77),r(473),r(439),r(78);var n=r(475),o=r.n(n);function i(t,e){var r=new o.a;return t.map((function(t){var n=t;return"string"==typeof t&&(n={label:t,permalink:"/blog/tags/"+r.slug(t)}),function(t,e){var r=t.label.split(": ",2),n=r[0],o=r[1],i="primary";switch(e){case"blog":case"guides":i=function(t){switch(t){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:t.count,label:t.label,permalink:t.permalink,style:i,value:o}}(n,e)}))}},456:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},465:function(t,e,r){var n=r(30),o=r(54),i=r(27),u=r(26),a=r(466);t.exports=function(t,e){var r=1==t,c=2==t,l=3==t,f=4==t,s=6==t,p=5==t||s,v=e||a;return function(e,a,d){for(var h,y,g=i(e),m=o(g),D=n(a,d,3),_=u(m.length),b=0,E=r?v(e,_):c?v(e,0):void 0;_>b;b++)if((p||b in m)&&(y=D(h=m[b],b,g),t))if(r)E[b]=y;else if(y)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:E.push(h)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(t,e,r){var n=r(467);t.exports=function(t,e){return new(n(t))(e)}},467:function(t,e,r){var n=r(13),o=r(468),i=r(2)("species");t.exports=function(t){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)||(e=void 0),n(e)&&null===(e=e[i])&&(e=void 0)),void 0===e?Array:e}},468:function(t,e,r){var n=r(23);t.exports=Array.isArray||function(t){return"Array"==n(t)}},469:function(t,e,r){"use strict";var n=SyntaxError,o=Function,i=TypeError,u=function(t){try{return o('"use strict"; return ('+t+").constructor;")()}catch(e){}},a=Object.getOwnPropertyDescriptor;if(a)try{a({},"")}catch(x){a=null}var c=function(){throw new i},l=a?function(){try{return c}catch(t){try{return a(arguments,"callee").get}catch(e){return c}}}():c,f=r(507)(),s=Object.getPrototypeOf||function(t){return t.__proto__},p={},v="undefined"==typeof Uint8Array?void 0:s(Uint8Array),d={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?s([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":o,"%GeneratorFunction%":p,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?s(s([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?s((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?s((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?s(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":l,"%TypedArray%":v,"%TypeError%":i,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=r(470),g=r(510),m=y.call(Function.call,Array.prototype.concat),D=y.call(Function.apply,Array.prototype.splice),_=y.call(Function.call,String.prototype.replace),b=y.call(Function.call,String.prototype.slice),E=y.call(Function.call,RegExp.prototype.exec),w=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,F=/\\(\\)?/g,j=function(t){var e=b(t,0,1),r=b(t,-1);if("%"===e&&"%"!==r)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==e)throw new n("invalid intrinsic syntax, expected opening `%`");var o=[];return _(t,w,(function(t,e,r,n){o[o.length]=r?_(n,F,"$1"):e||t})),o},A=function(t,e){var r,o=t;if(g(h,o)&&(o="%"+(r=h[o])[0]+"%"),g(d,o)){var a=d[o];if(a===p&&(a=function t(e){var r;if("%AsyncFunction%"===e)r=u("async function () {}");else if("%GeneratorFunction%"===e)r=u("function* () {}");else if("%AsyncGeneratorFunction%"===e)r=u("async function* () {}");else if("%AsyncGenerator%"===e){var n=t("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if("%AsyncIteratorPrototype%"===e){var o=t("%AsyncGenerator%");o&&(r=s(o.prototype))}return d[e]=r,r}(o)),void 0===a&&!e)throw new i("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:r,name:o,value:a}}throw new n("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!=typeof t||0===t.length)throw new i("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new i('"allowMissing" argument must be a boolean');if(null===E(/^%?[^%]*%?$/,t))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=j(t),o=r.length>0?r[0]:"",u=A("%"+o+"%",e),c=u.name,l=u.value,f=!1,s=u.alias;s&&(o=s[0],D(r,m([0,1],s)));for(var p=1,v=!0;p=r.length){var w=a(l,h);l=(v=!!w)&&"get"in w&&!("originalValue"in w.get)?w.get:l[h]}else v=g(l,h),l=l[h];v&&!f&&(d[c]=l)}}return l}},470:function(t,e,r){"use strict";var n=r(509);t.exports=Function.prototype.bind||n},471:function(t,e,r){"use strict";var n=String.prototype.replace,o=/%20/g,i="RFC1738",u="RFC3986";t.exports={default:u,formatters:{RFC1738:function(t){return n.call(t,o,"+")},RFC3986:function(t){return String(t)}},RFC1738:i,RFC3986:u}},474:function(t,e,r){"use strict";var n=r(0),o=r.n(n),i=r(430),u=r(423),a=r.n(u);e.a=function(t){var e=t.count,r=t.label,n=t.permalink,u=t.style,c=t.value,l=t.valueOnly;return o.a.createElement(i.a,{to:n+"/",className:a()("badge","badge--rounded","badge--"+u)},l?c:r,e&&o.a.createElement(o.a.Fragment,null," (",e,")"))}},475:function(t,e,r){var n=r(476);t.exports=a;var o=Object.hasOwnProperty,i=/\s/g,u=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(t,e){return"string"!=typeof t?"":(e||(t=t.toLowerCase()),t.trim().replace(u,"").replace(n(),"").replace(i,"-"))}a.prototype.slug=function(t,e){for(var r=c(t,!0===e),n=r;o.call(this.occurrences,r);)this.occurrences[n]++,r=n+"-"+this.occurrences[n];return this.occurrences[r]=0,r},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},476:function(t,e){t.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},478:function(t,e,r){"use strict";var n=r(471),o=Object.prototype.hasOwnProperty,i=Array.isArray,u=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),a=function(t,e){for(var r=e&&e.plainObjects?Object.create(null):{},n=0;n1;){var e=t.pop(),r=e.obj[e.prop];if(i(r)){for(var n=[],o=0;o=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||i===n.RFC1738&&(40===f||41===f)?c+=a.charAt(l):f<128?c+=u[f]:f<2048?c+=u[192|f>>6]+u[128|63&f]:f<55296||f>=57344?c+=u[224|f>>12]+u[128|f>>6&63]+u[128|63&f]:(l+=1,f=65536+((1023&f)<<10|1023&a.charCodeAt(l)),c+=u[240|f>>18]+u[128|f>>12&63]+u[128|f>>6&63]+u[128|63&f])}return c},isBuffer:function(t){return!(!t||"object"!=typeof t)&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},maybeMap:function(t,e){if(i(t)){for(var r=[],n=0;n0?j.join(",")||null:void 0}];else if(c(v))I=v;else{var B=Object.keys(j);I=y?B.sort(y):B}for(var L=u&&c(j)&&1===j.length?r+"[]":r,T=0;T0?b+_:""}},506:function(t,e,r){"use strict";var n=r(469),o=r(511),i=r(513),u=n("%TypeError%"),a=n("%WeakMap%",!0),c=n("%Map%",!0),l=o("WeakMap.prototype.get",!0),f=o("WeakMap.prototype.set",!0),s=o("WeakMap.prototype.has",!0),p=o("Map.prototype.get",!0),v=o("Map.prototype.set",!0),d=o("Map.prototype.has",!0),h=function(t,e){for(var r,n=t;null!==(r=n.next);n=r)if(r.key===e)return n.next=r.next,r.next=t.next,t.next=r,r};t.exports=function(){var t,e,r,n={assert:function(t){if(!n.has(t))throw new u("Side channel does not contain "+i(t))},get:function(n){if(a&&n&&("object"==typeof n||"function"==typeof n)){if(t)return l(t,n)}else if(c){if(e)return p(e,n)}else if(r)return function(t,e){var r=h(t,e);return r&&r.value}(r,n)},has:function(n){if(a&&n&&("object"==typeof n||"function"==typeof n)){if(t)return s(t,n)}else if(c){if(e)return d(e,n)}else if(r)return function(t,e){return!!h(t,e)}(r,n);return!1},set:function(n,o){a&&n&&("object"==typeof n||"function"==typeof n)?(t||(t=new a),f(t,n,o)):c?(e||(e=new c),v(e,n,o)):(r||(r={key:{},next:null}),function(t,e,r){var n=h(t,e);n?n.value=r:t.next={key:e,next:t.next,value:r}}(r,n,o))}};return n}},507:function(t,e,r){"use strict";var n="undefined"!=typeof Symbol&&Symbol,o=r(508);t.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},508:function(t,e,r){"use strict";t.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),r=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(e in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var n=Object.getOwnPropertySymbols(t);if(1!==n.length||n[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(t,e);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},509:function(t,e,r){"use strict";var n="Function.prototype.bind called on incompatible ",o=Array.prototype.slice,i=Object.prototype.toString;t.exports=function(t){var e=this;if("function"!=typeof e||"[object Function]"!==i.call(e))throw new TypeError(n+e);for(var r,u=o.call(arguments,1),a=function(){if(this instanceof r){var n=e.apply(this,u.concat(o.call(arguments)));return Object(n)===n?n:this}return e.apply(t,u.concat(o.call(arguments)))},c=Math.max(0,e.length-u.length),l=[],f=0;f-1?o(r):r}},512:function(t,e,r){"use strict";var n=r(470),o=r(469),i=o("%Function.prototype.apply%"),u=o("%Function.prototype.call%"),a=o("%Reflect.apply%",!0)||n.call(u,i),c=o("%Object.getOwnPropertyDescriptor%",!0),l=o("%Object.defineProperty%",!0),f=o("%Math.max%");if(l)try{l({},"a",{value:1})}catch(p){l=null}t.exports=function(t){var e=a(n,u,arguments);if(c&&l){var r=c(e,"length");r.configurable&&l(e,"length",{value:1+f(0,t.length-(arguments.length-1))})}return e};var s=function(){return a(n,i,arguments)};l?l(t.exports,"apply",{value:s}):t.exports.apply=s},513:function(t,e,r){var n="function"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=n&&o&&"function"==typeof o.get?o.get:null,u=n&&Map.prototype.forEach,a="function"==typeof Set&&Set.prototype,c=Object.getOwnPropertyDescriptor&&a?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,l=a&&c&&"function"==typeof c.get?c.get:null,f=a&&Set.prototype.forEach,s="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,p="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,v="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,d=Boolean.prototype.valueOf,h=Object.prototype.toString,y=Function.prototype.toString,g=String.prototype.match,m=String.prototype.slice,D=String.prototype.replace,_=String.prototype.toUpperCase,b=String.prototype.toLowerCase,E=RegExp.prototype.test,w=Array.prototype.concat,F=Array.prototype.join,j=Array.prototype.slice,A=Math.floor,x="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,k="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===k||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,P=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function I(t,e){if(t===1/0||t===-1/0||t!=t||t&&t>-1e3&&t<1e3||E.call(/e/,e))return e;var r=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof t){var n=t<0?-A(-t):A(t);if(n!==t){var o=String(n),i=m.call(e,o.length+1);return D.call(o,r,"$&_")+"."+D.call(D.call(i,/([0-9]{3})/g,"$&_"),/_$/,"")}}return D.call(e,r,"$&_")}var R=r(514),B=R.custom,L=z(B)?B:null;function T(t,e,r){var n="double"===(r.quoteStyle||e)?'"':"'";return n+t+n}function M(t){return D.call(String(t),/"/g,""")}function W(t){return!("[object Array]"!==G(t)||C&&"object"==typeof t&&C in t)}function U(t){return!("[object RegExp]"!==G(t)||C&&"object"==typeof t&&C in t)}function z(t){if(k)return t&&"object"==typeof t&&t instanceof Symbol;if("symbol"==typeof t)return!0;if(!t||"object"!=typeof t||!S)return!1;try{return S.call(t),!0}catch(e){}return!1}t.exports=function t(e,r,n,o){var a=r||{};if(q(a,"quoteStyle")&&"single"!==a.quoteStyle&&"double"!==a.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(q(a,"maxStringLength")&&("number"==typeof a.maxStringLength?a.maxStringLength<0&&a.maxStringLength!==1/0:null!==a.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var c=!q(a,"customInspect")||a.customInspect;if("boolean"!=typeof c&&"symbol"!==c)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(q(a,"indent")&&null!==a.indent&&"\t"!==a.indent&&!(parseInt(a.indent,10)===a.indent&&a.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(q(a,"numericSeparator")&&"boolean"!=typeof a.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=a.numericSeparator;if(void 0===e)return"undefined";if(null===e)return"null";if("boolean"==typeof e)return e?"true":"false";if("string"==typeof e)return function t(e,r){if(e.length>r.maxStringLength){var n=e.length-r.maxStringLength,o="... "+n+" more character"+(n>1?"s":"");return t(m.call(e,0,r.maxStringLength),r)+o}return T(D.call(D.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,H),"single",r)}(e,a);if("number"==typeof e){if(0===e)return 1/0/e>0?"0":"-0";var _=String(e);return h?I(e,_):_}if("bigint"==typeof e){var E=String(e)+"n";return h?I(e,E):E}var A=void 0===a.depth?5:a.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof e)return W(e)?"[Array]":"[Object]";var O=function(t,e){var r;if("\t"===t.indent)r="\t";else{if(!("number"==typeof t.indent&&t.indent>0))return null;r=F.call(Array(t.indent+1)," ")}return{base:r,prev:F.call(Array(e+1),r)}}(a,n);if(void 0===o)o=[];else if(V(o,e)>=0)return"[Circular]";function B(e,r,i){if(r&&(o=j.call(o)).push(r),i){var u={depth:a.depth};return q(a,"quoteStyle")&&(u.quoteStyle=a.quoteStyle),t(e,u,n+1,o)}return t(e,a,n+1,o)}if("function"==typeof e&&!U(e)){var $=function(t){if(t.name)return t.name;var e=g.call(y.call(t),/^function\s*([\w$]+)/);if(e)return e[1];return null}(e),X=Y(e,B);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+F.call(X,", ")+" }":"")}if(z(e)){var tt=k?D.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):S.call(e);return"object"!=typeof e||k?tt:Q(tt)}if(function(t){if(!t||"object"!=typeof t)return!1;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return!0;return"string"==typeof t.nodeName&&"function"==typeof t.getAttribute}(e)){for(var et="<"+b.call(String(e.nodeName)),rt=e.attributes||[],nt=0;nt"}if(W(e)){if(0===e.length)return"[]";var ot=Y(e,B);return O&&!function(t){for(var e=0;e=0)return!1;return!0}(ot)?"["+K(ot,O)+"]":"[ "+F.call(ot,", ")+" ]"}if(function(t){return!("[object Error]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)){var it=Y(e,B);return"cause"in Error.prototype||!("cause"in e)||N.call(e,"cause")?0===it.length?"["+String(e)+"]":"{ ["+String(e)+"] "+F.call(it,", ")+" }":"{ ["+String(e)+"] "+F.call(w.call("[cause]: "+B(e.cause),it),", ")+" }"}if("object"==typeof e&&c){if(L&&"function"==typeof e[L]&&R)return R(e,{depth:A-n});if("symbol"!==c&&"function"==typeof e.inspect)return e.inspect()}if(function(t){if(!i||!t||"object"!=typeof t)return!1;try{i.call(t);try{l.call(t)}catch(et){return!0}return t instanceof Map}catch(e){}return!1}(e)){var ut=[];return u.call(e,(function(t,r){ut.push(B(r,e,!0)+" => "+B(t,e))})),Z("Map",i.call(e),ut,O)}if(function(t){if(!l||!t||"object"!=typeof t)return!1;try{l.call(t);try{i.call(t)}catch(e){return!0}return t instanceof Set}catch(r){}return!1}(e)){var at=[];return f.call(e,(function(t){at.push(B(t,e))})),Z("Set",l.call(e),at,O)}if(function(t){if(!s||!t||"object"!=typeof t)return!1;try{s.call(t,s);try{p.call(t,p)}catch(et){return!0}return t instanceof WeakMap}catch(e){}return!1}(e))return J("WeakMap");if(function(t){if(!p||!t||"object"!=typeof t)return!1;try{p.call(t,p);try{s.call(t,s)}catch(et){return!0}return t instanceof WeakSet}catch(e){}return!1}(e))return J("WeakSet");if(function(t){if(!v||!t||"object"!=typeof t)return!1;try{return v.call(t),!0}catch(e){}return!1}(e))return J("WeakRef");if(function(t){return!("[object Number]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(Number(e)));if(function(t){if(!t||"object"!=typeof t||!x)return!1;try{return x.call(t),!0}catch(e){}return!1}(e))return Q(B(x.call(e)));if(function(t){return!("[object Boolean]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(d.call(e));if(function(t){return!("[object String]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(String(e)));if(!function(t){return!("[object Date]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)&&!U(e)){var ct=Y(e,B),lt=P?P(e)===Object.prototype:e instanceof Object||e.constructor===Object,ft=e instanceof Object?"":"null prototype",st=!lt&&C&&Object(e)===e&&C in e?m.call(G(e),8,-1):ft?"Object":"",pt=(lt||"function"!=typeof e.constructor?"":e.constructor.name?e.constructor.name+" ":"")+(st||ft?"["+F.call(w.call([],st||[],ft||[]),": ")+"] ":"");return 0===ct.length?pt+"{}":O?pt+"{"+K(ct,O)+"}":pt+"{ "+F.call(ct,", ")+" }"}return String(e)};var $=Object.prototype.hasOwnProperty||function(t){return t in this};function q(t,e){return $.call(t,e)}function G(t){return h.call(t)}function V(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0,n=t.length;r-1?t.split(","):t},l=function(t,e,r,n){if(t){var i=r.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,u=/(\[[^[\]]*])/g,a=r.depth>0&&/(\[[^[\]]*])/.exec(i),l=a?i.slice(0,a.index):i,f=[];if(l){if(!r.plainObjects&&o.call(Object.prototype,l)&&!r.allowPrototypes)return;f.push(l)}for(var s=0;r.depth>0&&null!==(a=u.exec(i))&&s=0;--i){var u,a=t[i];if("[]"===a&&r.parseArrays)u=[].concat(o);else{u=r.plainObjects?Object.create(null):{};var l="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,f=parseInt(l,10);r.parseArrays||""!==l?!isNaN(f)&&a!==l&&String(f)===l&&f>=0&&r.parseArrays&&f<=r.arrayLimit?(u=[])[f]=o:"__proto__"!==l&&(u[l]=o):u={0:o}}o=u}return o}(f,e,r,n)}};t.exports=function(t,e){var r=function(t){if(!t)return u;if(null!==t.decoder&&void 0!==t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var e=void 0===t.charset?u.charset:t.charset;return{allowDots:void 0===t.allowDots?u.allowDots:!!t.allowDots,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:u.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:u.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:u.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:u.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:u.comma,decoder:"function"==typeof t.decoder?t.decoder:u.decoder,delimiter:"string"==typeof t.delimiter||n.isRegExp(t.delimiter)?t.delimiter:u.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:u.depth,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:u.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:u.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:u.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:u.strictNullHandling}}(e);if(""===t||null==t)return r.plainObjects?Object.create(null):{};for(var f="string"==typeof t?function(t,e){var r,l={},f=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,s=e.parameterLimit===1/0?void 0:e.parameterLimit,p=f.split(e.delimiter,s),v=-1,d=e.charset;if(e.charsetSentinel)for(r=0;r-1&&(y=i(y)?[y]:y),o.call(l,h)?l[h]=n.combine(l[h],y):l[h]=y}return l}(t,r):t,s=r.plainObjects?Object.create(null):{},p=Object.keys(f),v=0;v1?arguments[1]:void 0)}}),r(74)("find")},442:function(t,e,r){"use strict";var n=r(8),o=r(486),i=r(55);r(56)("search",1,(function(t,e,r,u){return[function(r){var n=t(this),o=null==r?void 0:r[e];return void 0!==o?o.call(r,n):new RegExp(r)[e](String(n))},function(t){var e=u(r,t,this);if(e.done)return e.value;var a=n(t),c=String(this),l=a.lastIndex;o(l,0)||(a.lastIndex=0);var f=i(a,c);return o(a.lastIndex,l)||(a.lastIndex=l),null===f?-1:f.index}]}))},445:function(t,e,r){"use strict";r(457);var n=r(0),o=r.n(n),i=r(458),u=r(444),a=r(1),c=(r(448),r(449),r(459),r(430)),l=r(460),f=r(440),s=r.n(f),p=r(461),v=r.n(p),d=r(436),h=r(423),y=r.n(h),g=r(135),m=r.n(g),D=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.moon)})},_=function(){return o.a.createElement("span",{className:y()(m.a.toggle,m.a.sun)})},b=function(t){var e=Object(d.a)().isClient;return o.a.createElement(v.a,Object(a.a)({disabled:!e,icons:{checked:o.a.createElement(D,null),unchecked:o.a.createElement(_,null)}},t))};function E(){var t=Object(d.a)().siteConfig,e=(void 0===t?{}:t).customFields.metadata.latest_post,r=Date.parse(e.date),n=new Date,o=Math.abs(n-r),i=Math.ceil(o/864e5),u=null;return"undefined"!=typeof window&&(u=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!u||u0&&o.a.createElement("div",{className:"row footer__links"},o.a.createElement("div",{className:"col col--5 footer__col"},o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement(s.a,{className:"navbar__logo",src:v,alt:"Qovery",width:"150",height:"auto"})),o.a.createElement("div",{className:"margin-bottom--md"},o.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),o.a.createElement("div",null,o.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},o.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},o.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},o.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",o.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},o.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(t,e){return o.a.createElement("div",{key:e,className:"col footer__col"},null!=t.title?o.a.createElement("h4",{className:"footer__title"},t.title):null,null!=t.items&&Array.isArray(t.items)&&t.items.length>0?o.a.createElement("ul",{className:"footer__items"},t.items.map((function(t,e){return t.html?o.a.createElement("li",{key:e,className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):o.a.createElement("li",{key:t.href||t.to,className:"footer__item"},o.a.createElement(B,t))}))):null)}))),(f||u)&&o.a.createElement("div",{className:"text--center"},f&&f.src&&o.a.createElement("div",{className:"margin-bottom--sm"},f.href?o.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:R.a.footerLogoLink},o.a.createElement(L,{alt:f.alt,url:p})):o.a.createElement(L,{alt:f.alt,url:p})),o.a.createElement("small",null,u),o.a.createElement("br",null))))},M=r(462),W=r(463),U=r(3);r(138);e.a=function(t){var e=Object(d.a)().siteConfig,r=void 0===e?{}:e,n=r.favicon,a=(r.tagline,r.title),c=r.themeConfig.image,l=r.url,f=t.children,s=t.title,p=t.noFooter,v=t.description,h=t.image,y=t.keywords,g=(t.permalink,t.version),m=s?s+" | "+a:a,D=h||c,_=l+Object(F.a)(D),b=Object(F.a)(n),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return o.a.createElement(W.a,null,o.a.createElement(M.a,null,o.a.createElement(u.a,null,o.a.createElement("html",{lang:"en"}),o.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),m&&o.a.createElement("title",null,m),m&&o.a.createElement("meta",{property:"og:title",content:m}),n&&o.a.createElement("link",{rel:"shortcut icon",href:b}),v&&o.a.createElement("meta",{name:"description",content:v}),v&&o.a.createElement("meta",{property:"og:description",content:v}),g&&o.a.createElement("meta",{name:"docsearch:version",content:g}),y&&y.length&&o.a.createElement("meta",{name:"keywords",content:y.join(",")}),D&&o.a.createElement("meta",{property:"og:image",content:_}),D&&o.a.createElement("meta",{property:"twitter:image",content:_}),D&&o.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+m}),w&&o.a.createElement("meta",{property:"og:url",content:w}),o.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&o.a.createElement("link",{rel:"canonical",href:w})),o.a.createElement(i.a,null),o.a.createElement(N,null),o.a.createElement("div",{className:"main-wrapper"},f),!p&&o.a.createElement(T,null)))}},450:function(t,e,r){"use strict";var n=r(9),o=r(0),i=r.n(o),u=r(423),a=r.n(u),c=r(436),l=(r(139),r(140)),f=r.n(l);e.a=function(t){return function(e){var r,o=e.id,u=Object(n.a)(e,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,p=(s=void 0===s?{}:s).navbar,v=(p=void 0===p?{}:p).hideOnScroll,d=void 0!==v&&v;return o?i.a.createElement(t,u,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(r={},r[f.a.enhancedAnchor]=!d,r)),id:o}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+o,title:"Direct link to heading"},"#"),u.children):i.a.createElement(t,u)}}},451:function(t,e,r){(function(t,n){var o;(function(){var i="Expected a function",u="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",p="[object Error]",v="[object Function]",d="[object GeneratorFunction]",h="[object Map]",y="[object Number]",g="[object Object]",m="[object RegExp]",D="[object Set]",_="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",j="[object Float32Array]",A="[object Float64Array]",x="[object Int8Array]",O="[object Int16Array]",S="[object Int32Array]",k="[object Uint8Array]",C="[object Uint16Array]",N="[object Uint32Array]",P=/\b__p \+= '';/g,I=/\b(__p \+=) '' \+/g,R=/(__e\(.*?\)|\b__t\)) \+\n'';/g,B=/&(?:amp|lt|gt|quot|#39);/g,L=/[&<>"']/g,T=RegExp(B.source),M=RegExp(L.source),W=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,z=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,H=RegExp(V.source),Q=/^\s+|\s+$/g,J=/^\s+/,Z=/\s+$/,K=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,tt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,et=/\\(\\)?/g,rt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,nt=/\w*$/,ot=/^[-+]0x[0-9a-f]+$/i,it=/^0b[01]+$/i,ut=/^\[object .+?Constructor\]$/,at=/^0o[0-7]+$/i,ct=/^(?:0|[1-9]\d*)$/,lt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ft=/($^)/,st=/['\n\r\u2028\u2029\\]/g,pt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",dt="[\\ud800-\\udfff]",ht="["+vt+"]",yt="["+pt+"]",gt="\\d+",mt="[\\u2700-\\u27bf]",Dt="[a-z\\xdf-\\xf6\\xf8-\\xff]",_t="[^\\ud800-\\udfff"+vt+gt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",bt="\\ud83c[\\udffb-\\udfff]",Et="[^\\ud800-\\udfff]",wt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ft="[\\ud800-\\udbff][\\udc00-\\udfff]",jt="[A-Z\\xc0-\\xd6\\xd8-\\xde]",At="(?:"+Dt+"|"+_t+")",xt="(?:"+jt+"|"+_t+")",Ot="(?:"+yt+"|"+bt+")"+"?",St="[\\ufe0e\\ufe0f]?"+Ot+("(?:\\u200d(?:"+[Et,wt,Ft].join("|")+")[\\ufe0e\\ufe0f]?"+Ot+")*"),kt="(?:"+[mt,wt,Ft].join("|")+")"+St,Ct="(?:"+[Et+yt+"?",yt,wt,Ft,dt].join("|")+")",Nt=RegExp("['\u2019]","g"),Pt=RegExp(yt,"g"),It=RegExp(bt+"(?="+bt+")|"+Ct+St,"g"),Rt=RegExp([jt+"?"+Dt+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[ht,jt,"$"].join("|")+")",xt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[ht,jt+At,"$"].join("|")+")",jt+"?"+At+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",jt+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",gt,kt].join("|"),"g"),Bt=RegExp("[\\u200d\\ud800-\\udfff"+pt+"\\ufe0e\\ufe0f]"),Lt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Tt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mt=-1,Wt={};Wt[j]=Wt[A]=Wt[x]=Wt[O]=Wt[S]=Wt[k]=Wt["[object Uint8ClampedArray]"]=Wt[C]=Wt[N]=!0,Wt[c]=Wt[l]=Wt[w]=Wt[f]=Wt[F]=Wt[s]=Wt[p]=Wt[v]=Wt[h]=Wt[y]=Wt[g]=Wt[m]=Wt[D]=Wt[_]=Wt[E]=!1;var Ut={};Ut[c]=Ut[l]=Ut[w]=Ut[F]=Ut[f]=Ut[s]=Ut[j]=Ut[A]=Ut[x]=Ut[O]=Ut[S]=Ut[h]=Ut[y]=Ut[g]=Ut[m]=Ut[D]=Ut[_]=Ut[b]=Ut[k]=Ut["[object Uint8ClampedArray]"]=Ut[C]=Ut[N]=!0,Ut[p]=Ut[v]=Ut[E]=!1;var zt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},$t=parseFloat,qt=parseInt,Gt="object"==typeof t&&t&&t.Object===Object&&t,Vt="object"==typeof self&&self&&self.Object===Object&&self,Ht=Gt||Vt||Function("return this")(),Qt=e&&!e.nodeType&&e,Jt=Qt&&"object"==typeof n&&n&&!n.nodeType&&n,Zt=Jt&&Jt.exports===Qt,Kt=Zt&&Gt.process,Yt=function(){try{var t=Jt&&Jt.require&&Jt.require("util").types;return t||Kt&&Kt.binding&&Kt.binding("util")}catch(e){}}(),Xt=Yt&&Yt.isArrayBuffer,te=Yt&&Yt.isDate,ee=Yt&&Yt.isMap,re=Yt&&Yt.isRegExp,ne=Yt&&Yt.isSet,oe=Yt&&Yt.isTypedArray;function ie(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}function ue(t,e,r,n){for(var o=-1,i=null==t?0:t.length;++o-1}function pe(t,e,r){for(var n=-1,o=null==t?0:t.length;++n-1;);return r}function Ie(t,e){for(var r=t.length;r--&&be(e,t[r],0)>-1;);return r}function Re(t,e){for(var r=t.length,n=0;r--;)t[r]===e&&++n;return n}var Be=Ae({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Le=Ae({"&":"&","<":"<",">":">",'"':""","'":"'"});function Te(t){return"\\"+zt[t]}function Me(t){return Bt.test(t)}function We(t){var e=-1,r=Array(t.size);return t.forEach((function(t,n){r[++e]=[n,t]})),r}function Ue(t,e){return function(r){return t(e(r))}}function ze(t,e){for(var r=-1,n=t.length,o=0,i=[];++r",""":'"',"'":"'"});var Qe=function t(e){var r,n=(e=null==e?Ht:Qe.defaults(Ht.Object(),e,Qe.pick(Ht,Tt))).Array,o=e.Date,pt=e.Error,vt=e.Function,dt=e.Math,ht=e.Object,yt=e.RegExp,gt=e.String,mt=e.TypeError,Dt=n.prototype,_t=vt.prototype,bt=ht.prototype,Et=e["__core-js_shared__"],wt=_t.toString,Ft=bt.hasOwnProperty,jt=0,At=(r=/[^.]+$/.exec(Et&&Et.keys&&Et.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",xt=bt.toString,Ot=wt.call(ht),St=Ht._,kt=yt("^"+wt.call(Ft).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ct=Zt?e.Buffer:void 0,It=e.Symbol,Bt=e.Uint8Array,zt=Ct?Ct.allocUnsafe:void 0,Gt=Ue(ht.getPrototypeOf,ht),Vt=ht.create,Qt=bt.propertyIsEnumerable,Jt=Dt.splice,Kt=It?It.isConcatSpreadable:void 0,Yt=It?It.iterator:void 0,me=It?It.toStringTag:void 0,Ae=function(){try{var t=ti(ht,"defineProperty");return t({},"",{}),t}catch(e){}}(),Je=e.clearTimeout!==Ht.clearTimeout&&e.clearTimeout,Ze=o&&o.now!==Ht.Date.now&&o.now,Ke=e.setTimeout!==Ht.setTimeout&&e.setTimeout,Ye=dt.ceil,Xe=dt.floor,tr=ht.getOwnPropertySymbols,er=Ct?Ct.isBuffer:void 0,rr=e.isFinite,nr=Dt.join,or=Ue(ht.keys,ht),ir=dt.max,ur=dt.min,ar=o.now,cr=e.parseInt,lr=dt.random,fr=Dt.reverse,sr=ti(e,"DataView"),pr=ti(e,"Map"),vr=ti(e,"Promise"),dr=ti(e,"Set"),hr=ti(e,"WeakMap"),yr=ti(ht,"create"),gr=hr&&new hr,mr={},Dr=xi(sr),_r=xi(pr),br=xi(vr),Er=xi(dr),wr=xi(hr),Fr=It?It.prototype:void 0,jr=Fr?Fr.valueOf:void 0,Ar=Fr?Fr.toString:void 0;function xr(t){if(qu(t)&&!Pu(t)&&!(t instanceof Cr)){if(t instanceof kr)return t;if(Ft.call(t,"__wrapped__"))return Oi(t)}return new kr(t)}var Or=function(){function t(){}return function(e){if(!$u(e))return{};if(Vt)return Vt(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();function Sr(){}function kr(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}function Cr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Nr(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function Jr(t,e,r,n,o,i){var u,a=1&e,l=2&e,p=4&e;if(r&&(u=o?r(t,n,o,i):r(t)),void 0!==u)return u;if(!$u(t))return t;var E=Pu(t);if(E){if(u=function(t){var e=t.length,r=new t.constructor(e);e&&"string"==typeof t[0]&&Ft.call(t,"index")&&(r.index=t.index,r.input=t.input);return r}(t),!a)return mo(t,u)}else{var P=ni(t),I=P==v||P==d;if(Lu(t))return so(t,a);if(P==g||P==c||I&&!o){if(u=l||I?{}:ii(t),!a)return l?function(t,e){return Do(t,ri(t),e)}(t,function(t,e){return t&&Do(e,ba(e),t)}(u,t)):function(t,e){return Do(t,ei(t),e)}(t,Gr(u,t))}else{if(!Ut[P])return o?t:{};u=function(t,e,r){var n=t.constructor;switch(e){case w:return po(t);case f:case s:return new n(+t);case F:return function(t,e){var r=e?po(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}(t,r);case j:case A:case x:case O:case S:case k:case"[object Uint8ClampedArray]":case C:case N:return vo(t,r);case h:return new n;case y:case _:return new n(t);case m:return function(t){var e=new t.constructor(t.source,nt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case D:return new n;case b:return o=t,jr?ht(jr.call(o)):{}}var o}(t,P,a)}}i||(i=new Br);var R=i.get(t);if(R)return R;i.set(t,u),Ju(t)?t.forEach((function(n){u.add(Jr(n,e,r,n,t,i))})):Gu(t)&&t.forEach((function(n,o){u.set(o,Jr(n,e,r,o,t,i))}));var B=E?void 0:(p?l?Ho:Vo:l?ba:_a)(t);return ae(B||t,(function(n,o){B&&(n=t[o=n]),zr(u,o,Jr(n,e,r,o,t,i))})),u}function Zr(t,e,r){var n=r.length;if(null==t)return!n;for(t=ht(t);n--;){var o=r[n],i=e[o],u=t[o];if(void 0===u&&!(o in t)||!i(u))return!1}return!0}function Kr(t,e,r){if("function"!=typeof t)throw new mt(i);return _i((function(){t.apply(void 0,r)}),e)}function Yr(t,e,r,n){var o=-1,i=se,u=!0,a=t.length,c=[],l=e.length;if(!a)return c;r&&(e=ve(e,ke(r))),n?(i=pe,u=!1):e.length>=200&&(i=Ne,u=!1,e=new Rr(e));t:for(;++o-1},Pr.prototype.set=function(t,e){var r=this.__data__,n=$r(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this},Ir.prototype.clear=function(){this.size=0,this.__data__={hash:new Nr,map:new(pr||Pr),string:new Nr}},Ir.prototype.delete=function(t){var e=Yo(this,t).delete(t);return this.size-=e?1:0,e},Ir.prototype.get=function(t){return Yo(this,t).get(t)},Ir.prototype.has=function(t){return Yo(this,t).has(t)},Ir.prototype.set=function(t,e){var r=Yo(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this},Rr.prototype.add=Rr.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Rr.prototype.has=function(t){return this.__data__.has(t)},Br.prototype.clear=function(){this.__data__=new Pr,this.size=0},Br.prototype.delete=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r},Br.prototype.get=function(t){return this.__data__.get(t)},Br.prototype.has=function(t){return this.__data__.has(t)},Br.prototype.set=function(t,e){var r=this.__data__;if(r instanceof Pr){var n=r.__data__;if(!pr||n.length<199)return n.push([t,e]),this.size=++r.size,this;r=this.__data__=new Ir(n)}return r.set(t,e),this.size=r.size,this};var Xr=Eo(cn),tn=Eo(ln,!0);function en(t,e){var r=!0;return Xr(t,(function(t,n,o){return r=!!e(t,n,o)})),r}function rn(t,e,r){for(var n=-1,o=t.length;++n0&&r(a)?e>1?on(a,e-1,r,n,o):de(o,a):n||(o[o.length]=a)}return o}var un=wo(),an=wo(!0);function cn(t,e){return t&&un(t,e,_a)}function ln(t,e){return t&&an(t,e,_a)}function fn(t,e){return fe(e,(function(e){return Wu(t[e])}))}function sn(t,e){for(var r=0,n=(e=ao(e,t)).length;null!=t&&re}function hn(t,e){return null!=t&&Ft.call(t,e)}function yn(t,e){return null!=t&&e in ht(t)}function gn(t,e,r){for(var o=r?pe:se,i=t[0].length,u=t.length,a=u,c=n(u),l=1/0,f=[];a--;){var s=t[a];a&&e&&(s=ve(s,ke(e))),l=ur(s.length,l),c[a]=!r&&(e||i>=120&&s.length>=120)?new Rr(a&&s):void 0}s=t[0];var p=-1,v=c[0];t:for(;++p=a)return c;var l=r[n];return c*("desc"==l?-1:1)}}return t.index-e.index}(t,e,r)}))}function Pn(t,e,r){for(var n=-1,o=e.length,i={};++n-1;)a!==t&&Jt.call(a,c,1),Jt.call(t,c,1);return t}function Rn(t,e){for(var r=t?e.length:0,n=r-1;r--;){var o=e[r];if(r==n||o!==i){var i=o;ai(o)?Jt.call(t,o,1):Xn(t,o)}}return t}function Bn(t,e){return t+Xe(lr()*(e-t+1))}function Ln(t,e){var r="";if(!t||e<1||e>9007199254740991)return r;do{e%2&&(r+=t),(e=Xe(e/2))&&(t+=t)}while(e);return r}function Tn(t,e){return bi(hi(t,e,Va),t+"")}function Mn(t){return Tr(Sa(t))}function Wn(t,e){var r=Sa(t);return Fi(r,Qr(e,0,r.length))}function Un(t,e,r,n){if(!$u(t))return t;for(var o=-1,i=(e=ao(e,t)).length,u=i-1,a=t;null!=a&&++oi?0:i+e),(r=r>i?i:r)<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var u=n(i);++o>>1,u=t[i];null!==u&&!Ku(u)&&(r?u<=e:u=200){var l=e?null:To(t);if(l)return $e(l);u=!1,o=Ne,c=new Rr}else c=e?[]:a;t:for(;++n=n?t:Gn(t,e,r)}var fo=Je||function(t){return Ht.clearTimeout(t)};function so(t,e){if(e)return t.slice();var r=t.length,n=zt?zt(r):new t.constructor(r);return t.copy(n),n}function po(t){var e=new t.constructor(t.byteLength);return new Bt(e).set(new Bt(t)),e}function vo(t,e){var r=e?po(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}function ho(t,e){if(t!==e){var r=void 0!==t,n=null===t,o=t==t,i=Ku(t),u=void 0!==e,a=null===e,c=e==e,l=Ku(e);if(!a&&!l&&!i&&t>e||i&&u&&c&&!a&&!l||n&&u&&c||!r&&c||!o)return 1;if(!n&&!i&&!l&&t1?r[o-1]:void 0,u=o>2?r[2]:void 0;for(i=t.length>3&&"function"==typeof i?(o--,i):void 0,u&&ci(r[0],r[1],u)&&(i=o<3?void 0:i,o=1),e=ht(e);++n-1?o[i?e[u]:u]:void 0}}function Oo(t){return Go((function(e){var r=e.length,n=r,o=kr.prototype.thru;for(t&&e.reverse();n--;){var u=e[n];if("function"!=typeof u)throw new mt(i);if(o&&!a&&"wrapper"==Jo(u))var a=new kr([],!0)}for(n=a?n:r;++n1&&D.reverse(),s&&la))return!1;var l=i.get(t);if(l&&i.get(e))return l==e;var f=-1,s=!0,p=2&r?new Rr:void 0;for(i.set(t,e),i.set(e,t);++f-1&&t%1==0&&t1?"& ":"")+e[n],e=e.join(r>2?", ":" "),t.replace(K,"{\n/* [wrapped with "+e+"] */\n")}(n,function(t,e){return ae(a,(function(r){var n="_."+r[0];e&r[1]&&!se(t,n)&&t.push(n)})),t.sort()}(function(t){var e=t.match(Y);return e?e[1].split(X):[]}(n),r)))}function wi(t){var e=0,r=0;return function(){var n=ar(),o=16-(n-r);if(r=n,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}function Fi(t,e){var r=-1,n=t.length,o=n-1;for(e=void 0===e?n:e;++r1?t[e-1]:void 0;return r="function"==typeof r?(t.pop(),r):void 0,Qi(t,r)}));function eu(t){var e=xr(t);return e.__chain__=!0,e}function ru(t,e){return e(t)}var nu=Go((function(t){var e=t.length,r=e?t[0]:0,n=this.__wrapped__,o=function(e){return Hr(e,t)};return!(e>1||this.__actions__.length)&&n instanceof Cr&&ai(r)?((n=n.slice(r,+r+(e?1:0))).__actions__.push({func:ru,args:[o],thisArg:void 0}),new kr(n,this.__chain__).thru((function(t){return e&&!t.length&&t.push(void 0),t}))):this.thru(o)}));var ou=_o((function(t,e,r){Ft.call(t,r)?++t[r]:Vr(t,r,1)}));var iu=xo(Ni),uu=xo(Pi);function au(t,e){return(Pu(t)?ae:Xr)(t,Ko(e,3))}function cu(t,e){return(Pu(t)?ce:tn)(t,Ko(e,3))}var lu=_o((function(t,e,r){Ft.call(t,r)?t[r].push(e):Vr(t,r,[e])}));var fu=Tn((function(t,e,r){var o=-1,i="function"==typeof e,u=Ru(t)?n(t.length):[];return Xr(t,(function(t){u[++o]=i?ie(e,t,r):mn(t,e,r)})),u})),su=_o((function(t,e,r){Vr(t,r,e)}));function pu(t,e){return(Pu(t)?ve:xn)(t,Ko(e,3))}var vu=_o((function(t,e,r){t[r?0:1].push(e)}),(function(){return[[],[]]}));var du=Tn((function(t,e){if(null==t)return[];var r=e.length;return r>1&&ci(t,e[0],e[1])?e=[]:r>2&&ci(e[0],e[1],e[2])&&(e=[e[0]]),Nn(t,on(e,1),[])})),hu=Ze||function(){return Ht.Date.now()};function yu(t,e,r){return e=r?void 0:e,Wo(t,128,void 0,void 0,void 0,void 0,e=t&&null==e?t.length:e)}function gu(t,e){var r;if("function"!=typeof e)throw new mt(i);return t=na(t),function(){return--t>0&&(r=e.apply(this,arguments)),t<=1&&(e=void 0),r}}var mu=Tn((function(t,e,r){var n=1;if(r.length){var o=ze(r,Zo(mu));n|=32}return Wo(t,n,e,r,o)})),Du=Tn((function(t,e,r){var n=3;if(r.length){var o=ze(r,Zo(Du));n|=32}return Wo(e,n,t,r,o)}));function _u(t,e,r){var n,o,u,a,c,l,f=0,s=!1,p=!1,v=!0;if("function"!=typeof t)throw new mt(i);function d(e){var r=n,i=o;return n=o=void 0,f=e,a=t.apply(i,r)}function h(t){return f=t,c=_i(g,e),s?d(t):a}function y(t){var r=t-l;return void 0===l||r>=e||r<0||p&&t-f>=u}function g(){var t=hu();if(y(t))return m(t);c=_i(g,function(t){var r=e-(t-l);return p?ur(r,u-(t-f)):r}(t))}function m(t){return c=void 0,v&&n?d(t):(n=o=void 0,a)}function D(){var t=hu(),r=y(t);if(n=arguments,o=this,l=t,r){if(void 0===c)return h(l);if(p)return fo(c),c=_i(g,e),d(l)}return void 0===c&&(c=_i(g,e)),a}return e=ia(e)||0,$u(r)&&(s=!!r.leading,u=(p="maxWait"in r)?ir(ia(r.maxWait)||0,e):u,v="trailing"in r?!!r.trailing:v),D.cancel=function(){void 0!==c&&fo(c),f=0,n=l=o=c=void 0},D.flush=function(){return void 0===c?a:m(hu())},D}var bu=Tn((function(t,e){return Kr(t,1,e)})),Eu=Tn((function(t,e,r){return Kr(t,ia(e)||0,r)}));function wu(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new mt(i);var r=function(){var n=arguments,o=e?e.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return r.cache=i.set(o,u)||i,u};return r.cache=new(wu.Cache||Ir),r}function Fu(t){if("function"!=typeof t)throw new mt(i);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}wu.Cache=Ir;var ju=co((function(t,e){var r=(e=1==e.length&&Pu(e[0])?ve(e[0],ke(Ko())):ve(on(e,1),ke(Ko()))).length;return Tn((function(n){for(var o=-1,i=ur(n.length,r);++o=e})),Nu=Dn(function(){return arguments}())?Dn:function(t){return qu(t)&&Ft.call(t,"callee")&&!Qt.call(t,"callee")},Pu=n.isArray,Iu=Xt?ke(Xt):function(t){return qu(t)&&vn(t)==w};function Ru(t){return null!=t&&zu(t.length)&&!Wu(t)}function Bu(t){return qu(t)&&Ru(t)}var Lu=er||ic,Tu=te?ke(te):function(t){return qu(t)&&vn(t)==s};function Mu(t){if(!qu(t))return!1;var e=vn(t);return e==p||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!Hu(t)}function Wu(t){if(!$u(t))return!1;var e=vn(t);return e==v||e==d||"[object AsyncFunction]"==e||"[object Proxy]"==e}function Uu(t){return"number"==typeof t&&t==na(t)}function zu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}function $u(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function qu(t){return null!=t&&"object"==typeof t}var Gu=ee?ke(ee):function(t){return qu(t)&&ni(t)==h};function Vu(t){return"number"==typeof t||qu(t)&&vn(t)==y}function Hu(t){if(!qu(t)||vn(t)!=g)return!1;var e=Gt(t);if(null===e)return!0;var r=Ft.call(e,"constructor")&&e.constructor;return"function"==typeof r&&r instanceof r&&wt.call(r)==Ot}var Qu=re?ke(re):function(t){return qu(t)&&vn(t)==m};var Ju=ne?ke(ne):function(t){return qu(t)&&ni(t)==D};function Zu(t){return"string"==typeof t||!Pu(t)&&qu(t)&&vn(t)==_}function Ku(t){return"symbol"==typeof t||qu(t)&&vn(t)==b}var Yu=oe?ke(oe):function(t){return qu(t)&&zu(t.length)&&!!Wt[vn(t)]};var Xu=Ro(An),ta=Ro((function(t,e){return t<=e}));function ea(t){if(!t)return[];if(Ru(t))return Zu(t)?Ve(t):mo(t);if(Yt&&t[Yt])return function(t){for(var e,r=[];!(e=t.next()).done;)r.push(e.value);return r}(t[Yt]());var e=ni(t);return(e==h?We:e==D?$e:Sa)(t)}function ra(t){return t?(t=ia(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function na(t){var e=ra(t),r=e%1;return e==e?r?e-r:e:0}function oa(t){return t?Qr(na(t),0,4294967295):0}function ia(t){if("number"==typeof t)return t;if(Ku(t))return NaN;if($u(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=$u(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Q,"");var r=it.test(t);return r||at.test(t)?qt(t.slice(2),r?2:8):ot.test(t)?NaN:+t}function ua(t){return Do(t,ba(t))}function aa(t){return null==t?"":Kn(t)}var ca=bo((function(t,e){if(pi(e)||Ru(e))Do(e,_a(e),t);else for(var r in e)Ft.call(e,r)&&zr(t,r,e[r])})),la=bo((function(t,e){Do(e,ba(e),t)})),fa=bo((function(t,e,r,n){Do(e,ba(e),t,n)})),sa=bo((function(t,e,r,n){Do(e,_a(e),t,n)})),pa=Go(Hr);var va=Tn((function(t,e){t=ht(t);var r=-1,n=e.length,o=n>2?e[2]:void 0;for(o&&ci(e[0],e[1],o)&&(n=1);++r1),e})),Do(t,Ho(t),r),n&&(r=Jr(r,7,$o));for(var o=e.length;o--;)Xn(r,e[o]);return r}));var ja=Go((function(t,e){return null==t?{}:function(t,e){return Pn(t,e,(function(e,r){return ya(t,r)}))}(t,e)}));function Aa(t,e){if(null==t)return{};var r=ve(Ho(t),(function(t){return[t]}));return e=Ko(e),Pn(t,r,(function(t,r){return e(t,r[0])}))}var xa=Mo(_a),Oa=Mo(ba);function Sa(t){return null==t?[]:Ce(t,_a(t))}var ka=jo((function(t,e,r){return e=e.toLowerCase(),t+(r?Ca(e):e)}));function Ca(t){return Ma(aa(t).toLowerCase())}function Na(t){return(t=aa(t))&&t.replace(lt,Be).replace(Pt,"")}var Pa=jo((function(t,e,r){return t+(r?"-":"")+e.toLowerCase()})),Ia=jo((function(t,e,r){return t+(r?" ":"")+e.toLowerCase()})),Ra=Fo("toLowerCase");var Ba=jo((function(t,e,r){return t+(r?"_":"")+e.toLowerCase()}));var La=jo((function(t,e,r){return t+(r?" ":"")+Ma(e)}));var Ta=jo((function(t,e,r){return t+(r?" ":"")+e.toUpperCase()})),Ma=Fo("toUpperCase");function Wa(t,e,r){return t=aa(t),void 0===(e=r?void 0:e)?function(t){return Lt.test(t)}(t)?function(t){return t.match(Rt)||[]}(t):function(t){return t.match(tt)||[]}(t):t.match(e)||[]}var Ua=Tn((function(t,e){try{return ie(t,void 0,e)}catch(r){return Mu(r)?r:new pt(r)}})),za=Go((function(t,e){return ae(e,(function(e){e=Ai(e),Vr(t,e,mu(t[e],t))})),t}));function $a(t){return function(){return t}}var qa=Oo(),Ga=Oo(!0);function Va(t){return t}function Ha(t){return wn("function"==typeof t?t:Jr(t,1))}var Qa=Tn((function(t,e){return function(r){return mn(r,t,e)}})),Ja=Tn((function(t,e){return function(r){return mn(t,r,e)}}));function Za(t,e,r){var n=_a(e),o=fn(e,n);null!=r||$u(e)&&(o.length||!n.length)||(r=e,e=t,t=this,o=fn(e,_a(e)));var i=!($u(r)&&"chain"in r&&!r.chain),u=Wu(t);return ae(o,(function(r){var n=e[r];t[r]=n,u&&(t.prototype[r]=function(){var e=this.__chain__;if(i||e){var r=t(this.__wrapped__),o=r.__actions__=mo(this.__actions__);return o.push({func:n,args:arguments,thisArg:t}),r.__chain__=e,r}return n.apply(t,de([this.value()],arguments))})})),t}function Ka(){}var Ya=No(ve),Xa=No(le),tc=No(ge);function ec(t){return li(t)?je(Ai(t)):function(t){return function(e){return sn(e,t)}}(t)}var rc=Io(),nc=Io(!0);function oc(){return[]}function ic(){return!1}var uc=Co((function(t,e){return t+e}),0),ac=Lo("ceil"),cc=Co((function(t,e){return t/e}),1),lc=Lo("floor");var fc,sc=Co((function(t,e){return t*e}),1),pc=Lo("round"),vc=Co((function(t,e){return t-e}),0);return xr.after=function(t,e){if("function"!=typeof e)throw new mt(i);return t=na(t),function(){if(--t<1)return e.apply(this,arguments)}},xr.ary=yu,xr.assign=ca,xr.assignIn=la,xr.assignInWith=fa,xr.assignWith=sa,xr.at=pa,xr.before=gu,xr.bind=mu,xr.bindAll=za,xr.bindKey=Du,xr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Pu(t)?t:[t]},xr.chain=eu,xr.chunk=function(t,e,r){e=(r?ci(t,e,r):void 0===e)?1:ir(na(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var i=0,u=0,a=n(Ye(o/e));io?0:o+r),(n=void 0===n||n>o?o:na(n))<0&&(n+=o),n=r>n?0:oa(n);r>>0)?(t=aa(t))&&("string"==typeof e||null!=e&&!Qu(e))&&!(e=Kn(e))&&Me(t)?lo(Ve(t),0,r):t.split(e,r):[]},xr.spread=function(t,e){if("function"!=typeof t)throw new mt(i);return e=null==e?0:ir(na(e),0),Tn((function(r){var n=r[e],o=lo(r,0,e);return n&&de(o,n),ie(t,this,o)}))},xr.tail=function(t){var e=null==t?0:t.length;return e?Gn(t,1,e):[]},xr.take=function(t,e,r){return t&&t.length?Gn(t,0,(e=r||void 0===e?1:na(e))<0?0:e):[]},xr.takeRight=function(t,e,r){var n=null==t?0:t.length;return n?Gn(t,(e=n-(e=r||void 0===e?1:na(e)))<0?0:e,n):[]},xr.takeRightWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3),!1,!0):[]},xr.takeWhile=function(t,e){return t&&t.length?eo(t,Ko(e,3)):[]},xr.tap=function(t,e){return e(t),t},xr.throttle=function(t,e,r){var n=!0,o=!0;if("function"!=typeof t)throw new mt(i);return $u(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),_u(t,e,{leading:n,maxWait:e,trailing:o})},xr.thru=ru,xr.toArray=ea,xr.toPairs=xa,xr.toPairsIn=Oa,xr.toPath=function(t){return Pu(t)?ve(t,Ai):Ku(t)?[t]:mo(ji(aa(t)))},xr.toPlainObject=ua,xr.transform=function(t,e,r){var n=Pu(t),o=n||Lu(t)||Yu(t);if(e=Ko(e,4),null==r){var i=t&&t.constructor;r=o?n?new i:[]:$u(t)&&Wu(i)?Or(Gt(t)):{}}return(o?ae:cn)(t,(function(t,n,o){return e(r,t,n,o)})),r},xr.unary=function(t){return yu(t,1)},xr.union=qi,xr.unionBy=Gi,xr.unionWith=Vi,xr.uniq=function(t){return t&&t.length?Yn(t):[]},xr.uniqBy=function(t,e){return t&&t.length?Yn(t,Ko(e,2)):[]},xr.uniqWith=function(t,e){return e="function"==typeof e?e:void 0,t&&t.length?Yn(t,void 0,e):[]},xr.unset=function(t,e){return null==t||Xn(t,e)},xr.unzip=Hi,xr.unzipWith=Qi,xr.update=function(t,e,r){return null==t?t:to(t,e,uo(r))},xr.updateWith=function(t,e,r,n){return n="function"==typeof n?n:void 0,null==t?t:to(t,e,uo(r),n)},xr.values=Sa,xr.valuesIn=function(t){return null==t?[]:Ce(t,ba(t))},xr.without=Ji,xr.words=Wa,xr.wrap=function(t,e){return Au(uo(e),t)},xr.xor=Zi,xr.xorBy=Ki,xr.xorWith=Yi,xr.zip=Xi,xr.zipObject=function(t,e){return oo(t||[],e||[],zr)},xr.zipObjectDeep=function(t,e){return oo(t||[],e||[],Un)},xr.zipWith=tu,xr.entries=xa,xr.entriesIn=Oa,xr.extend=la,xr.extendWith=fa,Za(xr,xr),xr.add=uc,xr.attempt=Ua,xr.camelCase=ka,xr.capitalize=Ca,xr.ceil=ac,xr.clamp=function(t,e,r){return void 0===r&&(r=e,e=void 0),void 0!==r&&(r=(r=ia(r))==r?r:0),void 0!==e&&(e=(e=ia(e))==e?e:0),Qr(ia(t),e,r)},xr.clone=function(t){return Jr(t,4)},xr.cloneDeep=function(t){return Jr(t,5)},xr.cloneDeepWith=function(t,e){return Jr(t,5,e="function"==typeof e?e:void 0)},xr.cloneWith=function(t,e){return Jr(t,4,e="function"==typeof e?e:void 0)},xr.conformsTo=function(t,e){return null==e||Zr(t,e,_a(e))},xr.deburr=Na,xr.defaultTo=function(t,e){return null==t||t!=t?e:t},xr.divide=cc,xr.endsWith=function(t,e,r){t=aa(t),e=Kn(e);var n=t.length,o=r=void 0===r?n:Qr(na(r),0,n);return(r-=e.length)>=0&&t.slice(r,o)==e},xr.eq=Su,xr.escape=function(t){return(t=aa(t))&&M.test(t)?t.replace(L,Le):t},xr.escapeRegExp=function(t){return(t=aa(t))&&H.test(t)?t.replace(V,"\\$&"):t},xr.every=function(t,e,r){var n=Pu(t)?le:en;return r&&ci(t,e,r)&&(e=void 0),n(t,Ko(e,3))},xr.find=iu,xr.findIndex=Ni,xr.findKey=function(t,e){return De(t,Ko(e,3),cn)},xr.findLast=uu,xr.findLastIndex=Pi,xr.findLastKey=function(t,e){return De(t,Ko(e,3),ln)},xr.floor=lc,xr.forEach=au,xr.forEachRight=cu,xr.forIn=function(t,e){return null==t?t:un(t,Ko(e,3),ba)},xr.forInRight=function(t,e){return null==t?t:an(t,Ko(e,3),ba)},xr.forOwn=function(t,e){return t&&cn(t,Ko(e,3))},xr.forOwnRight=function(t,e){return t&&ln(t,Ko(e,3))},xr.get=ha,xr.gt=ku,xr.gte=Cu,xr.has=function(t,e){return null!=t&&oi(t,e,hn)},xr.hasIn=ya,xr.head=Ri,xr.identity=Va,xr.includes=function(t,e,r,n){t=Ru(t)?t:Sa(t),r=r&&!n?na(r):0;var o=t.length;return r<0&&(r=ir(o+r,0)),Zu(t)?r<=o&&t.indexOf(e,r)>-1:!!o&&be(t,e,r)>-1},xr.indexOf=function(t,e,r){var n=null==t?0:t.length;if(!n)return-1;var o=null==r?0:na(r);return o<0&&(o=ir(n+o,0)),be(t,e,o)},xr.inRange=function(t,e,r){return e=ra(e),void 0===r?(r=e,e=0):r=ra(r),function(t,e,r){return t>=ur(e,r)&&t=-9007199254740991&&t<=9007199254740991},xr.isSet=Ju,xr.isString=Zu,xr.isSymbol=Ku,xr.isTypedArray=Yu,xr.isUndefined=function(t){return void 0===t},xr.isWeakMap=function(t){return qu(t)&&ni(t)==E},xr.isWeakSet=function(t){return qu(t)&&"[object WeakSet]"==vn(t)},xr.join=function(t,e){return null==t?"":nr.call(t,e)},xr.kebabCase=Pa,xr.last=Mi,xr.lastIndexOf=function(t,e,r){var n=null==t?0:t.length;if(!n)return-1;var o=n;return void 0!==r&&(o=(o=na(r))<0?ir(n+o,0):ur(o,n-1)),e==e?function(t,e,r){for(var n=r+1;n--;)if(t[n]===e)return n;return n}(t,e,o):_e(t,we,o,!0)},xr.lowerCase=Ia,xr.lowerFirst=Ra,xr.lt=Xu,xr.lte=ta,xr.max=function(t){return t&&t.length?rn(t,Va,dn):void 0},xr.maxBy=function(t,e){return t&&t.length?rn(t,Ko(e,2),dn):void 0},xr.mean=function(t){return Fe(t,Va)},xr.meanBy=function(t,e){return Fe(t,Ko(e,2))},xr.min=function(t){return t&&t.length?rn(t,Va,An):void 0},xr.minBy=function(t,e){return t&&t.length?rn(t,Ko(e,2),An):void 0},xr.stubArray=oc,xr.stubFalse=ic,xr.stubObject=function(){return{}},xr.stubString=function(){return""},xr.stubTrue=function(){return!0},xr.multiply=sc,xr.nth=function(t,e){return t&&t.length?Cn(t,na(e)):void 0},xr.noConflict=function(){return Ht._===this&&(Ht._=St),this},xr.noop=Ka,xr.now=hu,xr.pad=function(t,e,r){t=aa(t);var n=(e=na(e))?Ge(t):0;if(!e||n>=e)return t;var o=(e-n)/2;return Po(Xe(o),r)+t+Po(Ye(o),r)},xr.padEnd=function(t,e,r){t=aa(t);var n=(e=na(e))?Ge(t):0;return e&&ne){var n=t;t=e,e=n}if(r||t%1||e%1){var o=lr();return ur(t+o*(e-t+$t("1e-"+((o+"").length-1))),e)}return Bn(t,e)},xr.reduce=function(t,e,r){var n=Pu(t)?he:xe,o=arguments.length<3;return n(t,Ko(e,4),r,o,Xr)},xr.reduceRight=function(t,e,r){var n=Pu(t)?ye:xe,o=arguments.length<3;return n(t,Ko(e,4),r,o,tn)},xr.repeat=function(t,e,r){return e=(r?ci(t,e,r):void 0===e)?1:na(e),Ln(aa(t),e)},xr.replace=function(){var t=arguments,e=aa(t[0]);return t.length<3?e:e.replace(t[1],t[2])},xr.result=function(t,e,r){var n=-1,o=(e=ao(e,t)).length;for(o||(o=1,t=void 0);++n9007199254740991)return[];var r=4294967295,n=ur(t,4294967295);t-=4294967295;for(var o=Se(n,e=Ko(e));++r=i)return t;var a=r-Ge(n);if(a<1)return n;var c=u?lo(u,0,a).join(""):t.slice(0,a);if(void 0===o)return c+n;if(u&&(a+=c.length-a),Qu(o)){if(t.slice(a).search(o)){var l,f=c;for(o.global||(o=yt(o.source,aa(nt.exec(o))+"g")),o.lastIndex=0;l=o.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(t.indexOf(Kn(o),a)!=a){var p=c.lastIndexOf(o);p>-1&&(c=c.slice(0,p))}return c+n},xr.unescape=function(t){return(t=aa(t))&&T.test(t)?t.replace(B,He):t},xr.uniqueId=function(t){var e=++jt;return aa(t)+e},xr.upperCase=Ta,xr.upperFirst=Ma,xr.each=au,xr.eachRight=cu,xr.first=Ri,Za(xr,(fc={},cn(xr,(function(t,e){Ft.call(xr.prototype,e)||(fc[e]=t)})),fc),{chain:!1}),xr.VERSION="4.17.15",ae(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){xr[t].placeholder=xr})),ae(["drop","take"],(function(t,e){Cr.prototype[t]=function(r){r=void 0===r?1:ir(na(r),0);var n=this.__filtered__&&!e?new Cr(this):this.clone();return n.__filtered__?n.__takeCount__=ur(r,n.__takeCount__):n.__views__.push({size:ur(r,4294967295),type:t+(n.__dir__<0?"Right":"")}),n},Cr.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),ae(["filter","map","takeWhile"],(function(t,e){var r=e+1,n=1==r||3==r;Cr.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:Ko(t,3),type:r}),e.__filtered__=e.__filtered__||n,e}})),ae(["head","last"],(function(t,e){var r="take"+(e?"Right":"");Cr.prototype[t]=function(){return this[r](1).value()[0]}})),ae(["initial","tail"],(function(t,e){var r="drop"+(e?"":"Right");Cr.prototype[t]=function(){return this.__filtered__?new Cr(this):this[r](1)}})),Cr.prototype.compact=function(){return this.filter(Va)},Cr.prototype.find=function(t){return this.filter(t).head()},Cr.prototype.findLast=function(t){return this.reverse().find(t)},Cr.prototype.invokeMap=Tn((function(t,e){return"function"==typeof t?new Cr(this):this.map((function(r){return mn(r,t,e)}))})),Cr.prototype.reject=function(t){return this.filter(Fu(Ko(t)))},Cr.prototype.slice=function(t,e){t=na(t);var r=this;return r.__filtered__&&(t>0||e<0)?new Cr(r):(t<0?r=r.takeRight(-t):t&&(r=r.drop(t)),void 0!==e&&(r=(e=na(e))<0?r.dropRight(-e):r.take(e-t)),r)},Cr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Cr.prototype.toArray=function(){return this.take(4294967295)},cn(Cr.prototype,(function(t,e){var r=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),o=xr[n?"take"+("last"==e?"Right":""):e],i=n||/^find/.test(e);o&&(xr.prototype[e]=function(){var e=this.__wrapped__,u=n?[1]:arguments,a=e instanceof Cr,c=u[0],l=a||Pu(e),f=function(t){var e=o.apply(xr,de([t],u));return n&&s?e[0]:e};l&&r&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,p=!!this.__actions__.length,v=i&&!s,d=a&&!p;if(!i&&l){e=d?e:new Cr(this);var h=t.apply(e,u);return h.__actions__.push({func:ru,args:[f],thisArg:void 0}),new kr(h,s)}return v&&d?t.apply(this,u):(h=this.thru(f),v?n?h.value()[0]:h.value():h)})})),ae(["pop","push","shift","sort","splice","unshift"],(function(t){var e=Dt[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",n=/^(?:pop|shift)$/.test(t);xr.prototype[t]=function(){var t=arguments;if(n&&!this.__chain__){var o=this.value();return e.apply(Pu(o)?o:[],t)}return this[r]((function(r){return e.apply(Pu(r)?r:[],t)}))}})),cn(Cr.prototype,(function(t,e){var r=xr[e];if(r){var n=r.name+"";Ft.call(mr,n)||(mr[n]=[]),mr[n].push({name:e,func:r})}})),mr[So(void 0,2).name]=[{name:"wrapper",func:void 0}],Cr.prototype.clone=function(){var t=new Cr(this.__wrapped__);return t.__actions__=mo(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=mo(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=mo(this.__views__),t},Cr.prototype.reverse=function(){if(this.__filtered__){var t=new Cr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Cr.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,r=Pu(t),n=e<0,o=r?t.length:0,i=function(t,e,r){var n=-1,o=r.length;for(;++n=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},xr.prototype.plant=function(t){for(var e,r=this;r instanceof Sr;){var n=Oi(r);n.__index__=0,n.__values__=void 0,e?o.__wrapped__=n:e=n;var o=n;r=r.__wrapped__}return o.__wrapped__=t,e},xr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Cr){var e=t;return this.__actions__.length&&(e=new Cr(this)),(e=e.reverse()).__actions__.push({func:ru,args:[$i],thisArg:void 0}),new kr(e,this.__chain__)}return this.thru($i)},xr.prototype.toJSON=xr.prototype.valueOf=xr.prototype.value=function(){return ro(this.__wrapped__,this.__actions__)},xr.prototype.first=xr.prototype.head,Yt&&(xr.prototype[Yt]=function(){return this}),xr}();Ht._=Qe,void 0===(o=function(){return Qe}.call(e,r,e,n))||(n.exports=o)}).call(this)}).call(this,r(76),r(456)(t))},454:function(t,e,r){"use strict";var n=r(0),o=Object(n.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});e.a=o},455:function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));r(77),r(473),r(439),r(78);var n=r(475),o=r.n(n);function i(t,e){var r=new o.a;return t.map((function(t){var n=t;return"string"==typeof t&&(n={label:t,permalink:"/blog/tags/"+r.slug(t)}),function(t,e){var r=t.label.split(": ",2),n=r[0],o=r[1],i="primary";switch(e){case"blog":case"guides":i=function(t){switch(t){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(n)}return{category:n,count:t.count,label:t.label,permalink:t.permalink,style:i,value:o}}(n,e)}))}},456:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},465:function(t,e,r){var n=r(30),o=r(54),i=r(27),u=r(26),a=r(466);t.exports=function(t,e){var r=1==t,c=2==t,l=3==t,f=4==t,s=6==t,p=5==t||s,v=e||a;return function(e,a,d){for(var h,y,g=i(e),m=o(g),D=n(a,d,3),_=u(m.length),b=0,E=r?v(e,_):c?v(e,0):void 0;_>b;b++)if((p||b in m)&&(y=D(h=m[b],b,g),t))if(r)E[b]=y;else if(y)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:E.push(h)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(t,e,r){var n=r(467);t.exports=function(t,e){return new(n(t))(e)}},467:function(t,e,r){var n=r(13),o=r(468),i=r(2)("species");t.exports=function(t){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)||(e=void 0),n(e)&&null===(e=e[i])&&(e=void 0)),void 0===e?Array:e}},468:function(t,e,r){var n=r(23);t.exports=Array.isArray||function(t){return"Array"==n(t)}},469:function(t,e,r){"use strict";var n=SyntaxError,o=Function,i=TypeError,u=function(t){try{return o('"use strict"; return ('+t+").constructor;")()}catch(e){}},a=Object.getOwnPropertyDescriptor;if(a)try{a({},"")}catch(x){a=null}var c=function(){throw new i},l=a?function(){try{return c}catch(t){try{return a(arguments,"callee").get}catch(e){return c}}}():c,f=r(507)(),s=Object.getPrototypeOf||function(t){return t.__proto__},p={},v="undefined"==typeof Uint8Array?void 0:s(Uint8Array),d={"%AggregateError%":"undefined"==typeof AggregateError?void 0:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayIteratorPrototype%":f?s([][Symbol.iterator]()):void 0,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%BigInt%":"undefined"==typeof BigInt?void 0:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?void 0:FinalizationRegistry,"%Function%":o,"%GeneratorFunction%":p,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?s(s([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?s((new Map)[Symbol.iterator]()):void 0,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?s((new Set)[Symbol.iterator]()):void 0,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?s(""[Symbol.iterator]()):void 0,"%Symbol%":f?Symbol:void 0,"%SyntaxError%":n,"%ThrowTypeError%":l,"%TypedArray%":v,"%TypeError%":i,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?void 0:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=r(470),g=r(510),m=y.call(Function.call,Array.prototype.concat),D=y.call(Function.apply,Array.prototype.splice),_=y.call(Function.call,String.prototype.replace),b=y.call(Function.call,String.prototype.slice),E=y.call(Function.call,RegExp.prototype.exec),w=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,F=/\\(\\)?/g,j=function(t){var e=b(t,0,1),r=b(t,-1);if("%"===e&&"%"!==r)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==e)throw new n("invalid intrinsic syntax, expected opening `%`");var o=[];return _(t,w,(function(t,e,r,n){o[o.length]=r?_(n,F,"$1"):e||t})),o},A=function(t,e){var r,o=t;if(g(h,o)&&(o="%"+(r=h[o])[0]+"%"),g(d,o)){var a=d[o];if(a===p&&(a=function t(e){var r;if("%AsyncFunction%"===e)r=u("async function () {}");else if("%GeneratorFunction%"===e)r=u("function* () {}");else if("%AsyncGeneratorFunction%"===e)r=u("async function* () {}");else if("%AsyncGenerator%"===e){var n=t("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if("%AsyncIteratorPrototype%"===e){var o=t("%AsyncGenerator%");o&&(r=s(o.prototype))}return d[e]=r,r}(o)),void 0===a&&!e)throw new i("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:r,name:o,value:a}}throw new n("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!=typeof t||0===t.length)throw new i("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new i('"allowMissing" argument must be a boolean');if(null===E(/^%?[^%]*%?$/,t))throw new n("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=j(t),o=r.length>0?r[0]:"",u=A("%"+o+"%",e),c=u.name,l=u.value,f=!1,s=u.alias;s&&(o=s[0],D(r,m([0,1],s)));for(var p=1,v=!0;p=r.length){var w=a(l,h);l=(v=!!w)&&"get"in w&&!("originalValue"in w.get)?w.get:l[h]}else v=g(l,h),l=l[h];v&&!f&&(d[c]=l)}}return l}},470:function(t,e,r){"use strict";var n=r(509);t.exports=Function.prototype.bind||n},471:function(t,e,r){"use strict";var n=String.prototype.replace,o=/%20/g,i="RFC1738",u="RFC3986";t.exports={default:u,formatters:{RFC1738:function(t){return n.call(t,o,"+")},RFC3986:function(t){return String(t)}},RFC1738:i,RFC3986:u}},474:function(t,e,r){"use strict";var n=r(0),o=r.n(n),i=r(430),u=r(423),a=r.n(u);e.a=function(t){var e=t.count,r=t.label,n=t.permalink,u=t.style,c=t.value,l=t.valueOnly;return o.a.createElement(i.a,{to:n+"/",className:a()("badge","badge--rounded","badge--"+u)},l?c:r,e&&o.a.createElement(o.a.Fragment,null," (",e,")"))}},475:function(t,e,r){var n=r(476);t.exports=a;var o=Object.hasOwnProperty,i=/\s/g,u=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(t,e){return"string"!=typeof t?"":(e||(t=t.toLowerCase()),t.trim().replace(u,"").replace(n(),"").replace(i,"-"))}a.prototype.slug=function(t,e){for(var r=c(t,!0===e),n=r;o.call(this.occurrences,r);)this.occurrences[n]++,r=n+"-"+this.occurrences[n];return this.occurrences[r]=0,r},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},476:function(t,e){t.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},478:function(t,e,r){"use strict";var n=r(471),o=Object.prototype.hasOwnProperty,i=Array.isArray,u=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),a=function(t,e){for(var r=e&&e.plainObjects?Object.create(null):{},n=0;n1;){var e=t.pop(),r=e.obj[e.prop];if(i(r)){for(var n=[],o=0;o=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122||i===n.RFC1738&&(40===f||41===f)?c+=a.charAt(l):f<128?c+=u[f]:f<2048?c+=u[192|f>>6]+u[128|63&f]:f<55296||f>=57344?c+=u[224|f>>12]+u[128|f>>6&63]+u[128|63&f]:(l+=1,f=65536+((1023&f)<<10|1023&a.charCodeAt(l)),c+=u[240|f>>18]+u[128|f>>12&63]+u[128|f>>6&63]+u[128|63&f])}return c},isBuffer:function(t){return!(!t||"object"!=typeof t)&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},maybeMap:function(t,e){if(i(t)){for(var r=[],n=0;n0?j.join(",")||null:void 0}];else if(c(v))I=v;else{var B=Object.keys(j);I=y?B.sort(y):B}for(var L=u&&c(j)&&1===j.length?r+"[]":r,T=0;T0?b+_:""}},506:function(t,e,r){"use strict";var n=r(469),o=r(511),i=r(513),u=n("%TypeError%"),a=n("%WeakMap%",!0),c=n("%Map%",!0),l=o("WeakMap.prototype.get",!0),f=o("WeakMap.prototype.set",!0),s=o("WeakMap.prototype.has",!0),p=o("Map.prototype.get",!0),v=o("Map.prototype.set",!0),d=o("Map.prototype.has",!0),h=function(t,e){for(var r,n=t;null!==(r=n.next);n=r)if(r.key===e)return n.next=r.next,r.next=t.next,t.next=r,r};t.exports=function(){var t,e,r,n={assert:function(t){if(!n.has(t))throw new u("Side channel does not contain "+i(t))},get:function(n){if(a&&n&&("object"==typeof n||"function"==typeof n)){if(t)return l(t,n)}else if(c){if(e)return p(e,n)}else if(r)return function(t,e){var r=h(t,e);return r&&r.value}(r,n)},has:function(n){if(a&&n&&("object"==typeof n||"function"==typeof n)){if(t)return s(t,n)}else if(c){if(e)return d(e,n)}else if(r)return function(t,e){return!!h(t,e)}(r,n);return!1},set:function(n,o){a&&n&&("object"==typeof n||"function"==typeof n)?(t||(t=new a),f(t,n,o)):c?(e||(e=new c),v(e,n,o)):(r||(r={key:{},next:null}),function(t,e,r){var n=h(t,e);n?n.value=r:t.next={key:e,next:t.next,value:r}}(r,n,o))}};return n}},507:function(t,e,r){"use strict";var n="undefined"!=typeof Symbol&&Symbol,o=r(508);t.exports=function(){return"function"==typeof n&&("function"==typeof Symbol&&("symbol"==typeof n("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},508:function(t,e,r){"use strict";t.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),r=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(e in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var n=Object.getOwnPropertySymbols(t);if(1!==n.length||n[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(t,e);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},509:function(t,e,r){"use strict";var n="Function.prototype.bind called on incompatible ",o=Array.prototype.slice,i=Object.prototype.toString;t.exports=function(t){var e=this;if("function"!=typeof e||"[object Function]"!==i.call(e))throw new TypeError(n+e);for(var r,u=o.call(arguments,1),a=function(){if(this instanceof r){var n=e.apply(this,u.concat(o.call(arguments)));return Object(n)===n?n:this}return e.apply(t,u.concat(o.call(arguments)))},c=Math.max(0,e.length-u.length),l=[],f=0;f-1?o(r):r}},512:function(t,e,r){"use strict";var n=r(470),o=r(469),i=o("%Function.prototype.apply%"),u=o("%Function.prototype.call%"),a=o("%Reflect.apply%",!0)||n.call(u,i),c=o("%Object.getOwnPropertyDescriptor%",!0),l=o("%Object.defineProperty%",!0),f=o("%Math.max%");if(l)try{l({},"a",{value:1})}catch(p){l=null}t.exports=function(t){var e=a(n,u,arguments);if(c&&l){var r=c(e,"length");r.configurable&&l(e,"length",{value:1+f(0,t.length-(arguments.length-1))})}return e};var s=function(){return a(n,i,arguments)};l?l(t.exports,"apply",{value:s}):t.exports.apply=s},513:function(t,e,r){var n="function"==typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&n?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=n&&o&&"function"==typeof o.get?o.get:null,u=n&&Map.prototype.forEach,a="function"==typeof Set&&Set.prototype,c=Object.getOwnPropertyDescriptor&&a?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,l=a&&c&&"function"==typeof c.get?c.get:null,f=a&&Set.prototype.forEach,s="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,p="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,v="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,d=Boolean.prototype.valueOf,h=Object.prototype.toString,y=Function.prototype.toString,g=String.prototype.match,m=String.prototype.slice,D=String.prototype.replace,_=String.prototype.toUpperCase,b=String.prototype.toLowerCase,E=RegExp.prototype.test,w=Array.prototype.concat,F=Array.prototype.join,j=Array.prototype.slice,A=Math.floor,x="function"==typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,k="function"==typeof Symbol&&"object"==typeof Symbol.iterator,C="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===k||"symbol")?Symbol.toStringTag:null,N=Object.prototype.propertyIsEnumerable,P=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null);function I(t,e){if(t===1/0||t===-1/0||t!=t||t&&t>-1e3&&t<1e3||E.call(/e/,e))return e;var r=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof t){var n=t<0?-A(-t):A(t);if(n!==t){var o=String(n),i=m.call(e,o.length+1);return D.call(o,r,"$&_")+"."+D.call(D.call(i,/([0-9]{3})/g,"$&_"),/_$/,"")}}return D.call(e,r,"$&_")}var R=r(514),B=R.custom,L=z(B)?B:null;function T(t,e,r){var n="double"===(r.quoteStyle||e)?'"':"'";return n+t+n}function M(t){return D.call(String(t),/"/g,""")}function W(t){return!("[object Array]"!==G(t)||C&&"object"==typeof t&&C in t)}function U(t){return!("[object RegExp]"!==G(t)||C&&"object"==typeof t&&C in t)}function z(t){if(k)return t&&"object"==typeof t&&t instanceof Symbol;if("symbol"==typeof t)return!0;if(!t||"object"!=typeof t||!S)return!1;try{return S.call(t),!0}catch(e){}return!1}t.exports=function t(e,r,n,o){var a=r||{};if(q(a,"quoteStyle")&&"single"!==a.quoteStyle&&"double"!==a.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(q(a,"maxStringLength")&&("number"==typeof a.maxStringLength?a.maxStringLength<0&&a.maxStringLength!==1/0:null!==a.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var c=!q(a,"customInspect")||a.customInspect;if("boolean"!=typeof c&&"symbol"!==c)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(q(a,"indent")&&null!==a.indent&&"\t"!==a.indent&&!(parseInt(a.indent,10)===a.indent&&a.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(q(a,"numericSeparator")&&"boolean"!=typeof a.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var h=a.numericSeparator;if(void 0===e)return"undefined";if(null===e)return"null";if("boolean"==typeof e)return e?"true":"false";if("string"==typeof e)return function t(e,r){if(e.length>r.maxStringLength){var n=e.length-r.maxStringLength,o="... "+n+" more character"+(n>1?"s":"");return t(m.call(e,0,r.maxStringLength),r)+o}return T(D.call(D.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,H),"single",r)}(e,a);if("number"==typeof e){if(0===e)return 1/0/e>0?"0":"-0";var _=String(e);return h?I(e,_):_}if("bigint"==typeof e){var E=String(e)+"n";return h?I(e,E):E}var A=void 0===a.depth?5:a.depth;if(void 0===n&&(n=0),n>=A&&A>0&&"object"==typeof e)return W(e)?"[Array]":"[Object]";var O=function(t,e){var r;if("\t"===t.indent)r="\t";else{if(!("number"==typeof t.indent&&t.indent>0))return null;r=F.call(Array(t.indent+1)," ")}return{base:r,prev:F.call(Array(e+1),r)}}(a,n);if(void 0===o)o=[];else if(V(o,e)>=0)return"[Circular]";function B(e,r,i){if(r&&(o=j.call(o)).push(r),i){var u={depth:a.depth};return q(a,"quoteStyle")&&(u.quoteStyle=a.quoteStyle),t(e,u,n+1,o)}return t(e,a,n+1,o)}if("function"==typeof e&&!U(e)){var $=function(t){if(t.name)return t.name;var e=g.call(y.call(t),/^function\s*([\w$]+)/);if(e)return e[1];return null}(e),X=Y(e,B);return"[Function"+($?": "+$:" (anonymous)")+"]"+(X.length>0?" { "+F.call(X,", ")+" }":"")}if(z(e)){var tt=k?D.call(String(e),/^(Symbol\(.*\))_[^)]*$/,"$1"):S.call(e);return"object"!=typeof e||k?tt:Q(tt)}if(function(t){if(!t||"object"!=typeof t)return!1;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return!0;return"string"==typeof t.nodeName&&"function"==typeof t.getAttribute}(e)){for(var et="<"+b.call(String(e.nodeName)),rt=e.attributes||[],nt=0;nt"}if(W(e)){if(0===e.length)return"[]";var ot=Y(e,B);return O&&!function(t){for(var e=0;e=0)return!1;return!0}(ot)?"["+K(ot,O)+"]":"[ "+F.call(ot,", ")+" ]"}if(function(t){return!("[object Error]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)){var it=Y(e,B);return"cause"in Error.prototype||!("cause"in e)||N.call(e,"cause")?0===it.length?"["+String(e)+"]":"{ ["+String(e)+"] "+F.call(it,", ")+" }":"{ ["+String(e)+"] "+F.call(w.call("[cause]: "+B(e.cause),it),", ")+" }"}if("object"==typeof e&&c){if(L&&"function"==typeof e[L]&&R)return R(e,{depth:A-n});if("symbol"!==c&&"function"==typeof e.inspect)return e.inspect()}if(function(t){if(!i||!t||"object"!=typeof t)return!1;try{i.call(t);try{l.call(t)}catch(et){return!0}return t instanceof Map}catch(e){}return!1}(e)){var ut=[];return u.call(e,(function(t,r){ut.push(B(r,e,!0)+" => "+B(t,e))})),Z("Map",i.call(e),ut,O)}if(function(t){if(!l||!t||"object"!=typeof t)return!1;try{l.call(t);try{i.call(t)}catch(e){return!0}return t instanceof Set}catch(r){}return!1}(e)){var at=[];return f.call(e,(function(t){at.push(B(t,e))})),Z("Set",l.call(e),at,O)}if(function(t){if(!s||!t||"object"!=typeof t)return!1;try{s.call(t,s);try{p.call(t,p)}catch(et){return!0}return t instanceof WeakMap}catch(e){}return!1}(e))return J("WeakMap");if(function(t){if(!p||!t||"object"!=typeof t)return!1;try{p.call(t,p);try{s.call(t,s)}catch(et){return!0}return t instanceof WeakSet}catch(e){}return!1}(e))return J("WeakSet");if(function(t){if(!v||!t||"object"!=typeof t)return!1;try{return v.call(t),!0}catch(e){}return!1}(e))return J("WeakRef");if(function(t){return!("[object Number]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(Number(e)));if(function(t){if(!t||"object"!=typeof t||!x)return!1;try{return x.call(t),!0}catch(e){}return!1}(e))return Q(B(x.call(e)));if(function(t){return!("[object Boolean]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(d.call(e));if(function(t){return!("[object String]"!==G(t)||C&&"object"==typeof t&&C in t)}(e))return Q(B(String(e)));if(!function(t){return!("[object Date]"!==G(t)||C&&"object"==typeof t&&C in t)}(e)&&!U(e)){var ct=Y(e,B),lt=P?P(e)===Object.prototype:e instanceof Object||e.constructor===Object,ft=e instanceof Object?"":"null prototype",st=!lt&&C&&Object(e)===e&&C in e?m.call(G(e),8,-1):ft?"Object":"",pt=(lt||"function"!=typeof e.constructor?"":e.constructor.name?e.constructor.name+" ":"")+(st||ft?"["+F.call(w.call([],st||[],ft||[]),": ")+"] ":"");return 0===ct.length?pt+"{}":O?pt+"{"+K(ct,O)+"}":pt+"{ "+F.call(ct,", ")+" }"}return String(e)};var $=Object.prototype.hasOwnProperty||function(t){return t in this};function q(t,e){return $.call(t,e)}function G(t){return h.call(t)}function V(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0,n=t.length;r-1?t.split(","):t},l=function(t,e,r,n){if(t){var i=r.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,u=/(\[[^[\]]*])/g,a=r.depth>0&&/(\[[^[\]]*])/.exec(i),l=a?i.slice(0,a.index):i,f=[];if(l){if(!r.plainObjects&&o.call(Object.prototype,l)&&!r.allowPrototypes)return;f.push(l)}for(var s=0;r.depth>0&&null!==(a=u.exec(i))&&s=0;--i){var u,a=t[i];if("[]"===a&&r.parseArrays)u=[].concat(o);else{u=r.plainObjects?Object.create(null):{};var l="["===a.charAt(0)&&"]"===a.charAt(a.length-1)?a.slice(1,-1):a,f=parseInt(l,10);r.parseArrays||""!==l?!isNaN(f)&&a!==l&&String(f)===l&&f>=0&&r.parseArrays&&f<=r.arrayLimit?(u=[])[f]=o:"__proto__"!==l&&(u[l]=o):u={0:o}}o=u}return o}(f,e,r,n)}};t.exports=function(t,e){var r=function(t){if(!t)return u;if(null!==t.decoder&&void 0!==t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var e=void 0===t.charset?u.charset:t.charset;return{allowDots:void 0===t.allowDots?u.allowDots:!!t.allowDots,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:u.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:u.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:u.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:u.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:u.comma,decoder:"function"==typeof t.decoder?t.decoder:u.decoder,delimiter:"string"==typeof t.delimiter||n.isRegExp(t.delimiter)?t.delimiter:u.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:u.depth,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:u.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:u.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:u.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:u.strictNullHandling}}(e);if(""===t||null==t)return r.plainObjects?Object.create(null):{};for(var f="string"==typeof t?function(t,e){var r,l={},f=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,s=e.parameterLimit===1/0?void 0:e.parameterLimit,p=f.split(e.delimiter,s),v=-1,d=e.charset;if(e.charsetSentinel)for(r=0;r-1&&(y=i(y)?[y]:y),o.call(l,h)?l[h]=n.combine(l[h],y):l[h]=y}return l}(t,r):t,s=r.plainObjects?Object.create(null):{},p=Object.keys(f),v=0;v - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + diff --git a/components/index.html b/components/index.html index 82007fc488..bf867040cf 100644 --- a/components/index.html +++ b/components/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + diff --git a/contact/index.html b/contact/index.html index bdd3dc8e51..f07d0d1932 100644 --- a/contact/index.html +++ b/contact/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + diff --git a/d9a4c8ef.98d2bfff.js b/d9a4c8ef.3804c972.js similarity index 99% rename from d9a4c8ef.98d2bfff.js rename to d9a4c8ef.3804c972.js index 370f66680c..1e276b0874 100644 --- a/d9a4c8ef.98d2bfff.js +++ b/d9a4c8ef.3804c972.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[227],{379:function(e,n,t){"use strict";t.r(n),t.d(n,"frontMatter",(function(){return s})),t.d(n,"metadata",(function(){return b})),t.d(n,"rightToc",(function(){return p})),t.d(n,"default",(function(){return d}));var a=t(1),o=t(9),l=(t(0),t(425)),r=t(437),c=t(444),i=t(424),s={last_modified_on:"2023-12-21",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)"},b={id:"using-qovery/interface/cli",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)",source:"@site/docs/using-qovery/interface/cli.md",permalink:"/docs/using-qovery/interface/cli",sidebar:"docs",previous:{title:"Web interface",permalink:"/docs/using-qovery/interface/web-interface"},next:{title:"REST API",permalink:"/docs/using-qovery/interface/rest-api"}},p=[{value:"First usage",id:"first-usage",children:[{value:"Install",id:"install",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Help",id:"help",children:[]}]},{value:"Context",id:"context",children:[{value:"Set New Context",id:"set-new-context",children:[]},{value:"Print Current Context",id:"print-current-context",children:[]}]},{value:"Log",id:"log",children:[{value:"Follow Logs",id:"follow-logs",children:[]}]},{value:"Status",id:"status",children:[]},{value:"Console",id:"console",children:[]},{value:"Shell",id:"shell",children:[{value:"Pass a command",id:"pass-a-command",children:[]},{value:"Shell in a dedicated pod",id:"shell-in-a-dedicated-pod",children:[]},{value:"Shell in a dedicated container",id:"shell-in-a-dedicated-container",children:[]}]},{value:"Generate API token",id:"generate-api-token",children:[]},{value:"Managing services and environments",id:"managing-services-and-environments",children:[{value:"Environment",id:"environment",children:[]}]},{value:"Managing the Deployment Pipeline",id:"managing-the-deployment-pipeline",children:[{value:"List stages",id:"list-stages",children:[]},{value:"Add a stage",id:"add-a-stage",children:[]},{value:"Modify a stage",id:"modify-a-stage",children:[]},{value:"Delete a stage",id:"delete-a-stage",children:[]},{value:"Change stage for a service",id:"change-stage-for-a-service",children:[]}]},{value:"Support",id:"support",children:[]}],u={rightToc:p};function d(e){var n=e.components,t=Object(o.a)(e,["components"]);return Object(l.b)("wrapper",Object(a.a)({},u,t,{components:n,mdxType:"MDXLayout"}),Object(l.b)(i.a,{type:"success",mdxType:"Alert"},Object(l.b)("p",null,"Use Infrastructure as Code (IaC) with ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Terraform")," and our ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/rest-api/"}),"REST API")," to manage Qovery and deploy your apps.")),Object(l.b)("p",null,"Qovery provides a very easy to use CLI (Command Line Interface) designed to fit the developer workflow perfectly."),Object(l.b)("hr",null),Object(l.b)("p",null,"The purpose of the CLI is to integrate seamlessly with your development workflow:"),Object(l.b)("ol",null,Object(l.b)("li",{parentName:"ol"},"Write code"),Object(l.b)("li",{parentName:"ol"},"Commit"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery")," - deploy a new version of your application"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery CLI")," - check the status of your application"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery CLI")," - debug your application"),Object(l.b)("li",{parentName:"ol"},"Repeat")),Object(l.b)("h2",{id:"first-usage"},"First usage"),Object(l.b)("h3",{id:"install"},"Install"),Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(l.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(l.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(l.b)("p",null,"Qovery is part of ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(l.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(l.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(l.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(l.b)(c.a,{value:"script",mdxType:"TabItem"},Object(l.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(l.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(l.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(l.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(l.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(l.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(l.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(l.b)("p",null,"Change ",Object(l.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(l.b)("p",null,"Note: ",Object(l.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(l.b)("h3",{id:"sign-up"},"Sign up"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(l.b)("p",null,"Your browser window with sign-in options will open."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(l.b)("p",null,Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(l.b)("p",null,"Congratulations, you are logged-in."),Object(l.b)("h3",{id:"help"},"Help"),Object(l.b)("p",null,"You can see all the commands available by executing:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery help\n")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Help output"',title:'"Help','output"':!0}),'$ qovery help\nA Command-line Interface of the Qovery platform\n\nUsage:\n qovery [command]\n\nAvailable Commands:\n application Manage applications\n auth Log in to Qovery\n completion Generate the autocompletion script for the specified shell\n console Opens the application in Qovery Console in your browser\n container Manage containers\n context Manage CLI context\n cronjob Manage cronjobs\n database Manage databases\n env Manage Environment Variables and Secrets\n environment Manage environments\n help Help about any command\n lifecycle Manage lifecycle jobs\n log Print your application logs\n service Manage services\n shell Connect to an application container\n status Print the status of your application\n token Generate an API token\n upgrade Upgrade Qovery CLI to latest version\n version Print installed version of the Qovery CLI\n\nFlags:\n -h, --help help for qovery\n\nUse "qovery [command] --help" for more information about a command.\n')),Object(l.b)("h2",{id:"context"},"Context"),Object(l.b)("p",null,"Context command lets you configure the CLI to work with your chosen application. Before executing other commands, you need first to set up the context.\nThe context is then remembered and used by the CLI. You can configure a new context anytime by running the ",Object(l.b)("inlineCode",{parentName:"p"},"qovery context set")," command."),Object(l.b)("h3",{id:"set-new-context"},"Set New Context"),Object(l.b)("p",null,"To set a new context, type ",Object(l.b)("inlineCode",{parentName:"p"},"qovery context set"),":"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context set\nQovery: Current context:\nOrganization | Qovery\nProject | test\nEnvironment | development\nApplication | website\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery\nProject:\n\u2714 admin\nEnvironment:\n\u2714 main\nApplication:\n\u2714 app\n\nQovery: New context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n")),Object(l.b)("h3",{id:"print-current-context"},"Print Current Context"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context\nQovery: Current context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n\nQovery: You can set a new context using 'qovery context set'.\n")),Object(l.b)("h2",{id:"log"},"Log"),Object(l.b)("p",null,"Log command allows you to display the application logs."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(l.b)("p",null,"By default, the last 1000 logs is displayed."),Object(l.b)("h3",{id:"follow-logs"},"Follow Logs"),Object(l.b)("p",null,"To make the CLI follow your logs, use ",Object(l.b)("inlineCode",{parentName:"p"},"-f")," flag:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log -f\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(l.b)("p",null,"This will make the CLI follow your application logs and append any new logs till you use ",Object(l.b)("inlineCode",{parentName:"p"},"CTRL+C"),"."),Object(l.b)("h2",{id:"status"},"Status"),Object(l.b)("p",null,"Status command lets you print the basic status of your application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery status\n15 Jul 21 10:55 CEST\nApplication | Backend\nStatus | RUNNING\n")),Object(l.b)("h2",{id:"console"},"Console"),Object(l.b)("p",null,"Console command quickly opens the Qovery Console in your browser to let you display more information about your application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery console\nQovery: Opening https://console.qovery.com/platform/organization/your-org/projects/your-proj/environments/your-env/applications/your-app/summary\n")),Object(l.b)("h2",{id:"shell"},"Shell"),Object(l.b)("p",null,"Shell command allows you to open a connection and execute commands directly on the container running application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell\n/ # ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},"Keep in mind these limitations when using this feature:",Object(l.b)("ul",null,Object(l.b)("li",null,"Install a process reaper as pid one in your container (i.e: dumb-init), as you may leave zoombie process in your container if your shell terminate unproperly (i.e: ctrl+c, cnx restart). This is a known issue with kubernetes exec to leave process alive after attach is closed;"),Object(l.b)("li",null,"shell is force closed after [1 hour, 1GB transmitted];"),Object(l.b)("li",null,"we use SH by default. To have auto-completion, start bash."))),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},"The width of the terminal is limited to 80 characters. But you can resize it once you are inside the application with one of these commands:",Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"COLUMNS=200 tput init\nstty cols 200\n"))),Object(l.b)("h3",{id:"pass-a-command"},"Pass a command"),Object(l.b)("p",null,"To pass a command, you can use the ",Object(l.b)("inlineCode",{parentName:"p"},"--command")," or ",Object(l.b)("inlineCode",{parentName:"p"},"-c")," argument followed by your command."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(l.b)("p",null,"To pass several arguments, you can separate them with a comma or send different ",Object(l.b)("inlineCode",{parentName:"p"},"--command"),"."),Object(l.b)("p",null,Object(l.b)("inlineCode",{parentName:"p"},"qovery shell --command ls --command -l"),"\n",Object(l.b)("inlineCode",{parentName:"p"},"qovery shell --command ls,-l"),"\n",Object(l.b)("inlineCode",{parentName:"p"},"qovery shell -c ls,-l")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls --command -l\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 bin\ndrwxr-xr-x 5 root root 360 Dec 21 09:46 dev\ndrwxr-xr-x 1 root root 41 Dec 20 20:13 docker-entrypoint.d\n-rwxr-xr-x 1 root root 1620 Dec 20 20:13 docker-entrypoint.sh\ndrwxr-xr-x 1 root root 25 Dec 21 09:46 etc\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 home\ndrwxr-xr-x 1 root root 61 Dec 20 22:11 lib\ndrwxr-xr-x 5 root root 44 Nov 30 09:32 media\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 mnt\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 opt\ndr-xr-xr-x 209 root root 0 Dec 21 09:46 proc\ndrwx------ 1 root root 26 Dec 21 10:38 root\ndrwxr-xr-x 1 root root 23 Dec 21 09:46 run\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 sbin\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 srv\ndr-xr-xr-x 13 root root 0 Dec 21 09:46 sys\ndrwxrwxrwt 2 root root 6 Nov 30 09:32 tmp\ndrwxr-xr-x 1 root root 66 Nov 30 09:32 usr\ndrwxr-xr-x 1 root root 19 Nov 30 09:32 var\ndrwxr-xr-x 2 root root 59 Dec 21 09:45 www\n")),Object(l.b)("h3",{id:"shell-in-a-dedicated-pod"},"Shell in a dedicated pod"),Object(l.b)("p",null,"If your application is running on several pods, you can shell directly in a dedicated one by using the ",Object(l.b)("inlineCode",{parentName:"p"},"--pod")," or ",Object(l.b)("inlineCode",{parentName:"p"},"-p")," argument followed by your pod name."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(l.b)("h3",{id:"shell-in-a-dedicated-container"},"Shell in a dedicated container"),Object(l.b)("p",null,"If you have several containers in your pod, you can shell directly in a dedicated one by using the ",Object(l.b)("inlineCode",{parentName:"p"},"--container")," argument followed by your container name."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --container app-5f65fb5c4-frontend\n")),Object(l.b)("h2",{id:"generate-api-token"},"Generate API token"),Object(l.b)("p",null,"To use the Qovery API you will need to generate an authentication token. To generate an API token you can install the CLI and type"),Object(l.b)(i.a,{type:"warning",mdxType:"Alert"},Object(l.b)("p",null,"Never share your API token with anyone.")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery token\n\nQovery: Select organization\nOrganization:\n\u2714 My Organization\nChoose a token name\nToken name: Romaric\nChoose a token description\nToken description: used for Github Actions\nQovery: ---- Never share this authentication token and keep it secure ----\nQovery: qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691\nQovery: ---- Never share this authentication token and keep it secure ----\n")),Object(l.b)("p",null,"To use your token and list your organizations."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-shell"}),"curl -X GET -H 'Authorization: Token qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691' https://api.qovery.com/organization\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"The token can be used to interact programmatically with our API (directly, via our Terraform Provider etc..).\nIf you get a 424 error while trying to create new applications from one of your git repository, please make sure that the Organization Owner has access to the repository you are configuring for your app.")),Object(l.b)("p",null,"Check out our ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://api-doc.qovery.com"}),"API documentation")),Object(l.b)("h2",{id:"managing-services-and-environments"},"Managing services and environments"),Object(l.b)("p",null,"The CLI allows you to manage and deploy the environment and services within your organization"),Object(l.b)("p",null,"###\xa0application, container, lifecycle, cronjob\nThese commands allow you to manage all these services via the CLI. You can run the following actions on these services:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"cancel: Cancel the service deployment"),Object(l.b)("li",{parentName:"ul"},"delete: Delete a service"),Object(l.b)("li",{parentName:"ul"},"deploy: Deploy a service"),Object(l.b)("li",{parentName:"ul"},"list: List the service of the specified type"),Object(l.b)("li",{parentName:"ul"},"redeploy: Redeploy a service (already deployed before)"),Object(l.b)("li",{parentName:"ul"},"stop: Stop a service")),Object(l.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command) "),Object(l.b)("p",null,"Example: Listing applications and triggering a deployment"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | STOPPED | 2023-02-02 14:48:05.339652 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n\n$ qovery application deploy -n "backend"\nDeploying application backend in progress..\n\n$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | RUNNING | 2023-02-13 12:59:23.228231 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n')),Object(l.b)("h3",{id:"environment"},"Environment"),Object(l.b)("p",null,"The command ",Object(l.b)("inlineCode",{parentName:"p"},"environment")," allow you to manage a specific environment via the CLI. You can run the following actions on environments:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"cancel: Cancel an environment deployment"),Object(l.b)("li",{parentName:"ul"},"clone: Clone an environment"),Object(l.b)("li",{parentName:"ul"},"delete: Delete an environment"),Object(l.b)("li",{parentName:"ul"},"deploy: Deploy an environment"),Object(l.b)("li",{parentName:"ul"},"list: List environments"),Object(l.b)("li",{parentName:"ul"},"redeploy: Redeploy an environment"),Object(l.b)("li",{parentName:"ul"},"stage: Manage deployment stages"),Object(l.b)("li",{parentName:"ul"},"stop: Stop an environment")),Object(l.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command)"),Object(l.b)("p",null,"Example: Manage deployment stages and triggering deployment"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'~ $ qovery environment stage list\n\n# deployment stage 1: "DATABASE DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nDATABASE | Redis\nDATABASE | DB\n\n\n# deployment stage 2: "JOB DEFAULT"\nRename me to avoid default/legacy ordering\n\n\n\n\n# deployment stage 3: "CONTAINER DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nCONTAINER | Rabbitmq\n\n\n# deployment stage 4: "APPLICATION DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nAPPLICATION | Backend\nAPPLICATION | Frontend\nAPPLICATION | Pablo Backend App\nAPPLICATION | API gateway\n\n~ $ qovery environment deploy\nEnvironment is deploying!\n')),Object(l.b)("h2",{id:"managing-the-deployment-pipeline"},"Managing the Deployment Pipeline"),Object(l.b)("p",null,"In the following sections we will describe how to modify the Deployment Pipeline. "),Object(l.b)("h3",{id:"list-stages"},"List stages"),Object(l.b)("p",null,"You can list all the stages of your environment by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage list\n")),Object(l.b)("h3",{id:"add-a-stage"},"Add a stage"),Object(l.b)("p",null,"You can add a new stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage create -n -d \n")),Object(l.b)("p",null,"Note that the stage will be added at the end of the pipeline (the highest number)"),Object(l.b)("h3",{id:"modify-a-stage"},"Modify a stage"),Object(l.b)("p",null,"You can modify a stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage edit -n --new-name --new-description \n")),Object(l.b)("h3",{id:"delete-a-stage"},"Delete a stage"),Object(l.b)("p",null,"You can modify a stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage delete -n \n")),Object(l.b)("h3",{id:"change-stage-for-a-service"},"Change stage for a service"),Object(l.b)("p",null,"You can modify the stage associated to a service by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage move -n --stage \n")),Object(l.b)("h2",{id:"support"},"Support"),Object(l.b)("p",null,"Do you have any issues with Qovery CLI? ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/issues"}),"Open an issue"),"."))}d.isMDXComponent=!0},424:function(e,n,t){"use strict";t(426);var a=t(0),o=t.n(a),l=t(423),r=t.n(l);t(132);n.a=function(e){var n=e.children,t=e.classNames,a=e.fill,l=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:r()(t,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==l}),role:"alert"},!1!==l&&o.a.createElement("i",{className:r()("feather","icon-"+(l||i))}),n)}},437:function(e,n,t){"use strict";var a=t(1),o=(t(442),t(439),t(52),t(29),t(22),t(21),t(0)),l=t.n(o),r=t(449),c=t(423),i=t.n(c),s=t(433),b=t.n(s),p=t(448),u=37,d=39;function m(e){var n=e.block,t=e.centered,a=e.changeSelectedValue,o=e.className,r=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,p=e.tabRefs;return l.a.createElement("div",{className:t?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":n}),style:c},s.map((function(e){var n=e.value,t=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===n,className:i()("tab-item",{"tab-item--active":b===n}),key:n,ref:function(e){return p.push(e)},onKeyDown:function(e){return r(p,e.target,e)},onFocus:function(){return a(n)},onClick:function(){return a(n)}},t)}))))}function h(e){var n=e.placeholder,t=e.selectedValue,a=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return l.a.createElement(r.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:t,placeholder:n,value:c.find((function(e){return e.value==t})),onChange:function(e){return a(e?e.value:null)}})}n.a=function(e){e.block,e.centered;var n=e.children,t=e.defaultValue,r=e.groupId,c=e.label,i=e.placeholder,s=e.select,y=e.size,g=(e.style,e.values),v=e.urlKey,O=Object(p.a)(),j=O.tabGroupChoices,f=O.setTabGroupChoices,N=Object(o.useState)(t),w=N[0],x=N[1];if(null!=r){var C=j[r];null!=C&&C!==w&&x(C)}var T=function(e){x(e),null!=r&&f(r,e)},I=[],k=function(e,n,t){switch(t.keyCode){case d:!function(e,n){var t=e.indexOf(n)+1;e[t]?e[t].focus():e[0].focus()}(e,n);break;case u:!function(e,n){var t=e.indexOf(n)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,n)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&v){var e=b.a.parse(window.location.search);e[v]&&x(e[v])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&l.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(s?l.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:k,placeholder:i,selectedValue:w,size:y,tabRefs:I},e)):l.a.createElement(m,Object(a.a)({changeSelectedValue:T,handleKeydown:k,selectedValue:w,tabRefs:I},e)))),o.Children.toArray(n).filter((function(e){return e.props.value===w}))[0])}},444:function(e,n,t){"use strict";var a=t(0),o=t.n(a);n.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[227],{379:function(e,n,t){"use strict";t.r(n),t.d(n,"frontMatter",(function(){return s})),t.d(n,"metadata",(function(){return b})),t.d(n,"rightToc",(function(){return p})),t.d(n,"default",(function(){return d}));var a=t(1),o=t(9),l=(t(0),t(425)),r=t(437),c=t(443),i=t(424),s={last_modified_on:"2023-12-21",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)"},b={id:"using-qovery/interface/cli",title:"CLI",description:"How to use the Qovery CLI (Command Line Interface)",source:"@site/docs/using-qovery/interface/cli.md",permalink:"/docs/using-qovery/interface/cli",sidebar:"docs",previous:{title:"Web interface",permalink:"/docs/using-qovery/interface/web-interface"},next:{title:"REST API",permalink:"/docs/using-qovery/interface/rest-api"}},p=[{value:"First usage",id:"first-usage",children:[{value:"Install",id:"install",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Help",id:"help",children:[]}]},{value:"Context",id:"context",children:[{value:"Set New Context",id:"set-new-context",children:[]},{value:"Print Current Context",id:"print-current-context",children:[]}]},{value:"Log",id:"log",children:[{value:"Follow Logs",id:"follow-logs",children:[]}]},{value:"Status",id:"status",children:[]},{value:"Console",id:"console",children:[]},{value:"Shell",id:"shell",children:[{value:"Pass a command",id:"pass-a-command",children:[]},{value:"Shell in a dedicated pod",id:"shell-in-a-dedicated-pod",children:[]},{value:"Shell in a dedicated container",id:"shell-in-a-dedicated-container",children:[]}]},{value:"Generate API token",id:"generate-api-token",children:[]},{value:"Managing services and environments",id:"managing-services-and-environments",children:[{value:"Environment",id:"environment",children:[]}]},{value:"Managing the Deployment Pipeline",id:"managing-the-deployment-pipeline",children:[{value:"List stages",id:"list-stages",children:[]},{value:"Add a stage",id:"add-a-stage",children:[]},{value:"Modify a stage",id:"modify-a-stage",children:[]},{value:"Delete a stage",id:"delete-a-stage",children:[]},{value:"Change stage for a service",id:"change-stage-for-a-service",children:[]}]},{value:"Support",id:"support",children:[]}],u={rightToc:p};function d(e){var n=e.components,t=Object(o.a)(e,["components"]);return Object(l.b)("wrapper",Object(a.a)({},u,t,{components:n,mdxType:"MDXLayout"}),Object(l.b)(i.a,{type:"success",mdxType:"Alert"},Object(l.b)("p",null,"Use Infrastructure as Code (IaC) with ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/integration/terraform/"}),"Terraform")," and our ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/rest-api/"}),"REST API")," to manage Qovery and deploy your apps.")),Object(l.b)("p",null,"Qovery provides a very easy to use CLI (Command Line Interface) designed to fit the developer workflow perfectly."),Object(l.b)("hr",null),Object(l.b)("p",null,"The purpose of the CLI is to integrate seamlessly with your development workflow:"),Object(l.b)("ol",null,Object(l.b)("li",{parentName:"ol"},"Write code"),Object(l.b)("li",{parentName:"ol"},"Commit"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery")," - deploy a new version of your application"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery CLI")," - check the status of your application"),Object(l.b)("li",{parentName:"ol"},Object(l.b)("strong",{parentName:"li"},"Qovery CLI")," - debug your application"),Object(l.b)("li",{parentName:"ol"},"Repeat")),Object(l.b)("h2",{id:"first-usage"},"First usage"),Object(l.b)("h3",{id:"install"},"Install"),Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"linux",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"universal",mdxType:"TabItem"},Object(l.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(l.b)(c.a,{value:"arch",mdxType:"TabItem"},Object(l.b)("p",null,"Qovery is part of ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(l.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(l.b)(c.a,{value:"macos",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"homebrew",mdxType:"TabItem"},Object(l.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(l.b)(c.a,{value:"script",mdxType:"TabItem"},Object(l.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(l.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(l.b)(c.a,{value:"windows",mdxType:"TabItem"},Object(l.b)(r.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(l.b)(c.a,{value:"scoop",mdxType:"TabItem"},Object(l.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(l.b)(c.a,{value:"manual",mdxType:"TabItem"},Object(l.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(l.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(l.b)(c.a,{value:"docker",mdxType:"TabItem"},Object(l.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(l.b)("p",null,"Change ",Object(l.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(l.b)("p",null,"Note: ",Object(l.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),"."))),Object(l.b)("h3",{id:"sign-up"},"Sign up"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(l.b)("p",null,"Your browser window with sign-in options will open."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(l.b)("p",null,Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(l.b)("p",{align:"center"},Object(l.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(l.b)("p",null,"Congratulations, you are logged-in."),Object(l.b)("h3",{id:"help"},"Help"),Object(l.b)("p",null,"You can see all the commands available by executing:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery help\n")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Help output"',title:'"Help','output"':!0}),'$ qovery help\nA Command-line Interface of the Qovery platform\n\nUsage:\n qovery [command]\n\nAvailable Commands:\n application Manage applications\n auth Log in to Qovery\n completion Generate the autocompletion script for the specified shell\n console Opens the application in Qovery Console in your browser\n container Manage containers\n context Manage CLI context\n cronjob Manage cronjobs\n database Manage databases\n env Manage Environment Variables and Secrets\n environment Manage environments\n help Help about any command\n lifecycle Manage lifecycle jobs\n log Print your application logs\n service Manage services\n shell Connect to an application container\n status Print the status of your application\n token Generate an API token\n upgrade Upgrade Qovery CLI to latest version\n version Print installed version of the Qovery CLI\n\nFlags:\n -h, --help help for qovery\n\nUse "qovery [command] --help" for more information about a command.\n')),Object(l.b)("h2",{id:"context"},"Context"),Object(l.b)("p",null,"Context command lets you configure the CLI to work with your chosen application. Before executing other commands, you need first to set up the context.\nThe context is then remembered and used by the CLI. You can configure a new context anytime by running the ",Object(l.b)("inlineCode",{parentName:"p"},"qovery context set")," command."),Object(l.b)("h3",{id:"set-new-context"},"Set New Context"),Object(l.b)("p",null,"To set a new context, type ",Object(l.b)("inlineCode",{parentName:"p"},"qovery context set"),":"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context set\nQovery: Current context:\nOrganization | Qovery\nProject | test\nEnvironment | development\nApplication | website\n\nQovery: Select new context\nOrganization:\n\u2714 Qovery\nProject:\n\u2714 admin\nEnvironment:\n\u2714 main\nApplication:\n\u2714 app\n\nQovery: New context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n")),Object(l.b)("h3",{id:"print-current-context"},"Print Current Context"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery context\nQovery: Current context:\nOrganization | Qovery\nProject | admin\nEnvironment | main\nApplication | app\n\nQovery: You can set a new context using 'qovery context set'.\n")),Object(l.b)("h2",{id:"log"},"Log"),Object(l.b)("p",null,"Log command allows you to display the application logs."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(l.b)("p",null,"By default, the last 1000 logs is displayed."),Object(l.b)("h3",{id:"follow-logs"},"Follow Logs"),Object(l.b)("p",null,"To make the CLI follow your logs, use ",Object(l.b)("inlineCode",{parentName:"p"},"-f")," flag:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery log -f\n TIME MESSAGE\n Jul 15 08:46:13.019717 at /usr/src/app/autoFunctions/levels.js:17:16\n Jul 15 08:46:13.019721 at Array.forEach ()\n Jul 15 08:46:13.019724 at Timeout._onTimeout (/usr/src/app/autoFunctions/levels.js:15:14)\n Jul 15 08:46:13.019728 at listOnTimeout (internal/timers.js:557:17)\n # ... the rest of logs\n")),Object(l.b)("p",null,"This will make the CLI follow your application logs and append any new logs till you use ",Object(l.b)("inlineCode",{parentName:"p"},"CTRL+C"),"."),Object(l.b)("h2",{id:"status"},"Status"),Object(l.b)("p",null,"Status command lets you print the basic status of your application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery status\n15 Jul 21 10:55 CEST\nApplication | Backend\nStatus | RUNNING\n")),Object(l.b)("h2",{id:"console"},"Console"),Object(l.b)("p",null,"Console command quickly opens the Qovery Console in your browser to let you display more information about your application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery console\nQovery: Opening https://console.qovery.com/platform/organization/your-org/projects/your-proj/environments/your-env/applications/your-app/summary\n")),Object(l.b)("h2",{id:"shell"},"Shell"),Object(l.b)("p",null,"Shell command allows you to open a connection and execute commands directly on the container running application."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell\n/ # ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},"Keep in mind these limitations when using this feature:",Object(l.b)("ul",null,Object(l.b)("li",null,"Install a process reaper as pid one in your container (i.e: dumb-init), as you may leave zoombie process in your container if your shell terminate unproperly (i.e: ctrl+c, cnx restart). This is a known issue with kubernetes exec to leave process alive after attach is closed;"),Object(l.b)("li",null,"shell is force closed after [1 hour, 1GB transmitted];"),Object(l.b)("li",null,"we use SH by default. To have auto-completion, start bash."))),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},"The width of the terminal is limited to 80 characters. But you can resize it once you are inside the application with one of these commands:",Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"COLUMNS=200 tput init\nstty cols 200\n"))),Object(l.b)("h3",{id:"pass-a-command"},"Pass a command"),Object(l.b)("p",null,"To pass a command, you can use the ",Object(l.b)("inlineCode",{parentName:"p"},"--command")," or ",Object(l.b)("inlineCode",{parentName:"p"},"-c")," argument followed by your command."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls\nbin media srv\ndev mnt sys\ndocker-entrypoint.d opt tmp\ndocker-entrypoint.sh proc usr\netc root var\nhome run www\nlib sbin\n")),Object(l.b)("p",null,"To pass several arguments, you can separate them with a comma or send different ",Object(l.b)("inlineCode",{parentName:"p"},"--command"),"."),Object(l.b)("p",null,Object(l.b)("inlineCode",{parentName:"p"},"qovery shell --command ls --command -l"),"\n",Object(l.b)("inlineCode",{parentName:"p"},"qovery shell --command ls,-l"),"\n",Object(l.b)("inlineCode",{parentName:"p"},"qovery shell -c ls,-l")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --command ls --command -l\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 bin\ndrwxr-xr-x 5 root root 360 Dec 21 09:46 dev\ndrwxr-xr-x 1 root root 41 Dec 20 20:13 docker-entrypoint.d\n-rwxr-xr-x 1 root root 1620 Dec 20 20:13 docker-entrypoint.sh\ndrwxr-xr-x 1 root root 25 Dec 21 09:46 etc\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 home\ndrwxr-xr-x 1 root root 61 Dec 20 22:11 lib\ndrwxr-xr-x 5 root root 44 Nov 30 09:32 media\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 mnt\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 opt\ndr-xr-xr-x 209 root root 0 Dec 21 09:46 proc\ndrwx------ 1 root root 26 Dec 21 10:38 root\ndrwxr-xr-x 1 root root 23 Dec 21 09:46 run\ndrwxr-xr-x 2 root root 4096 Nov 30 09:32 sbin\ndrwxr-xr-x 2 root root 6 Nov 30 09:32 srv\ndr-xr-xr-x 13 root root 0 Dec 21 09:46 sys\ndrwxrwxrwt 2 root root 6 Nov 30 09:32 tmp\ndrwxr-xr-x 1 root root 66 Nov 30 09:32 usr\ndrwxr-xr-x 1 root root 19 Nov 30 09:32 var\ndrwxr-xr-x 2 root root 59 Dec 21 09:45 www\n")),Object(l.b)("h3",{id:"shell-in-a-dedicated-pod"},"Shell in a dedicated pod"),Object(l.b)("p",null,"If your application is running on several pods, you can shell directly in a dedicated one by using the ",Object(l.b)("inlineCode",{parentName:"p"},"--pod")," or ",Object(l.b)("inlineCode",{parentName:"p"},"-p")," argument followed by your pod name."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --pod app-5f65fb5c4-frontend-5f65db5c4b-q4w11\n")),Object(l.b)("h3",{id:"shell-in-a-dedicated-container"},"Shell in a dedicated container"),Object(l.b)("p",null,"If you have several containers in your pod, you can shell directly in a dedicated one by using the ",Object(l.b)("inlineCode",{parentName:"p"},"--container")," argument followed by your container name."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery shell --container app-5f65fb5c4-frontend\n")),Object(l.b)("h2",{id:"generate-api-token"},"Generate API token"),Object(l.b)("p",null,"To use the Qovery API you will need to generate an authentication token. To generate an API token you can install the CLI and type"),Object(l.b)(i.a,{type:"warning",mdxType:"Alert"},Object(l.b)("p",null,"Never share your API token with anyone.")),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ qovery token\n\nQovery: Select organization\nOrganization:\n\u2714 My Organization\nChoose a token name\nToken name: Romaric\nChoose a token description\nToken description: used for Github Actions\nQovery: ---- Never share this authentication token and keep it secure ----\nQovery: qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691\nQovery: ---- Never share this authentication token and keep it secure ----\n")),Object(l.b)("p",null,"To use your token and list your organizations."),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-shell"}),"curl -X GET -H 'Authorization: Token qov_4LnEg2wFxxxxxHObGSQ22rjBZZyyyySgyR6Y_2500882691' https://api.qovery.com/organization\n")),Object(l.b)(i.a,{type:"info",mdxType:"Alert"},Object(l.b)("p",null,"The token can be used to interact programmatically with our API (directly, via our Terraform Provider etc..).\nIf you get a 424 error while trying to create new applications from one of your git repository, please make sure that the Organization Owner has access to the repository you are configuring for your app.")),Object(l.b)("p",null,"Check out our ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://api-doc.qovery.com"}),"API documentation")),Object(l.b)("h2",{id:"managing-services-and-environments"},"Managing services and environments"),Object(l.b)("p",null,"The CLI allows you to manage and deploy the environment and services within your organization"),Object(l.b)("p",null,"###\xa0application, container, lifecycle, cronjob\nThese commands allow you to manage all these services via the CLI. You can run the following actions on these services:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"cancel: Cancel the service deployment"),Object(l.b)("li",{parentName:"ul"},"delete: Delete a service"),Object(l.b)("li",{parentName:"ul"},"deploy: Deploy a service"),Object(l.b)("li",{parentName:"ul"},"list: List the service of the specified type"),Object(l.b)("li",{parentName:"ul"},"redeploy: Redeploy a service (already deployed before)"),Object(l.b)("li",{parentName:"ul"},"stop: Stop a service")),Object(l.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command) "),Object(l.b)("p",null,"Example: Listing applications and triggering a deployment"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | STOPPED | 2023-02-02 14:48:05.339652 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n\n$ qovery application deploy -n "backend"\nDeploying application backend in progress..\n\n$ qovery application list\nName | Type | Status | Last Update \nbackend | Application | RUNNING | 2023-02-13 12:59:23.228231 +0000 UTC\nfront-end | Application | STOPPED | 2023-02-09 14:04:38.079792 +0000 UTC\n')),Object(l.b)("h3",{id:"environment"},"Environment"),Object(l.b)("p",null,"The command ",Object(l.b)("inlineCode",{parentName:"p"},"environment")," allow you to manage a specific environment via the CLI. You can run the following actions on environments:"),Object(l.b)("ul",null,Object(l.b)("li",{parentName:"ul"},"cancel: Cancel an environment deployment"),Object(l.b)("li",{parentName:"ul"},"clone: Clone an environment"),Object(l.b)("li",{parentName:"ul"},"delete: Delete an environment"),Object(l.b)("li",{parentName:"ul"},"deploy: Deploy an environment"),Object(l.b)("li",{parentName:"ul"},"list: List environments"),Object(l.b)("li",{parentName:"ul"},"redeploy: Redeploy an environment"),Object(l.b)("li",{parentName:"ul"},"stage: Manage deployment stages"),Object(l.b)("li",{parentName:"ul"},"stop: Stop an environment")),Object(l.b)("p",null,"Each action allows you to specify additional parameters to define the service you want to modify (you can find them via the --help command)"),Object(l.b)("p",null,"Example: Manage deployment stages and triggering deployment"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'~ $ qovery environment stage list\n\n# deployment stage 1: "DATABASE DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nDATABASE | Redis\nDATABASE | DB\n\n\n# deployment stage 2: "JOB DEFAULT"\nRename me to avoid default/legacy ordering\n\n\n\n\n# deployment stage 3: "CONTAINER DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nCONTAINER | Rabbitmq\n\n\n# deployment stage 4: "APPLICATION DEFAULT"\nRename me to avoid default/legacy ordering\n\nType | Name\nAPPLICATION | Backend\nAPPLICATION | Frontend\nAPPLICATION | Pablo Backend App\nAPPLICATION | API gateway\n\n~ $ qovery environment deploy\nEnvironment is deploying!\n')),Object(l.b)("h2",{id:"managing-the-deployment-pipeline"},"Managing the Deployment Pipeline"),Object(l.b)("p",null,"In the following sections we will describe how to modify the Deployment Pipeline. "),Object(l.b)("h3",{id:"list-stages"},"List stages"),Object(l.b)("p",null,"You can list all the stages of your environment by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage list\n")),Object(l.b)("h3",{id:"add-a-stage"},"Add a stage"),Object(l.b)("p",null,"You can add a new stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage create -n -d \n")),Object(l.b)("p",null,"Note that the stage will be added at the end of the pipeline (the highest number)"),Object(l.b)("h3",{id:"modify-a-stage"},"Modify a stage"),Object(l.b)("p",null,"You can modify a stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage edit -n --new-name --new-description \n")),Object(l.b)("h3",{id:"delete-a-stage"},"Delete a stage"),Object(l.b)("p",null,"You can modify a stage by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage delete -n \n")),Object(l.b)("h3",{id:"change-stage-for-a-service"},"Change stage for a service"),Object(l.b)("p",null,"You can modify the stage associated to a service by using the following command:"),Object(l.b)("pre",null,Object(l.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"qovery environment stage move -n --stage \n")),Object(l.b)("h2",{id:"support"},"Support"),Object(l.b)("p",null,"Do you have any issues with Qovery CLI? ",Object(l.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/issues"}),"Open an issue"),"."))}d.isMDXComponent=!0},424:function(e,n,t){"use strict";t(426);var a=t(0),o=t.n(a),l=t(423),r=t.n(l);t(132);n.a=function(e){var n=e.children,t=e.classNames,a=e.fill,l=e.icon,c=e.type,i=null;switch(c){case"danger":i="alert-triangle";break;case"success":i="check-circle";break;case"warning":i="alert-triangle";break;default:i="info"}return o.a.createElement("div",{className:r()(t,"alert","alert--"+c,{"alert--fill":a,"alert--icon":!1!==l}),role:"alert"},!1!==l&&o.a.createElement("i",{className:r()("feather","icon-"+(l||i))}),n)}},437:function(e,n,t){"use strict";var a=t(1),o=(t(442),t(439),t(52),t(29),t(22),t(21),t(0)),l=t.n(o),r=t(447),c=t(423),i=t.n(c),s=t(433),b=t.n(s),p=t(446),u=37,d=39;function m(e){var n=e.block,t=e.centered,a=e.changeSelectedValue,o=e.className,r=e.handleKeydown,c=e.style,s=e.values,b=e.selectedValue,p=e.tabRefs;return l.a.createElement("div",{className:t?"tabs--centered":null},l.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:i()("tabs",o,{"tabs--block":n}),style:c},s.map((function(e){var n=e.value,t=e.label;return l.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===n,className:i()("tab-item",{"tab-item--active":b===n}),key:n,ref:function(e){return p.push(e)},onKeyDown:function(e){return r(p,e.target,e)},onFocus:function(){return a(n)},onClick:function(){return a(n)}},t)}))))}function h(e){var n=e.placeholder,t=e.selectedValue,a=e.changeSelectedValue,o=e.size,c=e.values,i=c;if(i[0].group){var s=_.groupBy(i,"group");i=Object.keys(s).map((function(e){return{label:e,options:s[e]}}))}return l.a.createElement(r.a,{className:"react-select-container react-select--"+o,classNamePrefix:"react-select",options:i,isClearable:t,placeholder:n,value:c.find((function(e){return e.value==t})),onChange:function(e){return a(e?e.value:null)}})}n.a=function(e){e.block,e.centered;var n=e.children,t=e.defaultValue,r=e.groupId,c=e.label,i=e.placeholder,s=e.select,y=e.size,g=(e.style,e.values),v=e.urlKey,O=Object(p.a)(),j=O.tabGroupChoices,f=O.setTabGroupChoices,N=Object(o.useState)(t),w=N[0],x=N[1];if(null!=r){var C=j[r];null!=C&&C!==w&&x(C)}var T=function(e){x(e),null!=r&&f(r,e)},I=[],k=function(e,n,t){switch(t.keyCode){case d:!function(e,n){var t=e.indexOf(n)+1;e[t]?e[t].focus():e[0].focus()}(e,n);break;case u:!function(e,n){var t=e.indexOf(n)-1;e[t]?e[t].focus():e[e.length-1].focus()}(e,n)}};return Object(o.useEffect)((function(){if("undefined"!=typeof window&&window.location&&v){var e=b.a.parse(window.location.search);e[v]&&x(e[v])}}),[]),l.a.createElement(l.a.Fragment,null,l.a.createElement("div",{className:"margin-bottom--"+(y||"md")},c&&l.a.createElement("div",{className:"margin-vert--sm"},c),g.length>1&&(s?l.a.createElement(h,Object(a.a)({changeSelectedValue:T,handleKeydown:k,placeholder:i,selectedValue:w,size:y,tabRefs:I},e)):l.a.createElement(m,Object(a.a)({changeSelectedValue:T,handleKeydown:k,selectedValue:w,tabRefs:I},e)))),o.Children.toArray(n).filter((function(e){return e.props.value===w}))[0])}},443:function(e,n,t){"use strict";var a=t(0),o=t.n(a);n.a=function(e){return o.a.createElement(o.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/d9deea5f.4add985c.js b/d9deea5f.f3635678.js similarity index 99% rename from d9deea5f.4add985c.js rename to d9deea5f.f3635678.js index 1817a08c89..f624693512 100644 --- a/d9deea5f.4add985c.js +++ b/d9deea5f.f3635678.js @@ -1,2 +1,2 @@ -/*! For license information please see d9deea5f.4add985c.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[228],{380:function(n,t,e){"use strict";e.r(t);var r=e(0),u=e.n(r),i=e(445),o=e(516),a=e(430);t.default=function(n){var t=n.metadata.category,e=n.items;return u.a.createElement(i.a,{title:t.title+" Guides",description:"All "+t.title+" guides"},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,t.title," Guides"),t.description&&u.a.createElement("div",{className:"hero--subtitle"},t.description),u.a.createElement("div",null,u.a.createElement(a.a,{to:"/guides"},"View All Guides")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(o.a,{items:e,staggered:null!=e[0].content.metadata.seriesPosition})))}},423:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},445:function(n,t,e){"use strict";e(457);var r=e(0),u=e.n(r),i=e(458),o=e(443),a=e(1),c=(e(446),e(447),e(459),e(430)),l=e(460),f=e(440),s=e.n(f),v=e(461),h=e.n(v),d=e(436),p=e(423),D=e.n(p),g=e(135),_=e.n(g),m=function(){return u.a.createElement("span",{className:D()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:D()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(a.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},u.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(R,n))}))):null)}))),(f||o)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(z,{alt:f.alt,url:v})):u.a.createElement(z,{alt:f.alt,url:v})),u.a.createElement("small",null,o),u.a.createElement("br",null))))},W=e(462),M=e(463),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.favicon,a=(e.tagline,e.title),c=e.themeConfig.image,l=e.url,f=n.children,s=n.title,v=n.noFooter,h=n.description,p=n.image,D=n.keywords,g=(n.permalink,n.version),_=s?s+" | "+a:a,m=p||c,y=l+Object(F.a)(m),b=Object(F.a)(r),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(o.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&u.a.createElement("title",null,_),_&&u.a.createElement("meta",{property:"og:title",content:_}),r&&u.a.createElement("link",{rel:"shortcut icon",href:b}),h&&u.a.createElement("meta",{name:"description",content:h}),h&&u.a.createElement("meta",{property:"og:description",content:h}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),D&&D.length&&u.a.createElement("meta",{name:"keywords",content:D.join(",")}),m&&u.a.createElement("meta",{property:"og:image",content:y}),m&&u.a.createElement("meta",{property:"twitter:image",content:y}),m&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),w&&u.a.createElement("meta",{property:"og:url",content:w}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&u.a.createElement("link",{rel:"canonical",href:w})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},f),!v&&u.a.createElement(T,null)))}},450:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),o=e(423),a=e.n(o),c=e(436),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,o=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),o.children):i.a.createElement(n,o)}}},451:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",D="[object Number]",g="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",A="[object Int8Array]",x="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,R=/&(?:amp|lt|gt|quot|#39);/g,z=/[&<>"']/g,T=RegExp(R.source),W=RegExp(z.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(V.source),K=/^\s+|\s+$/g,H=/^\s+/,Q=/\s+$/,J=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,on=/^0b[01]+$/i,an=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",Dn="["+dn+"]",gn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",An="(?:"+yn+"|"+bn+")",xn="(?:"+kn+"|"+bn+")",jn="(?:"+gn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+gn+"?",gn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(gn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),Rn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[Dn,kn,"$"].join("|")+")",xn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[Dn,kn+An,"$"].join("|")+")",kn+"?"+An+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),zn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[A]=Un[x]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[D]=Un[g]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[A]=Pn[x]=Pn[j]=Pn[p]=Pn[D]=Pn[g]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Gn=parseInt,Vn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Kn=Vn||Zn||Function("return this")(),Hn=t&&!t.nodeType&&t,Qn=Hn&&"object"==typeof r&&r&&!r.nodeType&&r,Jn=Qn&&Qn.exports===Hn,Yn=Jn&&Vn.process,Xn=function(){try{var n=Qn&&Qn.require&&Qn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function ot(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function at(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function Rt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var zt=At({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return zn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Ht=function n(t){var e,r=(t=null==t?Kn:Ht.defaults(Kn.Object(),t,Ht.pick(Kn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,Dn=t.Object,gn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=Dn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,An=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",xn=En.toString,jn=Fn.call(Dn),On=Kn._,Nn=gn("^"+Fn.call(Cn).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Jn?t.Buffer:void 0,Ln=t.Symbol,zn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Vn=Pt(Dn.getPrototypeOf,Dn),Zn=Dn.create,Hn=En.propertyIsEnumerable,Qn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,At=function(){try{var n=Xu(Dn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Qt=t.clearTimeout!==Kn.clearTimeout&&t.clearTimeout,Jt=u&&u.now!==Kn.Date.now&&u.now,Yt=t.setTimeout!==Kn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=Dn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(Dn.keys,Dn),oe=pn.max,ae=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),De=Xu(t,"WeakMap"),ge=Xu(Dn,"create"),_e=De&&new De,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(De),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,Ae=Ce?Ce.toString:void 0;function xe(n){if(qo(n)&&!Io(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return Ai(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!$o(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Qe(n,t,e,r,u,i){var o,a=1&t,l=2&t,v=4&t;if(e&&(o=u?e(n,r,u,i):e(n)),void 0!==o)return o;if(!$o(n))return n;var E=Io(n);if(E){if(o=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!a)return gu(n,o)}else{var I=ei(n),S=I==h||I==d;if(zo(n))return su(n,a);if(I==g||I==c||S&&!u){if(o=l||S?{}:ui(n),!a)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,ba(t),n)}(o,n)):function(n,t){return _u(n,ni(n),t)}(n,Ve(o,n))}else{if(!Pn[I])return u?n:{};o=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case A:case x:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case D:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?Dn(ke.call(u)):{}}var u}(n,I,a)}}i||(i=new ze);var L=i.get(n);if(L)return L;i.set(n,o),Ho(n)?n.forEach((function(r){o.add(Qe(r,t,e,r,n,i))})):Go(n)&&n.forEach((function(r,u){o.set(u,Qe(r,t,e,u,n,i))}));var R=E?void 0:(v?l?Vu:Gu:l?ba:ya)(n);return ct(R||n,(function(r,u){R&&(r=n[u=r]),$e(o,u,Qe(r,t,e,u,n,i))})),o}function Je(n,t,e){var r=e.length;if(null==n)return!r;for(n=Dn(n);r--;){var u=e[r],i=t[u],o=n[u];if(void 0===o&&!(u in n)||!i(o))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,o=!0,a=n.length,c=[],l=t.length;if(!a)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,o=!1):t.length>=200&&(i=It,o=!1,t=new Re(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Ju(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Ju(this,n).get(n)},Le.prototype.has=function(n){return Ju(this,n).has(n)},Le.prototype.set=function(n,t){var e=Ju(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},Re.prototype.add=Re.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Re.prototype.has=function(n){return this.__data__.has(n)},ze.prototype.clear=function(){this.__data__=new Se,this.size=0},ze.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},ze.prototype.get=function(n){return this.__data__.get(n)},ze.prototype.has=function(n){return this.__data__.has(n)},ze.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(a)?t>1?ir(a,t-1,e,r,u):pt(u,a):r||(u[u.length]=a)}return u}var or=Eu(),ar=Eu(!0);function cr(n,t){return n&&or(n,t,ya)}function lr(n,t){return n&&ar(n,t,ya)}function fr(n,t){return st(t,(function(t){return Mo(n[t])}))}function sr(n,t){for(var e=0,r=(t=au(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function Dr(n,t){return null!=n&&t in Dn(n)}function gr(n,t,e){for(var u=e?ht:vt,i=n[0].length,o=n.length,a=o,c=r(o),l=1/0,f=[];a--;){var s=n[a];a&&t&&(s=dt(s,Nt(t))),l=ae(s.length,l),c[a]=!e&&(t||i>=120&&s.length>=120)?new Re(a&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=a)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)a!==n&&Qn.call(a,c,1),Qn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;oi(u)?Qn.call(n,u,1):Xr(n,u)}}return n}function Rr(n,t){return n+ne(fe()*(t-n+1))}function zr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Va),n+"")}function Wr(n){return We(ja(n))}function Mr(n,t){var e=ja(n);return wi(e,He(t,0,e.length))}function Ur(n,t,e,r){if(!$o(n))return n;for(var u=-1,i=(t=au(t,n)).length,o=i-1,a=n;null!=a&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var o=r(i);++u>>1,o=n[i];null!==o&&!Jo(o)&&(e?o<=t:o=200){var l=t?null:zu(n);if(l)return qt(l);o=!1,u=It,c=new Re}else c=t?[]:a;n:for(;++r=r?n:Gr(n,t,e)}var fu=Qt||function(n){return Kn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new zn(t).set(new zn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Jo(n),o=void 0!==t,a=null===t,c=t==t,l=Jo(t);if(!a&&!l&&!i&&n>t||i&&o&&c&&!a&&!l||r&&o&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,o=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,o&&ai(e[0],e[1],o)&&(i=u<3?void 0:i,u=1),t=Dn(t);++r-1?u[i?t[o]:o]:void 0}}function Au(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var o=t[r];if("function"!=typeof o)throw new mn(i);if(u&&!a&&"wrapper"==Ku(o))var a=new Ne([],!0)}for(r=a?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Kn&&this instanceof g&&(C=D||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Jr(e),r=Jr(r)):(e=Qr(e),r=Qr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Qu())),Tr((function(e){var r=this;return n(t,(function(n){return ot(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Jr(t)).length;if(e<2)return e?zr(t,n):t;var r=zr(t,Xt(n/Vt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&ai(t,e,u)&&(e=u=void 0),t=ea(t),void 0===e?(e=t,t=0):e=ea(e),function(n,t,e,u){for(var i=-1,o=oe(Xt((t-n)/(e||1)),0),a=r(o);o--;)a[u?o:++i]=n,n+=e;return a}(t,e,u=void 0===u?ta))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new Re:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(J,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(a,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function no(n){var t=xe(n);return t.__chain__=!0,t}function to(n,t){return t(n)}var eo=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return Ke(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&oi(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:to,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ro=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var uo=ku(Ni),io=ku(Bi);function oo(n,t){return(Io(n)?ct:nr)(n,Qu(t,3))}function ao(n,t){return(Io(n)?lt:tr)(n,Qu(t,3))}var co=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var lo=Tr((function(n,t,e){var u=-1,i="function"==typeof t,o=Lo(n)?r(n.length):[];return nr(n,(function(n){o[++u]=i?ot(t,n,e):_r(n,t,e)})),o})),fo=mu((function(n,t,e){Ze(n,e,t)}));function so(n,t){return(Io(n)?dt:Ar)(n,Qu(t,3))}var vo=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ho=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&ai(n,t[0],t[1])?t=[]:e>2&&ai(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),po=Jt||function(){return Kn.Date.now()};function Do(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function go(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=ra(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var _o=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Hu(_o));r|=32}return Wu(n,r,t,e,u)})),mo=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Hu(mo));r|=32}return Wu(t,r,n,e,u)}));function yo(n,t,e){var r,u,o,a,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,a=n.apply(i,e)}function p(n){return f=n,c=mi(g,t),s?d(n):a}function D(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=o}function g(){var n=po();if(D(n))return _(n);c=mi(g,function(n){var e=t-(n-l);return v?ae(e,o-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,a)}function m(){var n=po(),e=D(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(g,t),d(l)}return void 0===c&&(c=mi(g,t)),a}return t=ia(t)||0,$o(e)&&(s=!!e.leading,o=(v="maxWait"in e)?oe(ia(e.maxWait)||0,t):o,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?a:_(po())},m}var bo=Tr((function(n,t){return Ye(n,1,t)})),Eo=Tr((function(n,t,e){return Ye(n,ia(t)||0,e)}));function wo(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var o=n.apply(this,r);return e.cache=i.set(u,o)||i,o};return e.cache=new(wo.Cache||Le),e}function Fo(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}wo.Cache=Le;var Co=cu((function(n,t){var e=(t=1==t.length&&Io(t[0])?dt(t[0],Nt(Qu())):dt(ir(t,1),Nt(Qu()))).length;return Tr((function(r){for(var u=-1,i=ae(r.length,e);++u=t})),Bo=mr(function(){return arguments}())?mr:function(n){return qo(n)&&Cn.call(n,"callee")&&!Hn.call(n,"callee")},Io=r.isArray,So=nt?Nt(nt):function(n){return qo(n)&&hr(n)==w};function Lo(n){return null!=n&&Po(n.length)&&!Mo(n)}function Ro(n){return qo(n)&&Lo(n)}var zo=ee||ic,To=tt?Nt(tt):function(n){return qo(n)&&hr(n)==s};function Wo(n){if(!qo(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Zo(n)}function Mo(n){if(!$o(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Uo(n){return"number"==typeof n&&n==ra(n)}function Po(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function $o(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function qo(n){return null!=n&&"object"==typeof n}var Go=et?Nt(et):function(n){return qo(n)&&ei(n)==p};function Vo(n){return"number"==typeof n||qo(n)&&hr(n)==D}function Zo(n){if(!qo(n)||hr(n)!=g)return!1;var t=Vn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Ko=rt?Nt(rt):function(n){return qo(n)&&hr(n)==_};var Ho=ut?Nt(ut):function(n){return qo(n)&&ei(n)==m};function Qo(n){return"string"==typeof n||!Io(n)&&qo(n)&&hr(n)==y}function Jo(n){return"symbol"==typeof n||qo(n)&&hr(n)==b}var Yo=it?Nt(it):function(n){return qo(n)&&Po(n.length)&&!!Un[hr(n)]};var Xo=Su(kr),na=Su((function(n,t){return n<=t}));function ta(n){if(!n)return[];if(Lo(n))return Qo(n)?Zt(n):gu(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:ja)(n)}function ea(n){return n?(n=ia(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function ra(n){var t=ea(n),e=t%1;return t==t?e?t-e:t:0}function ua(n){return n?He(ra(n),0,4294967295):0}function ia(n){if("number"==typeof n)return n;if(Jo(n))return NaN;if($o(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=$o(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(K,"");var e=on.test(n);return e||cn.test(n)?Gn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function oa(n){return _u(n,ba(n))}function aa(n){return null==n?"":Jr(n)}var ca=yu((function(n,t){if(si(t)||Lo(t))_u(t,ya(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),la=yu((function(n,t){_u(t,ba(t),n)})),fa=yu((function(n,t,e,r){_u(t,ba(t),n,r)})),sa=yu((function(n,t,e,r){_u(t,ya(t),n,r)})),va=qu(Ke);var ha=Tr((function(n,t){n=Dn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&ai(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Vu(n),e),r&&(e=Qe(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Ca=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return Da(n,e)}))}(n,t)}));function ka(n,t){if(null==n)return{};var e=dt(Vu(n),(function(n){return[n]}));return t=Qu(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var Aa=Tu(ya),xa=Tu(ba);function ja(n){return null==n?[]:Bt(n,ya(n))}var Oa=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?Na(t):t)}));function Na(n){return Wa(aa(n).toLowerCase())}function Ba(n){return(n=aa(n))&&n.replace(fn,zt).replace(Sn,"")}var Ia=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),Sa=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),La=wu("toLowerCase");var Ra=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var za=Fu((function(n,t,e){return n+(e?" ":"")+Wa(t)}));var Ta=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wa=wu("toUpperCase");function Ma(n,t,e){return n=aa(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(Rn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Ua=Tr((function(n,t){try{return ot(n,void 0,t)}catch(e){return Wo(e)?e:new hn(e)}})),Pa=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,_o(n[t],n))})),n}));function $a(n){return function(){return n}}var qa=Au(),Ga=Au(!0);function Va(n){return n}function Za(n){return wr("function"==typeof n?n:Qe(n,1))}var Ka=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ha=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Qa(n,t,e){var r=ya(t),u=fr(t,r);null!=e||$o(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,ya(t)));var i=!($o(e)&&"chain"in e&&!e.chain),o=Mo(n);return ct(u,(function(e){var r=t[e];n[e]=r,o&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=gu(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Ja(){}var Ya=Nu(dt),Xa=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var oc=Ou((function(n,t){return n+t}),0),ac=Ru("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=Ru("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=Ru("round"),hc=Ou((function(n,t){return n-t}),0);return xe.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=ra(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=Do,xe.assign=ca,xe.assignIn=la,xe.assignInWith=fa,xe.assignWith=sa,xe.at=va,xe.before=go,xe.bind=_o,xe.bindAll=Pa,xe.bindKey=mo,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Io(n)?n:[n]},xe.chain=no,xe.chunk=function(n,t,e){t=(e?ai(n,t,e):void 0===t)?1:oe(ra(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,o=0,a=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:ra(r))<0&&(r+=u),r=e>r?0:ua(r);e>>0)?(n=aa(n))&&("string"==typeof t||null!=t&&!Ko(t))&&!(t=Jr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},xe.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:oe(ra(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),ot(n,this,u)}))},xe.tail=function(n){var t=null==n?0:n.length;return t?Gr(n,1,t):[]},xe.take=function(n,t,e){return n&&n.length?Gr(n,0,(t=e||void 0===t?1:ra(t))<0?0:t):[]},xe.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Gr(n,(t=r-(t=e||void 0===t?1:ra(t)))<0?0:t,r):[]},xe.takeRightWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return $o(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),yo(n,t,{leading:r,maxWait:t,trailing:u})},xe.thru=to,xe.toArray=ta,xe.toPairs=Aa,xe.toPairsIn=xa,xe.toPath=function(n){return Io(n)?dt(n,Ci):Jo(n)?[n]:gu(Fi(aa(n)))},xe.toPlainObject=oa,xe.transform=function(n,t,e){var r=Io(n),u=r||zo(n)||Yo(n);if(t=Qu(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:$o(n)&&Mo(i)?je(Vn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},xe.unary=function(n){return Do(n,1)},xe.union=$i,xe.unionBy=qi,xe.unionWith=Gi,xe.uniq=function(n){return n&&n.length?Yr(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Yr(n,Qu(t,2)):[]},xe.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},xe.unset=function(n,t){return null==n||Xr(n,t)},xe.unzip=Vi,xe.unzipWith=Zi,xe.update=function(n,t,e){return null==n?n:nu(n,t,ou(e))},xe.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,ou(e),r)},xe.values=ja,xe.valuesIn=function(n){return null==n?[]:Bt(n,ba(n))},xe.without=Ki,xe.words=Ma,xe.wrap=function(n,t){return ko(ou(t),n)},xe.xor=Hi,xe.xorBy=Qi,xe.xorWith=Ji,xe.zip=Yi,xe.zipObject=function(n,t){return uu(n||[],t||[],$e)},xe.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},xe.zipWith=Xi,xe.entries=Aa,xe.entriesIn=xa,xe.extend=la,xe.extendWith=fa,Qa(xe,xe),xe.add=oc,xe.attempt=Ua,xe.camelCase=Oa,xe.capitalize=Na,xe.ceil=ac,xe.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=ia(e))==e?e:0),void 0!==t&&(t=(t=ia(t))==t?t:0),He(ia(n),t,e)},xe.clone=function(n){return Qe(n,4)},xe.cloneDeep=function(n){return Qe(n,5)},xe.cloneDeepWith=function(n,t){return Qe(n,5,t="function"==typeof t?t:void 0)},xe.cloneWith=function(n,t){return Qe(n,4,t="function"==typeof t?t:void 0)},xe.conformsTo=function(n,t){return null==t||Je(n,t,ya(t))},xe.deburr=Ba,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=cc,xe.endsWith=function(n,t,e){n=aa(n),t=Jr(t);var r=n.length,u=e=void 0===e?r:He(ra(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},xe.eq=jo,xe.escape=function(n){return(n=aa(n))&&W.test(n)?n.replace(z,Tt):n},xe.escapeRegExp=function(n){return(n=aa(n))&&Z.test(n)?n.replace(V,"\\$&"):n},xe.every=function(n,t,e){var r=Io(n)?ft:er;return e&&ai(n,t,e)&&(t=void 0),r(n,Qu(t,3))},xe.find=uo,xe.findIndex=Ni,xe.findKey=function(n,t){return yt(n,Qu(t,3),cr)},xe.findLast=io,xe.findLastIndex=Bi,xe.findLastKey=function(n,t){return yt(n,Qu(t,3),lr)},xe.floor=lc,xe.forEach=oo,xe.forEachRight=ao,xe.forIn=function(n,t){return null==n?n:or(n,Qu(t,3),ba)},xe.forInRight=function(n,t){return null==n?n:ar(n,Qu(t,3),ba)},xe.forOwn=function(n,t){return n&&cr(n,Qu(t,3))},xe.forOwnRight=function(n,t){return n&&lr(n,Qu(t,3))},xe.get=pa,xe.gt=Oo,xe.gte=No,xe.has=function(n,t){return null!=n&&ri(n,t,pr)},xe.hasIn=Da,xe.head=Si,xe.identity=Va,xe.includes=function(n,t,e,r){n=Lo(n)?n:ja(n),e=e&&!r?ra(e):0;var u=n.length;return e<0&&(e=oe(u+e,0)),Qo(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},xe.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:ra(e);return u<0&&(u=oe(r+u,0)),Et(n,t,u)},xe.inRange=function(n,t,e){return t=ea(t),void 0===e?(e=t,t=0):e=ea(e),function(n,t,e){return n>=ae(t,e)&&n=-9007199254740991&&n<=9007199254740991},xe.isSet=Ho,xe.isString=Qo,xe.isSymbol=Jo,xe.isTypedArray=Yo,xe.isUndefined=function(n){return void 0===n},xe.isWeakMap=function(n){return qo(n)&&ei(n)==E},xe.isWeakSet=function(n){return qo(n)&&"[object WeakSet]"==hr(n)},xe.join=function(n,t){return null==n?"":ue.call(n,t)},xe.kebabCase=Ia,xe.last=Ti,xe.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=ra(e))<0?oe(r+u,0):ae(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},xe.lowerCase=Sa,xe.lowerFirst=La,xe.lt=Xo,xe.lte=na,xe.max=function(n){return n&&n.length?rr(n,Va,dr):void 0},xe.maxBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),dr):void 0},xe.mean=function(n){return Ct(n,Va)},xe.meanBy=function(n,t){return Ct(n,Qu(t,2))},xe.min=function(n){return n&&n.length?rr(n,Va,kr):void 0},xe.minBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),kr):void 0},xe.stubArray=uc,xe.stubFalse=ic,xe.stubObject=function(){return{}},xe.stubString=function(){return""},xe.stubTrue=function(){return!0},xe.multiply=sc,xe.nth=function(n,t){return n&&n.length?Nr(n,ra(t)):void 0},xe.noConflict=function(){return Kn._===this&&(Kn._=On),this},xe.noop=Ja,xe.now=po,xe.pad=function(n,t,e){n=aa(n);var r=(t=ra(t))?Vt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},xe.padEnd=function(n,t,e){n=aa(n);var r=(t=ra(t))?Vt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return ae(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return Rr(n,t)},xe.reduce=function(n,t,e){var r=Io(n)?Dt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,nr)},xe.reduceRight=function(n,t,e){var r=Io(n)?gt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,tr)},xe.repeat=function(n,t,e){return t=(e?ai(n,t,e):void 0===t)?1:ra(t),zr(aa(n),t)},xe.replace=function(){var n=arguments,t=aa(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,t,e){var r=-1,u=(t=au(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=ae(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Qu(t));++e=i)return n;var a=e-Vt(r);if(a<1)return r;var c=o?lu(o,0,a).join(""):n.slice(0,a);if(void 0===u)return c+r;if(o&&(a+=c.length-a),Ko(u)){if(n.slice(a).search(u)){var l,f=c;for(u.global||(u=gn(u.source,aa(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(n.indexOf(Jr(u),a)!=a){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},xe.unescape=function(n){return(n=aa(n))&&T.test(n)?n.replace(R,Kt):n},xe.uniqueId=function(n){var t=++kn;return aa(n)+t},xe.upperCase=Ta,xe.upperFirst=Wa,xe.each=oo,xe.eachRight=ao,xe.first=Si,Qa(xe,(fc={},cr(xe,(function(n,t){Cn.call(xe.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),xe.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){xe[n].placeholder=xe})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:oe(ra(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=ae(e,r.__takeCount__):r.__views__.push({size:ae(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Qu(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Va)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(Fo(Qu(n)))},Be.prototype.slice=function(n,t){n=ra(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=ra(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=xe[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(xe.prototype[t]=function(){var t=this.__wrapped__,o=r?[1]:arguments,a=t instanceof Be,c=o[0],l=a||Io(t),f=function(n){var t=u.apply(xe,pt([n],o));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=a&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,o);return p.__actions__.push({func:to,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,o):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Io(u)?u:[],n)}return this[e]((function(e){return t.apply(Io(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=xe[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[xu(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=gu(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=gu(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=gu(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Io(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=Ai(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:to,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,Xn&&(xe.prototype[Xn]=function(){return this}),xe}();Kn._=Ht,void 0===(u=function(){return Ht}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(456)(n))},454:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},455:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(473),e(439),e(78);var r=e(475),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},456:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},465:function(n,t,e){var r=e(30),u=e(54),i=e(27),o=e(26),a=e(466);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||a;return function(t,a,d){for(var p,D,g=i(t),_=u(g),m=r(a,d,3),y=o(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(D=m(p=_[b],b,g),n))if(e)E[b]=D;else if(D)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(n,t,e){var r=e(467);n.exports=function(n,t){return new(r(n))(t)}},467:function(n,t,e){var r=e(13),u=e(468),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},474:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(430),o=e(423),a=e.n(o);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,o=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:a()("badge","badge--rounded","badge--"+o)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},475:function(n,t,e){var r=e(476);n.exports=a;var u=Object.hasOwnProperty,i=/\s/g,o=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(o,"").replace(r(),"").replace(i,"-"))}a.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},476:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},480:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),o=(e(430),e(474)),a=e(423),c=e.n(a),l=e(455),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,a=n.tags,f=n.valuesOnly,v=Object(l.a)(a,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(o.a,Object(r.a)({key:t,valueOnly:f},n))})))}},516:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(428),e(439),e(430)),o=e(440),a=e.n(o),c=e(480),l=e(455),f=e(436),s=e(441);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),o=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),D=(t.last_modified_on,t.title),g=Object(l.a)(d,"guides"),_=g.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=g.find((function(n){return"language"==n.category})),b=y?y.value:null,E=g.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=g.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=g.find((function(n){return"cloud_provider"==n.category})),A=k?k.value:null,x=g.find((function(n){return"provider"==n.category})),j=x?x.value:null,O=g.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=g.find((function(n){return"source"==n.category})),I=B?B.value:null,S=g.find((function(n){return"sink"==n.category})),L=S?S.value:null,R=Object(f.a)().siteConfig.customFields.metadata,z=R.installation,T=R.sources,W=R.sinks,M=R.languages,U=R.frameworks,P=R.technologies,$=R.cloud_providers,q=R.providers,G=z.platforms,V=N&&G[N],Z=I&&T[I],K=L&&W[L],H=b&&M.find((function(n){return n.name===b})),Q=w&&U.find((function(n){return n.name===w})),J=C&&P.find((function(n){return n.name===C})),Y=A&&$.find((function(n){return n.name===A})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(V||Z),tn=null!=K,en=null;Q?en=r?Q.dark_logo_path:Q.logo_path:J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:X?en=r?X.dark_logo_path:X.logo_path:H?en=r?H.dark_logo_path:H.logo_path:V?en=V.logo_path:Z&&(en=Z.logo_path);var rn=null;return K&&(rn=K.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},o[0].name),u.a.createElement("h2",{title:D},h&&h+". ",p||D)),u.a.createElement("footer",null,en&&u.a.createElement(a.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(a.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(450),d=e(451),p=e.n(d),D=e(423),g=e.n(D);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,o=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),a=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(o).map((function(n,t){var e=a[n],l=o[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var o,a=(o=e,p.a.sortBy(o,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:g()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},a.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file +/*! For license information please see d9deea5f.f3635678.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[228],{380:function(n,t,e){"use strict";e.r(t);var r=e(0),u=e.n(r),i=e(445),o=e(516),a=e(430);t.default=function(n){var t=n.metadata.category,e=n.items;return u.a.createElement(i.a,{title:t.title+" Guides",description:"All "+t.title+" guides"},u.a.createElement("header",{className:"hero hero--clean"},u.a.createElement("div",{className:"container"},u.a.createElement("h1",null,t.title," Guides"),t.description&&u.a.createElement("div",{className:"hero--subtitle"},t.description),u.a.createElement("div",null,u.a.createElement(a.a,{to:"/guides"},"View All Guides")))),u.a.createElement("main",{className:"container container--s"},u.a.createElement(o.a,{items:e,staggered:null!=e[0].content.metadata.seriesPosition})))}},423:function(n,t,e){var r;!function(){"use strict";var e={}.hasOwnProperty;function u(){for(var n=[],t=0;t1?arguments[1]:void 0)}}),e(74)("find")},445:function(n,t,e){"use strict";e(457);var r=e(0),u=e.n(r),i=e(458),o=e(444),a=e(1),c=(e(448),e(449),e(459),e(430)),l=e(460),f=e(440),s=e.n(f),v=e(461),h=e.n(v),d=e(436),p=e(423),D=e.n(p),g=e(135),_=e.n(g),m=function(){return u.a.createElement("span",{className:D()(_.a.toggle,_.a.moon)})},y=function(){return u.a.createElement("span",{className:D()(_.a.toggle,_.a.sun)})},b=function(n){var t=Object(d.a)().isClient;return u.a.createElement(h.a,Object(a.a)({disabled:!t,icons:{checked:u.a.createElement(m,null),unchecked:u.a.createElement(y,null)}},n))};function E(){var n=Object(d.a)().siteConfig,t=(void 0===n?{}:n).customFields.metadata.latest_post,e=Date.parse(t.date),r=new Date,u=Math.abs(r-e),i=Math.ceil(u/864e5),o=null;return"undefined"!=typeof window&&(o=new Date(parseInt(window.localStorage.getItem("blogViewedAt")||"0"))),i<30&&(!o||o0&&u.a.createElement("div",{className:"row footer__links"},u.a.createElement("div",{className:"col col--5 footer__col"},u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement(s.a,{className:"navbar__logo",src:h,alt:"Qovery",width:"150",height:"auto"})),u.a.createElement("div",{className:"margin-bottom--md"},u.a.createElement("p",null,"Qovery is an Internal Developer Platform Helping 50.000+ Developers and Platform Engineers To Ship Faster.")),u.a.createElement("div",null,u.a.createElement("a",{href:"https://github.com/qovery",target:"_blank"},u.a.createElement("i",{className:"feather icon-github",alt:"Qovery's Github Repo"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://www.linkedin.com/company/qovery/",target:"_blank"},u.a.createElement("i",{className:"feather icon-rss",alt:"Qovery's Linkedin"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://twitter.com/qovery_",target:"_blank"},u.a.createElement("i",{className:"feather icon-twitter",alt:"Qovery's Twitter"})),"\xa0\xa0\xa0\xa0",u.a.createElement("a",{href:"https://discord.qovery.com",target:"_blank"},u.a.createElement("i",{className:"feather icon-message-circle",alt:"Qovery's Discord"})))),c.map((function(n,t){return u.a.createElement("div",{key:t,className:"col footer__col"},null!=n.title?u.a.createElement("h4",{className:"footer__title"},n.title):null,null!=n.items&&Array.isArray(n.items)&&n.items.length>0?u.a.createElement("ul",{className:"footer__items"},n.items.map((function(n,t){return n.html?u.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):u.a.createElement("li",{key:n.href||n.to,className:"footer__item"},u.a.createElement(R,n))}))):null)}))),(f||o)&&u.a.createElement("div",{className:"text--center"},f&&f.src&&u.a.createElement("div",{className:"margin-bottom--sm"},f.href?u.a.createElement("a",{href:f.href,target:"_blank",rel:"noopener noreferrer",className:L.a.footerLogoLink},u.a.createElement(z,{alt:f.alt,url:v})):u.a.createElement(z,{alt:f.alt,url:v})),u.a.createElement("small",null,o),u.a.createElement("br",null))))},W=e(462),M=e(463),U=e(3);e(138);t.a=function(n){var t=Object(d.a)().siteConfig,e=void 0===t?{}:t,r=e.favicon,a=(e.tagline,e.title),c=e.themeConfig.image,l=e.url,f=n.children,s=n.title,v=n.noFooter,h=n.description,p=n.image,D=n.keywords,g=(n.permalink,n.version),_=s?s+" | "+a:a,m=p||c,y=l+Object(F.a)(m),b=Object(F.a)(r),E=Object(U.h)(),w=E?"https://docs.qovery.com"+(E.pathname.endsWith("/")?E.pathname:E.pathname+"/"):null;return u.a.createElement(M.a,null,u.a.createElement(W.a,null,u.a.createElement(o.a,null,u.a.createElement("html",{lang:"en"}),u.a.createElement("meta",{httpEquiv:"x-ua-compatible",content:"ie=edge"}),_&&u.a.createElement("title",null,_),_&&u.a.createElement("meta",{property:"og:title",content:_}),r&&u.a.createElement("link",{rel:"shortcut icon",href:b}),h&&u.a.createElement("meta",{name:"description",content:h}),h&&u.a.createElement("meta",{property:"og:description",content:h}),g&&u.a.createElement("meta",{name:"docsearch:version",content:g}),D&&D.length&&u.a.createElement("meta",{name:"keywords",content:D.join(",")}),m&&u.a.createElement("meta",{property:"og:image",content:y}),m&&u.a.createElement("meta",{property:"twitter:image",content:y}),m&&u.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+_}),w&&u.a.createElement("meta",{property:"og:url",content:w}),u.a.createElement("meta",{name:"twitter:card",content:"summary"}),w&&u.a.createElement("link",{rel:"canonical",href:w})),u.a.createElement(i.a,null),u.a.createElement(B,null),u.a.createElement("div",{className:"main-wrapper"},f),!v&&u.a.createElement(T,null)))}},450:function(n,t,e){"use strict";var r=e(9),u=e(0),i=e.n(u),o=e(423),a=e.n(o),c=e(436),l=(e(139),e(140)),f=e.n(l);t.a=function(n){return function(t){var e,u=t.id,o=Object(r.a)(t,["id"]),l=Object(c.a)().siteConfig,s=(l=void 0===l?{}:l).themeConfig,v=(s=void 0===s?{}:s).navbar,h=(v=void 0===v?{}:v).hideOnScroll,d=void 0!==h&&h;return u?i.a.createElement(n,o,i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:a()("anchor",(e={},e[f.a.enhancedAnchor]=!d,e)),id:u}),i.a.createElement("a",{"aria-hidden":"true",tabIndex:"-1",className:"hash-link",href:"#"+u,title:"Direct link to heading"},"#"),o.children):i.a.createElement(n,o)}}},451:function(n,t,e){(function(n,r){var u;(function(){var i="Expected a function",o="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],c="[object Arguments]",l="[object Array]",f="[object Boolean]",s="[object Date]",v="[object Error]",h="[object Function]",d="[object GeneratorFunction]",p="[object Map]",D="[object Number]",g="[object Object]",_="[object RegExp]",m="[object Set]",y="[object String]",b="[object Symbol]",E="[object WeakMap]",w="[object ArrayBuffer]",F="[object DataView]",C="[object Float32Array]",k="[object Float64Array]",A="[object Int8Array]",x="[object Int16Array]",j="[object Int32Array]",O="[object Uint8Array]",N="[object Uint16Array]",B="[object Uint32Array]",I=/\b__p \+= '';/g,S=/\b(__p \+=) '' \+/g,L=/(__e\(.*?\)|\b__t\)) \+\n'';/g,R=/&(?:amp|lt|gt|quot|#39);/g,z=/[&<>"']/g,T=RegExp(R.source),W=RegExp(z.source),M=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,P=/<%=([\s\S]+?)%>/g,$=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/,G=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/[\\^$.*+?()[\]{}|]/g,Z=RegExp(V.source),K=/^\s+|\s+$/g,H=/^\s+/,Q=/\s+$/,J=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Y=/\{\n\/\* \[wrapped with (.+)\] \*/,X=/,? & /,nn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,tn=/\\(\\)?/g,en=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,rn=/\w*$/,un=/^[-+]0x[0-9a-f]+$/i,on=/^0b[01]+$/i,an=/^\[object .+?Constructor\]$/,cn=/^0o[0-7]+$/i,ln=/^(?:0|[1-9]\d*)$/,fn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,sn=/($^)/,vn=/['\n\r\u2028\u2029\\]/g,hn="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",dn="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pn="[\\ud800-\\udfff]",Dn="["+dn+"]",gn="["+hn+"]",_n="\\d+",mn="[\\u2700-\\u27bf]",yn="[a-z\\xdf-\\xf6\\xf8-\\xff]",bn="[^\\ud800-\\udfff"+dn+_n+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",En="\\ud83c[\\udffb-\\udfff]",wn="[^\\ud800-\\udfff]",Fn="(?:\\ud83c[\\udde6-\\uddff]){2}",Cn="[\\ud800-\\udbff][\\udc00-\\udfff]",kn="[A-Z\\xc0-\\xd6\\xd8-\\xde]",An="(?:"+yn+"|"+bn+")",xn="(?:"+kn+"|"+bn+")",jn="(?:"+gn+"|"+En+")"+"?",On="[\\ufe0e\\ufe0f]?"+jn+("(?:\\u200d(?:"+[wn,Fn,Cn].join("|")+")[\\ufe0e\\ufe0f]?"+jn+")*"),Nn="(?:"+[mn,Fn,Cn].join("|")+")"+On,Bn="(?:"+[wn+gn+"?",gn,Fn,Cn,pn].join("|")+")",In=RegExp("['\u2019]","g"),Sn=RegExp(gn,"g"),Ln=RegExp(En+"(?="+En+")|"+Bn+On,"g"),Rn=RegExp([kn+"?"+yn+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[Dn,kn,"$"].join("|")+")",xn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[Dn,kn+An,"$"].join("|")+")",kn+"?"+An+"+(?:['\u2019](?:d|ll|m|re|s|t|ve))?",kn+"+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_n,Nn].join("|"),"g"),zn=RegExp("[\\u200d\\ud800-\\udfff"+hn+"\\ufe0e\\ufe0f]"),Tn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Mn=-1,Un={};Un[C]=Un[k]=Un[A]=Un[x]=Un[j]=Un[O]=Un["[object Uint8ClampedArray]"]=Un[N]=Un[B]=!0,Un[c]=Un[l]=Un[w]=Un[f]=Un[F]=Un[s]=Un[v]=Un[h]=Un[p]=Un[D]=Un[g]=Un[_]=Un[m]=Un[y]=Un[E]=!1;var Pn={};Pn[c]=Pn[l]=Pn[w]=Pn[F]=Pn[f]=Pn[s]=Pn[C]=Pn[k]=Pn[A]=Pn[x]=Pn[j]=Pn[p]=Pn[D]=Pn[g]=Pn[_]=Pn[m]=Pn[y]=Pn[b]=Pn[O]=Pn["[object Uint8ClampedArray]"]=Pn[N]=Pn[B]=!0,Pn[v]=Pn[h]=Pn[E]=!1;var $n={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},qn=parseFloat,Gn=parseInt,Vn="object"==typeof n&&n&&n.Object===Object&&n,Zn="object"==typeof self&&self&&self.Object===Object&&self,Kn=Vn||Zn||Function("return this")(),Hn=t&&!t.nodeType&&t,Qn=Hn&&"object"==typeof r&&r&&!r.nodeType&&r,Jn=Qn&&Qn.exports===Hn,Yn=Jn&&Vn.process,Xn=function(){try{var n=Qn&&Qn.require&&Qn.require("util").types;return n||Yn&&Yn.binding&&Yn.binding("util")}catch(t){}}(),nt=Xn&&Xn.isArrayBuffer,tt=Xn&&Xn.isDate,et=Xn&&Xn.isMap,rt=Xn&&Xn.isRegExp,ut=Xn&&Xn.isSet,it=Xn&&Xn.isTypedArray;function ot(n,t,e){switch(e.length){case 0:return n.call(t);case 1:return n.call(t,e[0]);case 2:return n.call(t,e[0],e[1]);case 3:return n.call(t,e[0],e[1],e[2])}return n.apply(t,e)}function at(n,t,e,r){for(var u=-1,i=null==n?0:n.length;++u-1}function ht(n,t,e){for(var r=-1,u=null==n?0:n.length;++r-1;);return e}function Lt(n,t){for(var e=n.length;e--&&Et(t,n[e],0)>-1;);return e}function Rt(n,t){for(var e=n.length,r=0;e--;)n[e]===t&&++r;return r}var zt=At({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),Tt=At({"&":"&","<":"<",">":">",'"':""","'":"'"});function Wt(n){return"\\"+$n[n]}function Mt(n){return zn.test(n)}function Ut(n){var t=-1,e=Array(n.size);return n.forEach((function(n,r){e[++t]=[r,n]})),e}function Pt(n,t){return function(e){return n(t(e))}}function $t(n,t){for(var e=-1,r=n.length,u=0,i=[];++e",""":'"',"'":"'"});var Ht=function n(t){var e,r=(t=null==t?Kn:Ht.defaults(Kn.Object(),t,Ht.pick(Kn,Wn))).Array,u=t.Date,hn=t.Error,dn=t.Function,pn=t.Math,Dn=t.Object,gn=t.RegExp,_n=t.String,mn=t.TypeError,yn=r.prototype,bn=dn.prototype,En=Dn.prototype,wn=t["__core-js_shared__"],Fn=bn.toString,Cn=En.hasOwnProperty,kn=0,An=(e=/[^.]+$/.exec(wn&&wn.keys&&wn.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"",xn=En.toString,jn=Fn.call(Dn),On=Kn._,Nn=gn("^"+Fn.call(Cn).replace(V,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bn=Jn?t.Buffer:void 0,Ln=t.Symbol,zn=t.Uint8Array,$n=Bn?Bn.allocUnsafe:void 0,Vn=Pt(Dn.getPrototypeOf,Dn),Zn=Dn.create,Hn=En.propertyIsEnumerable,Qn=yn.splice,Yn=Ln?Ln.isConcatSpreadable:void 0,Xn=Ln?Ln.iterator:void 0,mt=Ln?Ln.toStringTag:void 0,At=function(){try{var n=Xu(Dn,"defineProperty");return n({},"",{}),n}catch(t){}}(),Qt=t.clearTimeout!==Kn.clearTimeout&&t.clearTimeout,Jt=u&&u.now!==Kn.Date.now&&u.now,Yt=t.setTimeout!==Kn.setTimeout&&t.setTimeout,Xt=pn.ceil,ne=pn.floor,te=Dn.getOwnPropertySymbols,ee=Bn?Bn.isBuffer:void 0,re=t.isFinite,ue=yn.join,ie=Pt(Dn.keys,Dn),oe=pn.max,ae=pn.min,ce=u.now,le=t.parseInt,fe=pn.random,se=yn.reverse,ve=Xu(t,"DataView"),he=Xu(t,"Map"),de=Xu(t,"Promise"),pe=Xu(t,"Set"),De=Xu(t,"WeakMap"),ge=Xu(Dn,"create"),_e=De&&new De,me={},ye=ki(ve),be=ki(he),Ee=ki(de),we=ki(pe),Fe=ki(De),Ce=Ln?Ln.prototype:void 0,ke=Ce?Ce.valueOf:void 0,Ae=Ce?Ce.toString:void 0;function xe(n){if(qo(n)&&!Io(n)&&!(n instanceof Be)){if(n instanceof Ne)return n;if(Cn.call(n,"__wrapped__"))return Ai(n)}return new Ne(n)}var je=function(){function n(){}return function(t){if(!$o(t))return{};if(Zn)return Zn(t);n.prototype=t;var e=new n;return n.prototype=void 0,e}}();function Oe(){}function Ne(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=void 0}function Be(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Ie(n){var t=-1,e=null==n?0:n.length;for(this.clear();++t=t?n:t)),n}function Qe(n,t,e,r,u,i){var o,a=1&t,l=2&t,v=4&t;if(e&&(o=u?e(n,r,u,i):e(n)),void 0!==o)return o;if(!$o(n))return n;var E=Io(n);if(E){if(o=function(n){var t=n.length,e=new n.constructor(t);t&&"string"==typeof n[0]&&Cn.call(n,"index")&&(e.index=n.index,e.input=n.input);return e}(n),!a)return gu(n,o)}else{var I=ei(n),S=I==h||I==d;if(zo(n))return su(n,a);if(I==g||I==c||S&&!u){if(o=l||S?{}:ui(n),!a)return l?function(n,t){return _u(n,ti(n),t)}(n,function(n,t){return n&&_u(t,ba(t),n)}(o,n)):function(n,t){return _u(n,ni(n),t)}(n,Ve(o,n))}else{if(!Pn[I])return u?n:{};o=function(n,t,e){var r=n.constructor;switch(t){case w:return vu(n);case f:case s:return new r(+n);case F:return function(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}(n,e);case C:case k:case A:case x:case j:case O:case"[object Uint8ClampedArray]":case N:case B:return hu(n,e);case p:return new r;case D:case y:return new r(n);case _:return function(n){var t=new n.constructor(n.source,rn.exec(n));return t.lastIndex=n.lastIndex,t}(n);case m:return new r;case b:return u=n,ke?Dn(ke.call(u)):{}}var u}(n,I,a)}}i||(i=new ze);var L=i.get(n);if(L)return L;i.set(n,o),Ho(n)?n.forEach((function(r){o.add(Qe(r,t,e,r,n,i))})):Go(n)&&n.forEach((function(r,u){o.set(u,Qe(r,t,e,u,n,i))}));var R=E?void 0:(v?l?Vu:Gu:l?ba:ya)(n);return ct(R||n,(function(r,u){R&&(r=n[u=r]),$e(o,u,Qe(r,t,e,u,n,i))})),o}function Je(n,t,e){var r=e.length;if(null==n)return!r;for(n=Dn(n);r--;){var u=e[r],i=t[u],o=n[u];if(void 0===o&&!(u in n)||!i(o))return!1}return!0}function Ye(n,t,e){if("function"!=typeof n)throw new mn(i);return mi((function(){n.apply(void 0,e)}),t)}function Xe(n,t,e,r){var u=-1,i=vt,o=!0,a=n.length,c=[],l=t.length;if(!a)return c;e&&(t=dt(t,Nt(e))),r?(i=ht,o=!1):t.length>=200&&(i=It,o=!1,t=new Re(t));n:for(;++u-1},Se.prototype.set=function(n,t){var e=this.__data__,r=qe(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this},Le.prototype.clear=function(){this.size=0,this.__data__={hash:new Ie,map:new(he||Se),string:new Ie}},Le.prototype.delete=function(n){var t=Ju(this,n).delete(n);return this.size-=t?1:0,t},Le.prototype.get=function(n){return Ju(this,n).get(n)},Le.prototype.has=function(n){return Ju(this,n).has(n)},Le.prototype.set=function(n,t){var e=Ju(this,n),r=e.size;return e.set(n,t),this.size+=e.size==r?0:1,this},Re.prototype.add=Re.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Re.prototype.has=function(n){return this.__data__.has(n)},ze.prototype.clear=function(){this.__data__=new Se,this.size=0},ze.prototype.delete=function(n){var t=this.__data__,e=t.delete(n);return this.size=t.size,e},ze.prototype.get=function(n){return this.__data__.get(n)},ze.prototype.has=function(n){return this.__data__.has(n)},ze.prototype.set=function(n,t){var e=this.__data__;if(e instanceof Se){var r=e.__data__;if(!he||r.length<199)return r.push([n,t]),this.size=++e.size,this;e=this.__data__=new Le(r)}return e.set(n,t),this.size=e.size,this};var nr=bu(cr),tr=bu(lr,!0);function er(n,t){var e=!0;return nr(n,(function(n,r,u){return e=!!t(n,r,u)})),e}function rr(n,t,e){for(var r=-1,u=n.length;++r0&&e(a)?t>1?ir(a,t-1,e,r,u):pt(u,a):r||(u[u.length]=a)}return u}var or=Eu(),ar=Eu(!0);function cr(n,t){return n&&or(n,t,ya)}function lr(n,t){return n&&ar(n,t,ya)}function fr(n,t){return st(t,(function(t){return Mo(n[t])}))}function sr(n,t){for(var e=0,r=(t=au(t,n)).length;null!=n&&et}function pr(n,t){return null!=n&&Cn.call(n,t)}function Dr(n,t){return null!=n&&t in Dn(n)}function gr(n,t,e){for(var u=e?ht:vt,i=n[0].length,o=n.length,a=o,c=r(o),l=1/0,f=[];a--;){var s=n[a];a&&t&&(s=dt(s,Nt(t))),l=ae(s.length,l),c[a]=!e&&(t||i>=120&&s.length>=120)?new Re(a&&s):void 0}s=n[0];var v=-1,h=c[0];n:for(;++v=a)return c;var l=e[r];return c*("desc"==l?-1:1)}}return n.index-t.index}(n,t,e)}))}function Ir(n,t,e){for(var r=-1,u=t.length,i={};++r-1;)a!==n&&Qn.call(a,c,1),Qn.call(n,c,1);return n}function Lr(n,t){for(var e=n?t.length:0,r=e-1;e--;){var u=t[e];if(e==r||u!==i){var i=u;oi(u)?Qn.call(n,u,1):Xr(n,u)}}return n}function Rr(n,t){return n+ne(fe()*(t-n+1))}function zr(n,t){var e="";if(!n||t<1||t>9007199254740991)return e;do{t%2&&(e+=n),(t=ne(t/2))&&(n+=n)}while(t);return e}function Tr(n,t){return yi(di(n,t,Va),n+"")}function Wr(n){return We(ja(n))}function Mr(n,t){var e=ja(n);return wi(e,He(t,0,e.length))}function Ur(n,t,e,r){if(!$o(n))return n;for(var u=-1,i=(t=au(t,n)).length,o=i-1,a=n;null!=a&&++ui?0:i+t),(e=e>i?i:e)<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var o=r(i);++u>>1,o=n[i];null!==o&&!Jo(o)&&(e?o<=t:o=200){var l=t?null:zu(n);if(l)return qt(l);o=!1,u=It,c=new Re}else c=t?[]:a;n:for(;++r=r?n:Gr(n,t,e)}var fu=Qt||function(n){return Kn.clearTimeout(n)};function su(n,t){if(t)return n.slice();var e=n.length,r=$n?$n(e):new n.constructor(e);return n.copy(r),r}function vu(n){var t=new n.constructor(n.byteLength);return new zn(t).set(new zn(n)),t}function hu(n,t){var e=t?vu(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function du(n,t){if(n!==t){var e=void 0!==n,r=null===n,u=n==n,i=Jo(n),o=void 0!==t,a=null===t,c=t==t,l=Jo(t);if(!a&&!l&&!i&&n>t||i&&o&&c&&!a&&!l||r&&o&&c||!e&&c||!u)return 1;if(!r&&!i&&!l&&n1?e[u-1]:void 0,o=u>2?e[2]:void 0;for(i=n.length>3&&"function"==typeof i?(u--,i):void 0,o&&ai(e[0],e[1],o)&&(i=u<3?void 0:i,u=1),t=Dn(t);++r-1?u[i?t[o]:o]:void 0}}function Au(n){return qu((function(t){var e=t.length,r=e,u=Ne.prototype.thru;for(n&&t.reverse();r--;){var o=t[r];if("function"!=typeof o)throw new mn(i);if(u&&!a&&"wrapper"==Ku(o))var a=new Ne([],!0)}for(r=a?r:e;++r1&&m.reverse(),s&&l<_&&(m.length=l),this&&this!==Kn&&this instanceof g&&(C=D||Cu(C)),C.apply(F,m)}}function ju(n,t){return function(e,r){return function(n,t,e,r){return cr(n,(function(n,u,i){t(r,e(n),u,i)})),r}(e,n,t(r),{})}}function Ou(n,t){return function(e,r){var u;if(void 0===e&&void 0===r)return t;if(void 0!==e&&(u=e),void 0!==r){if(void 0===u)return r;"string"==typeof e||"string"==typeof r?(e=Jr(e),r=Jr(r)):(e=Qr(e),r=Qr(r)),u=n(e,r)}return u}}function Nu(n){return qu((function(t){return t=dt(t,Nt(Qu())),Tr((function(e){var r=this;return n(t,(function(n){return ot(n,r,e)}))}))}))}function Bu(n,t){var e=(t=void 0===t?" ":Jr(t)).length;if(e<2)return e?zr(t,n):t;var r=zr(t,Xt(n/Vt(t)));return Mt(t)?lu(Zt(r),0,n).join(""):r.slice(0,n)}function Iu(n){return function(t,e,u){return u&&"number"!=typeof u&&ai(t,e,u)&&(e=u=void 0),t=ea(t),void 0===e?(e=t,t=0):e=ea(e),function(n,t,e,u){for(var i=-1,o=oe(Xt((t-n)/(e||1)),0),a=r(o);o--;)a[u?o:++i]=n,n+=e;return a}(t,e,u=void 0===u?ta))return!1;var l=i.get(n);if(l&&i.get(t))return l==t;var f=-1,s=!0,v=2&e?new Re:void 0;for(i.set(n,t),i.set(t,n);++f-1&&n%1==0&&n1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(J,"{\n/* [wrapped with "+t+"] */\n")}(r,function(n,t){return ct(a,(function(e){var r="_."+e[0];t&e[1]&&!vt(n,r)&&n.push(r)})),n.sort()}(function(n){var t=n.match(Y);return t?t[1].split(X):[]}(r),e)))}function Ei(n){var t=0,e=0;return function(){var r=ce(),u=16-(r-e);if(e=r,u>0){if(++t>=800)return arguments[0]}else t=0;return n.apply(void 0,arguments)}}function wi(n,t){var e=-1,r=n.length,u=r-1;for(t=void 0===t?r:t;++e1?n[t-1]:void 0;return e="function"==typeof e?(n.pop(),e):void 0,Zi(n,e)}));function no(n){var t=xe(n);return t.__chain__=!0,t}function to(n,t){return t(n)}var eo=qu((function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,u=function(t){return Ke(t,n)};return!(t>1||this.__actions__.length)&&r instanceof Be&&oi(e)?((r=r.slice(e,+e+(t?1:0))).__actions__.push({func:to,args:[u],thisArg:void 0}),new Ne(r,this.__chain__).thru((function(n){return t&&!n.length&&n.push(void 0),n}))):this.thru(u)}));var ro=mu((function(n,t,e){Cn.call(n,e)?++n[e]:Ze(n,e,1)}));var uo=ku(Ni),io=ku(Bi);function oo(n,t){return(Io(n)?ct:nr)(n,Qu(t,3))}function ao(n,t){return(Io(n)?lt:tr)(n,Qu(t,3))}var co=mu((function(n,t,e){Cn.call(n,e)?n[e].push(t):Ze(n,e,[t])}));var lo=Tr((function(n,t,e){var u=-1,i="function"==typeof t,o=Lo(n)?r(n.length):[];return nr(n,(function(n){o[++u]=i?ot(t,n,e):_r(n,t,e)})),o})),fo=mu((function(n,t,e){Ze(n,e,t)}));function so(n,t){return(Io(n)?dt:Ar)(n,Qu(t,3))}var vo=mu((function(n,t,e){n[e?0:1].push(t)}),(function(){return[[],[]]}));var ho=Tr((function(n,t){if(null==n)return[];var e=t.length;return e>1&&ai(n,t[0],t[1])?t=[]:e>2&&ai(t[0],t[1],t[2])&&(t=[t[0]]),Br(n,ir(t,1),[])})),po=Jt||function(){return Kn.Date.now()};function Do(n,t,e){return t=e?void 0:t,Wu(n,128,void 0,void 0,void 0,void 0,t=n&&null==t?n.length:t)}function go(n,t){var e;if("function"!=typeof t)throw new mn(i);return n=ra(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=void 0),e}}var _o=Tr((function(n,t,e){var r=1;if(e.length){var u=$t(e,Hu(_o));r|=32}return Wu(n,r,t,e,u)})),mo=Tr((function(n,t,e){var r=3;if(e.length){var u=$t(e,Hu(mo));r|=32}return Wu(t,r,n,e,u)}));function yo(n,t,e){var r,u,o,a,c,l,f=0,s=!1,v=!1,h=!0;if("function"!=typeof n)throw new mn(i);function d(t){var e=r,i=u;return r=u=void 0,f=t,a=n.apply(i,e)}function p(n){return f=n,c=mi(g,t),s?d(n):a}function D(n){var e=n-l;return void 0===l||e>=t||e<0||v&&n-f>=o}function g(){var n=po();if(D(n))return _(n);c=mi(g,function(n){var e=t-(n-l);return v?ae(e,o-(n-f)):e}(n))}function _(n){return c=void 0,h&&r?d(n):(r=u=void 0,a)}function m(){var n=po(),e=D(n);if(r=arguments,u=this,l=n,e){if(void 0===c)return p(l);if(v)return fu(c),c=mi(g,t),d(l)}return void 0===c&&(c=mi(g,t)),a}return t=ia(t)||0,$o(e)&&(s=!!e.leading,o=(v="maxWait"in e)?oe(ia(e.maxWait)||0,t):o,h="trailing"in e?!!e.trailing:h),m.cancel=function(){void 0!==c&&fu(c),f=0,r=l=u=c=void 0},m.flush=function(){return void 0===c?a:_(po())},m}var bo=Tr((function(n,t){return Ye(n,1,t)})),Eo=Tr((function(n,t,e){return Ye(n,ia(t)||0,e)}));function wo(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new mn(i);var e=function(){var r=arguments,u=t?t.apply(this,r):r[0],i=e.cache;if(i.has(u))return i.get(u);var o=n.apply(this,r);return e.cache=i.set(u,o)||i,o};return e.cache=new(wo.Cache||Le),e}function Fo(n){if("function"!=typeof n)throw new mn(i);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}wo.Cache=Le;var Co=cu((function(n,t){var e=(t=1==t.length&&Io(t[0])?dt(t[0],Nt(Qu())):dt(ir(t,1),Nt(Qu()))).length;return Tr((function(r){for(var u=-1,i=ae(r.length,e);++u=t})),Bo=mr(function(){return arguments}())?mr:function(n){return qo(n)&&Cn.call(n,"callee")&&!Hn.call(n,"callee")},Io=r.isArray,So=nt?Nt(nt):function(n){return qo(n)&&hr(n)==w};function Lo(n){return null!=n&&Po(n.length)&&!Mo(n)}function Ro(n){return qo(n)&&Lo(n)}var zo=ee||ic,To=tt?Nt(tt):function(n){return qo(n)&&hr(n)==s};function Wo(n){if(!qo(n))return!1;var t=hr(n);return t==v||"[object DOMException]"==t||"string"==typeof n.message&&"string"==typeof n.name&&!Zo(n)}function Mo(n){if(!$o(n))return!1;var t=hr(n);return t==h||t==d||"[object AsyncFunction]"==t||"[object Proxy]"==t}function Uo(n){return"number"==typeof n&&n==ra(n)}function Po(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=9007199254740991}function $o(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function qo(n){return null!=n&&"object"==typeof n}var Go=et?Nt(et):function(n){return qo(n)&&ei(n)==p};function Vo(n){return"number"==typeof n||qo(n)&&hr(n)==D}function Zo(n){if(!qo(n)||hr(n)!=g)return!1;var t=Vn(n);if(null===t)return!0;var e=Cn.call(t,"constructor")&&t.constructor;return"function"==typeof e&&e instanceof e&&Fn.call(e)==jn}var Ko=rt?Nt(rt):function(n){return qo(n)&&hr(n)==_};var Ho=ut?Nt(ut):function(n){return qo(n)&&ei(n)==m};function Qo(n){return"string"==typeof n||!Io(n)&&qo(n)&&hr(n)==y}function Jo(n){return"symbol"==typeof n||qo(n)&&hr(n)==b}var Yo=it?Nt(it):function(n){return qo(n)&&Po(n.length)&&!!Un[hr(n)]};var Xo=Su(kr),na=Su((function(n,t){return n<=t}));function ta(n){if(!n)return[];if(Lo(n))return Qo(n)?Zt(n):gu(n);if(Xn&&n[Xn])return function(n){for(var t,e=[];!(t=n.next()).done;)e.push(t.value);return e}(n[Xn]());var t=ei(n);return(t==p?Ut:t==m?qt:ja)(n)}function ea(n){return n?(n=ia(n))===1/0||n===-1/0?17976931348623157e292*(n<0?-1:1):n==n?n:0:0===n?n:0}function ra(n){var t=ea(n),e=t%1;return t==t?e?t-e:t:0}function ua(n){return n?He(ra(n),0,4294967295):0}function ia(n){if("number"==typeof n)return n;if(Jo(n))return NaN;if($o(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=$o(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(K,"");var e=on.test(n);return e||cn.test(n)?Gn(n.slice(2),e?2:8):un.test(n)?NaN:+n}function oa(n){return _u(n,ba(n))}function aa(n){return null==n?"":Jr(n)}var ca=yu((function(n,t){if(si(t)||Lo(t))_u(t,ya(t),n);else for(var e in t)Cn.call(t,e)&&$e(n,e,t[e])})),la=yu((function(n,t){_u(t,ba(t),n)})),fa=yu((function(n,t,e,r){_u(t,ba(t),n,r)})),sa=yu((function(n,t,e,r){_u(t,ya(t),n,r)})),va=qu(Ke);var ha=Tr((function(n,t){n=Dn(n);var e=-1,r=t.length,u=r>2?t[2]:void 0;for(u&&ai(t[0],t[1],u)&&(r=1);++e1),t})),_u(n,Vu(n),e),r&&(e=Qe(e,7,Pu));for(var u=t.length;u--;)Xr(e,t[u]);return e}));var Ca=qu((function(n,t){return null==n?{}:function(n,t){return Ir(n,t,(function(t,e){return Da(n,e)}))}(n,t)}));function ka(n,t){if(null==n)return{};var e=dt(Vu(n),(function(n){return[n]}));return t=Qu(t),Ir(n,e,(function(n,e){return t(n,e[0])}))}var Aa=Tu(ya),xa=Tu(ba);function ja(n){return null==n?[]:Bt(n,ya(n))}var Oa=Fu((function(n,t,e){return t=t.toLowerCase(),n+(e?Na(t):t)}));function Na(n){return Wa(aa(n).toLowerCase())}function Ba(n){return(n=aa(n))&&n.replace(fn,zt).replace(Sn,"")}var Ia=Fu((function(n,t,e){return n+(e?"-":"")+t.toLowerCase()})),Sa=Fu((function(n,t,e){return n+(e?" ":"")+t.toLowerCase()})),La=wu("toLowerCase");var Ra=Fu((function(n,t,e){return n+(e?"_":"")+t.toLowerCase()}));var za=Fu((function(n,t,e){return n+(e?" ":"")+Wa(t)}));var Ta=Fu((function(n,t,e){return n+(e?" ":"")+t.toUpperCase()})),Wa=wu("toUpperCase");function Ma(n,t,e){return n=aa(n),void 0===(t=e?void 0:t)?function(n){return Tn.test(n)}(n)?function(n){return n.match(Rn)||[]}(n):function(n){return n.match(nn)||[]}(n):n.match(t)||[]}var Ua=Tr((function(n,t){try{return ot(n,void 0,t)}catch(e){return Wo(e)?e:new hn(e)}})),Pa=qu((function(n,t){return ct(t,(function(t){t=Ci(t),Ze(n,t,_o(n[t],n))})),n}));function $a(n){return function(){return n}}var qa=Au(),Ga=Au(!0);function Va(n){return n}function Za(n){return wr("function"==typeof n?n:Qe(n,1))}var Ka=Tr((function(n,t){return function(e){return _r(e,n,t)}})),Ha=Tr((function(n,t){return function(e){return _r(n,e,t)}}));function Qa(n,t,e){var r=ya(t),u=fr(t,r);null!=e||$o(t)&&(u.length||!r.length)||(e=t,t=n,n=this,u=fr(t,ya(t)));var i=!($o(e)&&"chain"in e&&!e.chain),o=Mo(n);return ct(u,(function(e){var r=t[e];n[e]=r,o&&(n.prototype[e]=function(){var t=this.__chain__;if(i||t){var e=n(this.__wrapped__),u=e.__actions__=gu(this.__actions__);return u.push({func:r,args:arguments,thisArg:n}),e.__chain__=t,e}return r.apply(n,pt([this.value()],arguments))})})),n}function Ja(){}var Ya=Nu(dt),Xa=Nu(ft),nc=Nu(_t);function tc(n){return ci(n)?kt(Ci(n)):function(n){return function(t){return sr(t,n)}}(n)}var ec=Iu(),rc=Iu(!0);function uc(){return[]}function ic(){return!1}var oc=Ou((function(n,t){return n+t}),0),ac=Ru("ceil"),cc=Ou((function(n,t){return n/t}),1),lc=Ru("floor");var fc,sc=Ou((function(n,t){return n*t}),1),vc=Ru("round"),hc=Ou((function(n,t){return n-t}),0);return xe.after=function(n,t){if("function"!=typeof t)throw new mn(i);return n=ra(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=Do,xe.assign=ca,xe.assignIn=la,xe.assignInWith=fa,xe.assignWith=sa,xe.at=va,xe.before=go,xe.bind=_o,xe.bindAll=Pa,xe.bindKey=mo,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return Io(n)?n:[n]},xe.chain=no,xe.chunk=function(n,t,e){t=(e?ai(n,t,e):void 0===t)?1:oe(ra(t),0);var u=null==n?0:n.length;if(!u||t<1)return[];for(var i=0,o=0,a=r(Xt(u/t));iu?0:u+e),(r=void 0===r||r>u?u:ra(r))<0&&(r+=u),r=e>r?0:ua(r);e>>0)?(n=aa(n))&&("string"==typeof t||null!=t&&!Ko(t))&&!(t=Jr(t))&&Mt(n)?lu(Zt(n),0,e):n.split(t,e):[]},xe.spread=function(n,t){if("function"!=typeof n)throw new mn(i);return t=null==t?0:oe(ra(t),0),Tr((function(e){var r=e[t],u=lu(e,0,t);return r&&pt(u,r),ot(n,this,u)}))},xe.tail=function(n){var t=null==n?0:n.length;return t?Gr(n,1,t):[]},xe.take=function(n,t,e){return n&&n.length?Gr(n,0,(t=e||void 0===t?1:ra(t))<0?0:t):[]},xe.takeRight=function(n,t,e){var r=null==n?0:n.length;return r?Gr(n,(t=r-(t=e||void 0===t?1:ra(t)))<0?0:t,r):[]},xe.takeRightWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?tu(n,Qu(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,e){var r=!0,u=!0;if("function"!=typeof n)throw new mn(i);return $o(e)&&(r="leading"in e?!!e.leading:r,u="trailing"in e?!!e.trailing:u),yo(n,t,{leading:r,maxWait:t,trailing:u})},xe.thru=to,xe.toArray=ta,xe.toPairs=Aa,xe.toPairsIn=xa,xe.toPath=function(n){return Io(n)?dt(n,Ci):Jo(n)?[n]:gu(Fi(aa(n)))},xe.toPlainObject=oa,xe.transform=function(n,t,e){var r=Io(n),u=r||zo(n)||Yo(n);if(t=Qu(t,4),null==e){var i=n&&n.constructor;e=u?r?new i:[]:$o(n)&&Mo(i)?je(Vn(n)):{}}return(u?ct:cr)(n,(function(n,r,u){return t(e,n,r,u)})),e},xe.unary=function(n){return Do(n,1)},xe.union=$i,xe.unionBy=qi,xe.unionWith=Gi,xe.uniq=function(n){return n&&n.length?Yr(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Yr(n,Qu(t,2)):[]},xe.uniqWith=function(n,t){return t="function"==typeof t?t:void 0,n&&n.length?Yr(n,void 0,t):[]},xe.unset=function(n,t){return null==n||Xr(n,t)},xe.unzip=Vi,xe.unzipWith=Zi,xe.update=function(n,t,e){return null==n?n:nu(n,t,ou(e))},xe.updateWith=function(n,t,e,r){return r="function"==typeof r?r:void 0,null==n?n:nu(n,t,ou(e),r)},xe.values=ja,xe.valuesIn=function(n){return null==n?[]:Bt(n,ba(n))},xe.without=Ki,xe.words=Ma,xe.wrap=function(n,t){return ko(ou(t),n)},xe.xor=Hi,xe.xorBy=Qi,xe.xorWith=Ji,xe.zip=Yi,xe.zipObject=function(n,t){return uu(n||[],t||[],$e)},xe.zipObjectDeep=function(n,t){return uu(n||[],t||[],Ur)},xe.zipWith=Xi,xe.entries=Aa,xe.entriesIn=xa,xe.extend=la,xe.extendWith=fa,Qa(xe,xe),xe.add=oc,xe.attempt=Ua,xe.camelCase=Oa,xe.capitalize=Na,xe.ceil=ac,xe.clamp=function(n,t,e){return void 0===e&&(e=t,t=void 0),void 0!==e&&(e=(e=ia(e))==e?e:0),void 0!==t&&(t=(t=ia(t))==t?t:0),He(ia(n),t,e)},xe.clone=function(n){return Qe(n,4)},xe.cloneDeep=function(n){return Qe(n,5)},xe.cloneDeepWith=function(n,t){return Qe(n,5,t="function"==typeof t?t:void 0)},xe.cloneWith=function(n,t){return Qe(n,4,t="function"==typeof t?t:void 0)},xe.conformsTo=function(n,t){return null==t||Je(n,t,ya(t))},xe.deburr=Ba,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=cc,xe.endsWith=function(n,t,e){n=aa(n),t=Jr(t);var r=n.length,u=e=void 0===e?r:He(ra(e),0,r);return(e-=t.length)>=0&&n.slice(e,u)==t},xe.eq=jo,xe.escape=function(n){return(n=aa(n))&&W.test(n)?n.replace(z,Tt):n},xe.escapeRegExp=function(n){return(n=aa(n))&&Z.test(n)?n.replace(V,"\\$&"):n},xe.every=function(n,t,e){var r=Io(n)?ft:er;return e&&ai(n,t,e)&&(t=void 0),r(n,Qu(t,3))},xe.find=uo,xe.findIndex=Ni,xe.findKey=function(n,t){return yt(n,Qu(t,3),cr)},xe.findLast=io,xe.findLastIndex=Bi,xe.findLastKey=function(n,t){return yt(n,Qu(t,3),lr)},xe.floor=lc,xe.forEach=oo,xe.forEachRight=ao,xe.forIn=function(n,t){return null==n?n:or(n,Qu(t,3),ba)},xe.forInRight=function(n,t){return null==n?n:ar(n,Qu(t,3),ba)},xe.forOwn=function(n,t){return n&&cr(n,Qu(t,3))},xe.forOwnRight=function(n,t){return n&&lr(n,Qu(t,3))},xe.get=pa,xe.gt=Oo,xe.gte=No,xe.has=function(n,t){return null!=n&&ri(n,t,pr)},xe.hasIn=Da,xe.head=Si,xe.identity=Va,xe.includes=function(n,t,e,r){n=Lo(n)?n:ja(n),e=e&&!r?ra(e):0;var u=n.length;return e<0&&(e=oe(u+e,0)),Qo(n)?e<=u&&n.indexOf(t,e)>-1:!!u&&Et(n,t,e)>-1},xe.indexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=null==e?0:ra(e);return u<0&&(u=oe(r+u,0)),Et(n,t,u)},xe.inRange=function(n,t,e){return t=ea(t),void 0===e?(e=t,t=0):e=ea(e),function(n,t,e){return n>=ae(t,e)&&n=-9007199254740991&&n<=9007199254740991},xe.isSet=Ho,xe.isString=Qo,xe.isSymbol=Jo,xe.isTypedArray=Yo,xe.isUndefined=function(n){return void 0===n},xe.isWeakMap=function(n){return qo(n)&&ei(n)==E},xe.isWeakSet=function(n){return qo(n)&&"[object WeakSet]"==hr(n)},xe.join=function(n,t){return null==n?"":ue.call(n,t)},xe.kebabCase=Ia,xe.last=Ti,xe.lastIndexOf=function(n,t,e){var r=null==n?0:n.length;if(!r)return-1;var u=r;return void 0!==e&&(u=(u=ra(e))<0?oe(r+u,0):ae(u,r-1)),t==t?function(n,t,e){for(var r=e+1;r--;)if(n[r]===t)return r;return r}(n,t,u):bt(n,Ft,u,!0)},xe.lowerCase=Sa,xe.lowerFirst=La,xe.lt=Xo,xe.lte=na,xe.max=function(n){return n&&n.length?rr(n,Va,dr):void 0},xe.maxBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),dr):void 0},xe.mean=function(n){return Ct(n,Va)},xe.meanBy=function(n,t){return Ct(n,Qu(t,2))},xe.min=function(n){return n&&n.length?rr(n,Va,kr):void 0},xe.minBy=function(n,t){return n&&n.length?rr(n,Qu(t,2),kr):void 0},xe.stubArray=uc,xe.stubFalse=ic,xe.stubObject=function(){return{}},xe.stubString=function(){return""},xe.stubTrue=function(){return!0},xe.multiply=sc,xe.nth=function(n,t){return n&&n.length?Nr(n,ra(t)):void 0},xe.noConflict=function(){return Kn._===this&&(Kn._=On),this},xe.noop=Ja,xe.now=po,xe.pad=function(n,t,e){n=aa(n);var r=(t=ra(t))?Vt(n):0;if(!t||r>=t)return n;var u=(t-r)/2;return Bu(ne(u),e)+n+Bu(Xt(u),e)},xe.padEnd=function(n,t,e){n=aa(n);var r=(t=ra(t))?Vt(n):0;return t&&rt){var r=n;n=t,t=r}if(e||n%1||t%1){var u=fe();return ae(n+u*(t-n+qn("1e-"+((u+"").length-1))),t)}return Rr(n,t)},xe.reduce=function(n,t,e){var r=Io(n)?Dt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,nr)},xe.reduceRight=function(n,t,e){var r=Io(n)?gt:xt,u=arguments.length<3;return r(n,Qu(t,4),e,u,tr)},xe.repeat=function(n,t,e){return t=(e?ai(n,t,e):void 0===t)?1:ra(t),zr(aa(n),t)},xe.replace=function(){var n=arguments,t=aa(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,t,e){var r=-1,u=(t=au(t,n)).length;for(u||(u=1,n=void 0);++r9007199254740991)return[];var e=4294967295,r=ae(n,4294967295);n-=4294967295;for(var u=Ot(r,t=Qu(t));++e=i)return n;var a=e-Vt(r);if(a<1)return r;var c=o?lu(o,0,a).join(""):n.slice(0,a);if(void 0===u)return c+r;if(o&&(a+=c.length-a),Ko(u)){if(n.slice(a).search(u)){var l,f=c;for(u.global||(u=gn(u.source,aa(rn.exec(u))+"g")),u.lastIndex=0;l=u.exec(f);)var s=l.index;c=c.slice(0,void 0===s?a:s)}}else if(n.indexOf(Jr(u),a)!=a){var v=c.lastIndexOf(u);v>-1&&(c=c.slice(0,v))}return c+r},xe.unescape=function(n){return(n=aa(n))&&T.test(n)?n.replace(R,Kt):n},xe.uniqueId=function(n){var t=++kn;return aa(n)+t},xe.upperCase=Ta,xe.upperFirst=Wa,xe.each=oo,xe.eachRight=ao,xe.first=Si,Qa(xe,(fc={},cr(xe,(function(n,t){Cn.call(xe.prototype,t)||(fc[t]=n)})),fc),{chain:!1}),xe.VERSION="4.17.15",ct(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(n){xe[n].placeholder=xe})),ct(["drop","take"],(function(n,t){Be.prototype[n]=function(e){e=void 0===e?1:oe(ra(e),0);var r=this.__filtered__&&!t?new Be(this):this.clone();return r.__filtered__?r.__takeCount__=ae(e,r.__takeCount__):r.__views__.push({size:ae(e,4294967295),type:n+(r.__dir__<0?"Right":"")}),r},Be.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}})),ct(["filter","map","takeWhile"],(function(n,t){var e=t+1,r=1==e||3==e;Be.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:Qu(n,3),type:e}),t.__filtered__=t.__filtered__||r,t}})),ct(["head","last"],(function(n,t){var e="take"+(t?"Right":"");Be.prototype[n]=function(){return this[e](1).value()[0]}})),ct(["initial","tail"],(function(n,t){var e="drop"+(t?"":"Right");Be.prototype[n]=function(){return this.__filtered__?new Be(this):this[e](1)}})),Be.prototype.compact=function(){return this.filter(Va)},Be.prototype.find=function(n){return this.filter(n).head()},Be.prototype.findLast=function(n){return this.reverse().find(n)},Be.prototype.invokeMap=Tr((function(n,t){return"function"==typeof n?new Be(this):this.map((function(e){return _r(e,n,t)}))})),Be.prototype.reject=function(n){return this.filter(Fo(Qu(n)))},Be.prototype.slice=function(n,t){n=ra(n);var e=this;return e.__filtered__&&(n>0||t<0)?new Be(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),void 0!==t&&(e=(t=ra(t))<0?e.dropRight(-t):e.take(t-n)),e)},Be.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Be.prototype.toArray=function(){return this.take(4294967295)},cr(Be.prototype,(function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),u=xe[r?"take"+("last"==t?"Right":""):t],i=r||/^find/.test(t);u&&(xe.prototype[t]=function(){var t=this.__wrapped__,o=r?[1]:arguments,a=t instanceof Be,c=o[0],l=a||Io(t),f=function(n){var t=u.apply(xe,pt([n],o));return r&&s?t[0]:t};l&&e&&"function"==typeof c&&1!=c.length&&(a=l=!1);var s=this.__chain__,v=!!this.__actions__.length,h=i&&!s,d=a&&!v;if(!i&&l){t=d?t:new Be(this);var p=n.apply(t,o);return p.__actions__.push({func:to,args:[f],thisArg:void 0}),new Ne(p,s)}return h&&d?n.apply(this,o):(p=this.thru(f),h?r?p.value()[0]:p.value():p)})})),ct(["pop","push","shift","sort","splice","unshift"],(function(n){var t=yn[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(r&&!this.__chain__){var u=this.value();return t.apply(Io(u)?u:[],n)}return this[e]((function(e){return t.apply(Io(e)?e:[],n)}))}})),cr(Be.prototype,(function(n,t){var e=xe[t];if(e){var r=e.name+"";Cn.call(me,r)||(me[r]=[]),me[r].push({name:t,func:e})}})),me[xu(void 0,2).name]=[{name:"wrapper",func:void 0}],Be.prototype.clone=function(){var n=new Be(this.__wrapped__);return n.__actions__=gu(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=gu(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=gu(this.__views__),n},Be.prototype.reverse=function(){if(this.__filtered__){var n=new Be(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},Be.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,e=Io(n),r=t<0,u=e?n.length:0,i=function(n,t,e){var r=-1,u=e.length;for(;++r=this.__values__.length;return{done:n,value:n?void 0:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var t,e=this;e instanceof Oe;){var r=Ai(e);r.__index__=0,r.__values__=void 0,t?u.__wrapped__=r:t=r;var u=r;e=e.__wrapped__}return u.__wrapped__=n,t},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof Be){var t=n;return this.__actions__.length&&(t=new Be(this)),(t=t.reverse()).__actions__.push({func:to,args:[Pi],thisArg:void 0}),new Ne(t,this.__chain__)}return this.thru(Pi)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return eu(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,Xn&&(xe.prototype[Xn]=function(){return this}),xe}();Kn._=Ht,void 0===(u=function(){return Ht}.call(t,e,t,r))||(r.exports=u)}).call(this)}).call(this,e(76),e(456)(n))},454:function(n,t,e){"use strict";var r=e(0),u=Object(r.createContext)({tabGroupChoices:{},setTabGroupChoices:function(){}});t.a=u},455:function(n,t,e){"use strict";e.d(t,"a",(function(){return i}));e(77),e(473),e(439),e(78);var r=e(475),u=e.n(r);function i(n,t){var e=new u.a;return n.map((function(n){var r=n;return"string"==typeof n&&(r={label:n,permalink:"/blog/tags/"+e.slug(n)}),function(n,t){var e=n.label.split(": ",2),r=e[0],u=e[1],i="primary";switch(t){case"blog":case"guides":i=function(n){switch(n){case"domain":return"blue";case"type":return"pink";default:return"primary"}}(r)}return{category:r,count:n.count,label:n.label,permalink:n.permalink,style:i,value:u}}(r,t)}))}},456:function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},465:function(n,t,e){var r=e(30),u=e(54),i=e(27),o=e(26),a=e(466);n.exports=function(n,t){var e=1==n,c=2==n,l=3==n,f=4==n,s=6==n,v=5==n||s,h=t||a;return function(t,a,d){for(var p,D,g=i(t),_=u(g),m=r(a,d,3),y=o(_.length),b=0,E=e?h(t,y):c?h(t,0):void 0;y>b;b++)if((v||b in _)&&(D=m(p=_[b],b,g),n))if(e)E[b]=D;else if(D)switch(n){case 3:return!0;case 5:return p;case 6:return b;case 2:E.push(p)}else if(f)return!1;return s?-1:l||f?f:E}}},466:function(n,t,e){var r=e(467);n.exports=function(n,t){return new(r(n))(t)}},467:function(n,t,e){var r=e(13),u=e(468),i=e(2)("species");n.exports=function(n){var t;return u(n)&&("function"!=typeof(t=n.constructor)||t!==Array&&!u(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},468:function(n,t,e){var r=e(23);n.exports=Array.isArray||function(n){return"Array"==r(n)}},474:function(n,t,e){"use strict";var r=e(0),u=e.n(r),i=e(430),o=e(423),a=e.n(o);t.a=function(n){var t=n.count,e=n.label,r=n.permalink,o=n.style,c=n.value,l=n.valueOnly;return u.a.createElement(i.a,{to:r+"/",className:a()("badge","badge--rounded","badge--"+o)},l?c:e,t&&u.a.createElement(u.a.Fragment,null," (",t,")"))}},475:function(n,t,e){var r=e(476);n.exports=a;var u=Object.hasOwnProperty,i=/\s/g,o=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~\u2019]/g;function a(){if(!(this instanceof a))return new a;this.reset()}function c(n,t){return"string"!=typeof n?"":(t||(n=n.toLowerCase()),n.trim().replace(o,"").replace(r(),"").replace(i,"-"))}a.prototype.slug=function(n,t){for(var e=c(n,!0===t),r=e;u.call(this.occurrences,e);)this.occurrences[r]++,e=r+"-"+this.occurrences[r];return this.occurrences[e]=0,e},a.prototype.reset=function(){this.occurrences=Object.create(null)},a.slug=c},476:function(n,t){n.exports=function(){return/[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g}},480:function(n,t,e){"use strict";var r=e(1),u=e(0),i=e.n(u),o=(e(430),e(474)),a=e(423),c=e.n(a),l=e(455),f=e(141),s=e.n(f);t.a=function(n){var t,e=n.block,u=n.colorProfile,a=n.tags,f=n.valuesOnly,v=Object(l.a)(a,u);return i.a.createElement("div",{className:c()(s.a.tags,(t={},t[s.a.tagsBlock]=e,t))},v.map((function(n,t){return i.a.createElement(o.a,Object(r.a)({key:t,valueOnly:f},n))})))}},516:function(n,t,e){"use strict";e(29),e(22),e(21),e(52);var r=e(0),u=e.n(r),i=(e(428),e(439),e(430)),o=e(440),a=e.n(o),c=e(480),l=e(455),f=e(436),s=e(441);e(142);var v=function(n){var t=n.frontMatter,e=n.metadata,r=(n.isGuidePage,Object(s.a)().isDarkTheme),o=e.categories,v=(e.description,e.permalink),h=(e.readingTime,e.seriesPosition),d=e.tags,p=(t.author_github,t.cover_label),D=(t.last_modified_on,t.title),g=Object(l.a)(d,"guides"),_=g.find((function(n){return"domain"==n.category})),m=_?_.value:"default",y=g.find((function(n){return"language"==n.category})),b=y?y.value:null,E=g.find((function(n){return"framework"==n.category})),w=E?E.value:null,F=g.find((function(n){return"technology"==n.category})),C=F?F.value:null,k=g.find((function(n){return"cloud_provider"==n.category})),A=k?k.value:null,x=g.find((function(n){return"provider"==n.category})),j=x?x.value:null,O=g.find((function(n){return"platform"==n.category})),N=O?O.value:null,B=g.find((function(n){return"source"==n.category})),I=B?B.value:null,S=g.find((function(n){return"sink"==n.category})),L=S?S.value:null,R=Object(f.a)().siteConfig.customFields.metadata,z=R.installation,T=R.sources,W=R.sinks,M=R.languages,U=R.frameworks,P=R.technologies,$=R.cloud_providers,q=R.providers,G=z.platforms,V=N&&G[N],Z=I&&T[I],K=L&&W[L],H=b&&M.find((function(n){return n.name===b})),Q=w&&U.find((function(n){return n.name===w})),J=C&&P.find((function(n){return n.name===C})),Y=A&&$.find((function(n){return n.name===A})),X=j&&q.find((function(n){return n.name===j})),nn=null!==(V||Z),tn=null!=K,en=null;Q?en=r?Q.dark_logo_path:Q.logo_path:J?en=r?J.dark_logo_path:J.logo_path:Y?en=r?Y.dark_logo_path:Y.logo_path:X?en=r?X.dark_logo_path:X.logo_path:H?en=r?H.dark_logo_path:H.logo_path:V?en=V.logo_path:Z&&(en=Z.logo_path);var rn=null;return K&&(rn=K.logo_path),u.a.createElement(i.a,{to:v+"/",className:"guide-item"},u.a.createElement("article",null,u.a.createElement("div",{className:"domain-bg domain-bg--"+m+" domain-bg--hover"},u.a.createElement("header",null,u.a.createElement("div",{className:"category"},o[0].name),u.a.createElement("h2",{title:D},h&&h+". ",p||D)),u.a.createElement("footer",null,en&&u.a.createElement(a.a,{src:en,className:"logo"}),!en&&nn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),rn&&u.a.createElement(a.a,{src:rn,className:"logo"}),!rn&&tn&&u.a.createElement("div",{className:"logo"},u.a.createElement("i",{className:"feather icon-server"})),!en&&!rn&&!nn&&!tn&&u.a.createElement(c.a,{colorProfile:"guides",tags:d}),u.a.createElement("div",{className:"action"},"read now")))))},h=e(450),d=e(451),p=e.n(d),D=e(423),g=e.n(D);e(143);function _(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered,o=p()(e).map((function(n){return n.content.metadata.categories[t-1]})).uniqBy("permalink").sortBy("title").keyBy("permalink").value(),a=p.a.groupBy(e,(function(n){return n.content.metadata.categories[t-1].permalink})),c=Object(h.a)("h"+(t+1));return Object.keys(o).map((function(n,t){var e=a[n],l=o[n];return u.a.createElement("section",{key:t},u.a.createElement(c,{id:n},l.title),l.description&&u.a.createElement("div",{className:"sub-title"},l.description),u.a.createElement(m,{items:e,large:r,staggered:i}))}))}function m(n){var t=n.groupLevel,e=n.items,r=n.large,i=n.staggered;if(t)return u.a.createElement(_,{groupLevel:t,items:e});var o,a=(o=e,p.a.sortBy(o,["content.metadata.seriesPosition",function(n){return n.content.metadata.coverLabel.toLowerCase()}]));return u.a.createElement("div",{className:"guides"},u.a.createElement("div",{className:g()("guide-items",{"guide-items--l":r,"guide-items--staggered":i})},a.map((function(n){var t=n.content;return u.a.createElement(v,{key:t.metadata.permalink,frontMatter:t.frontMatter,metadata:t.metadata,truncated:t.metadata.truncated},u.a.createElement(t,null))}))))}t.a=m}}]); \ No newline at end of file diff --git a/d9deea5f.4add985c.js.LICENSE.txt b/d9deea5f.f3635678.js.LICENSE.txt similarity index 100% rename from d9deea5f.4add985c.js.LICENSE.txt rename to d9deea5f.f3635678.js.LICENSE.txt diff --git a/db372ba8.afb302c4.js b/db372ba8.d2cc54a0.js similarity index 99% rename from db372ba8.afb302c4.js rename to db372ba8.d2cc54a0.js index 05f9917cb4..9820aa01a0 100644 --- a/db372ba8.afb302c4.js +++ b/db372ba8.d2cc54a0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[231],{383:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(425)),i=a(434),s=a(437),o=a(444),c=a(424),b=a(429),u=a(431),p={last_modified_on:"2023-04-24",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"14 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://onboarding.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with sign-in options will open."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(r.b)("p",null,"Congratulations, you are logged-in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),l=a.n(n),r=a(423),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},428:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),l=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(432),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(430),i=a(423),s=a.n(i);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},434:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(423),a(433)),i=a.n(r);a(134);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,a){"use strict";var n=a(1),l=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(449),s=a(423),o=a.n(s),c=a(433),b=a.n(c),u=a(448),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},444:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[231],{383:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return p})),a.d(t,"metadata",(function(){return d})),a.d(t,"rightToc",(function(){return m})),a.d(t,"default",(function(){return g}));var n=a(1),l=a(9),r=(a(0),a(425)),i=a(434),s=a(437),o=a(443),c=a(424),b=a(429),u=a(431),p={last_modified_on:"2023-04-24",$schema:"/.meta/.schemas/guides.json",title:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: rust"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"Create a blazingly fast REST API in Rust (Part 1/2)",description:"How to create a blazingly fast REST API in Rust, with zero-cost abstraction and very low overhead - Part 1/2",permalink:"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1",readingTime:"14 min read",source:"@site/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: rust",permalink:"/guides/tags/language-rust"}],title:"Create a blazingly fast REST API in Rust (Part 1/2)",truncated:!1,prevItem:{title:"Costs Control",permalink:"/guides/advanced/costs-control"},nextItem:{title:"Create a Playground Environment on AWS",permalink:"/guides/tutorial/create-a-playground-environment-on-aws"}},m=[{value:"Twitter clone",id:"twitter-clone",children:[{value:"API design",id:"api-design",children:[]}]},{value:"Implementation",id:"implementation",children:[{value:"Actix Web",id:"actix-web",children:[]},{value:"Let's code",id:"lets-code",children:[]},{value:"Validation",id:"validation",children:[]}]},{value:"PostgreSQL",id:"postgresql",children:[{value:"Diesel",id:"diesel",children:[]}]},{value:"Deployment",id:"deployment",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Deploying the app",id:"deploying-the-app",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Configure the connection to the database",id:"configure-the-connection-to-the-database",children:[]}]},{value:"Deploy your application",id:"deploy-your-application",children:[]},{value:"Live test",id:"live-test",children:[]},{value:"What's next",id:"whats-next",children:[]},{value:"Useful resources",id:"useful-resources",children:[]}],h={rightToc:m};function g(e){var t=e.components,a=Object(l.a)(e,["components"]);return Object(r.b)("wrapper",Object(n.a)({},h,a,{components:t,mdxType:"MDXLayout"}),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/rust-lang/www.rust-lang.org/issues/419#issuecomment-443418587"}),"Fast, reliable, productive - Pick three")," | Rust's slogan")),Object(r.b)("p",null,"Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. Coupled with Actix, I should be able to build a fast REST API elegantly."),Object(r.b)("p",null,"The idea behind this article is to see how performant a Rust API can be. I am going to create an API that saves and reads data from/to a PostgreSQL database."),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,'Most of the Rust REST API tests across the web are "',Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://medium.com/sean3z/rest-api-node-vs-rust-c75aa8c96343"}),"Hello World"),"\" applications. They bench direct API I/O with no payload. It's very far from reality. In the part 2 of this article, I will bench our Rust application with an intensive payload.")),Object(r.b)("p",null,"This article is separate in two parts, in this first part you will learn how to:"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Create a blazingly fast REST API in Rust"),Object(r.b)("li",{parentName:"ul"},"Connect it to a PostgreSQL database")),Object(r.b)("p",null,"In the second part, we will compare the performance of our application to a Go application."),Object(r.b)("h2",{id:"twitter-clone"},"Twitter clone"),Object(r.b)("blockquote",null,Object(r.b)("p",{parentName:"blockquote"},Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.twitter.com"}),"Twitter"),' is a "microblogging" system that allows people to send and receive short posts called tweets.')),Object(r.b)("p",null,"Let's create a small part of the Twitter API to be able to post, read, and like tweets. The goal is to be able to use our Twitter clone with a massive number of simultaneous fake users."),Object(r.b)(b.a,{mdxType:"Assumptions"},Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"You have installed ",Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/rust-lang/cargo"}),"Cargo")," (Rust package manager)"))),Object(r.b)("h3",{id:"api-design"},"API design"),Object(r.b)("p",null,"Our REST API needs to have three endpoints :"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list last 50 tweets"),Object(r.b)("li",{parentName:"ul"},"POST: create a new tweet"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: find a tweet by its ID"),Object(r.b)("li",{parentName:"ul"},"DELETE: delete a tweet by its ID"))),Object(r.b)("li",{parentName:"ul"},Object(r.b)("strong",{parentName:"li"},"/tweets/:id/likes"),Object(r.b)("ul",{parentName:"li"},Object(r.b)("li",{parentName:"ul"},"GET: list all likes attached to a tweet"),Object(r.b)("li",{parentName:"ul"},"POST: add +1 like to a tweet"),Object(r.b)("li",{parentName:"ul"},"DELETE: add -1 like to a tweet")))),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"For the sake of simplicity, I will not set up a user management service.")),Object(r.b)("h2",{id:"implementation"},"Implementation"),Object(r.b)("p",null,"Even though implementing an HTTP server could be fun, I choose to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://actix.rs/"}),"Actix"),", which is ranked as ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune"}),"the most performant framework")," ever by ",Object(r.b)("em",{parentName:"p"},"Techempower"),"."),Object(r.b)("h3",{id:"actix-web"},"Actix Web"),Object(r.b)("p",null,"Actix is an actor framework prevalent in the Rust ecosystem. I am using it as an HTTP server to build our REST API."),Object(r.b)("h3",{id:"lets-code"},"Let's code"),Object(r.b)("p",null,"Three files structured our application."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"main.rs")," to route HTTP requests to the right endpoint"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"tweet.rs")," to handle requests on /tweets"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("inlineCode",{parentName:"li"},"like.rs")," to handle requests on /tweets/:id/likes")),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n HttpServer::new(|| {\n App::new()\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),'pub type Tweets = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Tweet {\n pub id: String,\n pub created_at: DateTime,\n pub message: String,\n pub likes: Vec,\n}\n\nimpl Tweet {\n pub fn new(message: String) -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n message,\n likes: vec![],\n }\n }\n}\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct TweetRequest {\n pub message: Option,\n}\n\nimpl TweetRequest {\n pub fn to_tweet(&self) -> Option {\n match &self.message {\n Some(message) => Some(Tweet::new(message.to_string())),\n None => None,\n }\n }\n}\n\n/// list 50 last tweets `/tweets`\n#[get("/tweets")]\npub async fn list() -> HttpResponse {\n // TODO find the last 50 tweets and return them\n\n let tweets = Tweets { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweets)\n}\n\n/// create a tweet `/tweets`\n#[post("/tweets")]\npub async fn create(tweet_req: Json) -> HttpResponse {\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(tweet_req.to_tweet())\n}\n\n/// find a tweet by its id `/tweets/{id}`\n#[get("/tweets/{id}")]\npub async fn get(path: Path<(String,)>) -> HttpResponse {\n // TODO find tweet a tweet by ID and return it\n let found_tweet: Option = None;\n\n match found_tweet {\n Some(tweet) => HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(tweet),\n None => HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap(),\n }\n}\n\n/// delete a tweet by its id `/tweets/{id}`\n#[delete("/tweets/{id}")]\npub async fn delete(path: Path<(String,)>) -> HttpResponse {\n // TODO delete tweet by ID\n // in any case return status 204\n\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),'pub type Likes = Response;\n\n#[derive(Debug, Deserialize, Serialize)]\npub struct Like {\n pub id: String,\n pub created_at: DateTime,\n}\n\nimpl Like {\n pub fn new() -> Self {\n Self {\n id: Uuid::new_v4().to_string(),\n created_at: Utc::now(),\n }\n }\n}\n\n/// list last 50 likes from a tweet `/tweets/{id}/likes`\n#[get("/tweets/{id}/likes")]\npub async fn list(path: Path<(String,)>) -> HttpResponse {\n // TODO find likes by tweet ID and return them\n let likes = Likes { results: vec![] };\n\n HttpResponse::Ok()\n .content_type(APPLICATION_JSON)\n .json(likes)\n}\n\n/// add one like to a tweet `/tweets/{id}/likes`\n#[post("/tweets/{id}/likes")]\npub async fn plus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO add one like to a tweet\n let like = Like::new();\n\n HttpResponse::Created()\n .content_type(APPLICATION_JSON)\n .json(like)\n}\n\n/// remove one like from a tweet `/tweets/{id}/likes`\n#[delete("/tweets/{id}/likes")]\npub async fn minus_one(path: Path<(String,)>) -> HttpResponse {\n // TODO remove one like to a tweet\n HttpResponse::NoContent()\n .content_type(APPLICATION_JSON)\n .await\n .unwrap()\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/487198ee7b306f36dbab01f40a44345f85387db2/src/like.rs"}),"like.rs source code")))),Object(r.b)("p",null,"With only these three files, our application is ready to receive HTTP requests. In a couple of lines, we have a fully operational application. Actix takes care of the low level boilerplate for us."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="Annotation"',title:'"Annotation"'}),'#[get("/tweets")]\n')),Object(r.b)("p",null,"Annotation is a very convenient way to bind a route to the right path."),Object(r.b)("h3",{id:"validation"},"Validation"),Object(r.b)("p",null,"Let's run our application:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Run our application"',title:'"Run',our:!0,'application"':!0}),"# Go inside the root project directory\n$ cd twitter-clone-rust\n\n# Run the application\n$ cargo run\n")),Object(r.b)("p",null,"And validate that each endpoint with no errors:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,'API"':!0}),'# list tweets\ncurl http://localhost:9090/tweets\n\n# get a tweet (return status code: 204 because there is no tweet)\ncurl http://localhost:9090/tweets/abc\n\n# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" http://localhost:9090/tweets\n\n# delete a tweet (return status code: 204 in any case)\ncurl -X DELETE http://localhost:9090/tweets/abc\n\n# list likes from a tweet\ncurl http://localhost:9090/tweets/abc/likes\n\n# add one like to a tweet\ncurl -X POST http://localhost:9090/tweets/abc/likes\n\n# remove one like to a tweet\ncurl -X DELETE http://localhost:9090/tweets/abc/likes\n')),Object(r.b)("p",null,"At this stage, our application works without any database. Let's go more in-depth and connect it to PostgreSQL."),Object(r.b)("h2",{id:"postgresql"},"PostgreSQL"),Object(r.b)("h3",{id:"diesel"},"Diesel"),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://diesel.rs/"}),"Diesel")," is the most popular ORM in Rust to connect to a ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://www.postgresql.org"}),"PostgreSQL")," database. Combined with Actix, it's a perfect fit to persist in our data. Let's see how we can make that happen. However, Diesel does not support ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/tokio-rs/tokio"}),"tokio")," (the asynchronous engine behind Actix), so we have to run it in separate threads using the web::block function, which offloads blocking code (like Diesel's) to do not block the server's thread."),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Read the Diesel ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"http://diesel.rs/guides/getting-started/"}),"Getting started")," to generate tables configurations.")),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="schema.rs"',title:'"schema.rs"'}),"table! {\n likes (id) {\n id -> Uuid,\n created_at -> Timestamp,\n tweet_id -> Uuid,\n }\n}\n\ntable! {\n tweets (id) {\n id -> Uuid,\n created_at -> Timestamp,\n message -> Text,\n }\n}\n\njoinable!(likes -> tweets (tweet_id));\n\nallow_tables_to_appear_in_same_query!(\n likes,\n tweets,\n);\n")),Object(r.b)("p",null,"Diesel uses a macro ",Object(r.b)("inlineCode",{parentName:"p"},"table!...")," and an internal DSL to declare the structure of our tables. There is no magic here. The code is compiled and statically linked at the compilation."),Object(r.b)(s.a,{centered:!1,className:"square",defaultValue:"main.rs",select:!1,size:null,values:[{group:"Files",label:"main.rs",value:"main.rs"},{group:"Files",label:"tweet.rs",value:"tweet.rs"},{group:"Files",label:"like.rs",value:"like.rs"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"main.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="main.rs" {6-11,15-16}',title:'"main.rs"',"{6-11,15-16}":!0}),'#[actix_rt::main]\nasync fn main() -> io::Result<()> {\n env::set_var("RUST_LOG", "actix_web=debug,actix_server=info");\n env_logger::init();\n\n // set up database connection pool\n let database_url = env::var("DATABASE_URL").expect("DATABASE_URL");\n let manager = ConnectionManager::::new(database_url);\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("Failed to create pool");\n\n HttpServer::new(move || {\n App::new()\n // Set up DB pool to be used with web::Data extractor\n .data(pool.clone())\n // enable logger - always register actix-web Logger middleware last\n .wrap(middleware::Logger::default())\n // register HTTP requests handlers\n .service(tweet::list)\n .service(tweet::get)\n .service(tweet::create)\n .service(tweet::delete)\n .service(like::list)\n .service(like::plus_one)\n .service(like::minus_one)\n })\n .bind("0.0.0.0:9090")?\n .run()\n .await\n}\n')),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/main.rs"}),"main.rs source code"))),Object(r.b)(o.a,{value:"tweet.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="tweet.rs"',title:'"tweet.rs"'}),"//...\nfn list_tweets(total_tweets: i64, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let _tweets = match tweets\n .order(created_at.desc())\n .limit(total_tweets)\n .load::(conn)\n {\n Ok(tws) => tws,\n Err(_) => vec![],\n };\n\n Ok(Tweets {\n results: _tweets\n .into_iter()\n .map(|t| t.to_tweet())\n .collect::>(),\n })\n}\n\nfn find_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let res = tweets.filter(id.eq(_id)).load::(conn);\n match res {\n Ok(tweets_db) => match tweets_db.first() {\n Some(tweet_db) => Ok(tweet_db.to_tweet()),\n _ => Err(Error::NotFound),\n },\n Err(err) => Err(err),\n }\n}\n\nfn create_tweet(tweet: Tweet, conn: &DBPooledConnection) -> Result {\n use crate::schema::tweets::dsl::*;\n\n let tweet_db = tweet.to_tweet_db();\n let _ = diesel::insert_into(tweets).values(&tweet_db).execute(conn);\n\n Ok(tweet_db.to_tweet())\n}\n\nfn delete_tweet(_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::tweets::dsl::*;\n\n let res = diesel::delete(tweets.filter(id.eq(_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/tweet.rs"}),"tweet.rs source code"))),Object(r.b)(o.a,{value:"like.rs",mdxType:"TabItem"},Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-rust",metastring:'title="like.rs"',title:'"like.rs"'}),"//...\npub fn list_likes(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let _likes: Vec = match likes\n .filter(tweet_id.eq(_tweet_id))\n .order(created_at.desc())\n .load::(conn)\n {\n Ok(lks) => lks,\n Err(_) => vec![],\n };\n\n Ok(Likes {\n results: _likes\n .into_iter()\n .map(|l| l.to_like())\n .collect::>(),\n })\n}\n\npub fn create_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result {\n use crate::schema::likes::dsl::*;\n\n let like = Like::new();\n let _ = diesel::insert_into(likes)\n .values(like.to_like_db(_tweet_id))\n .execute(conn);\n\n Ok(like)\n}\n\npub fn delete_like(_tweet_id: Uuid, conn: &DBPooledConnection) -> Result<(), Error> {\n use crate::schema::likes::dsl::*;\n\n let _likes = list_likes(_tweet_id, conn);\n\n let like = match &_likes {\n Ok(_likes) if !_likes.results.is_empty() => _likes.results.first(),\n _ => None,\n };\n\n if like.is_none() {\n return Ok(());\n }\n\n let like_id = Uuid::from_str(like.unwrap().id.as_str()).unwrap();\n\n let res = diesel::delete(likes.filter(id.eq(like_id))).execute(conn);\n match res {\n Ok(_) => Ok(()),\n Err(err) => Err(err),\n }\n}\n//...\n")),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/evoxmusic/twitter-clone-rust/blob/master/src/like.rs"}),"like.rs source code")))),Object(r.b)("h2",{id:"deployment"},"Deployment"),Object(r.b)("p",null,"Qovery is going to help you to deploy your application in a few seconds. Let's deploy our Twitter Clone now."),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"web",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("p",null,"Sign in to the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(r.b)("p",{align:"center"},Object(r.b)("a",{href:"https://onboarding.qovery.com/"},Object(r.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(r.b)(o.a,{value:"cli",mdxType:"TabItem"},Object(r.b)("li",null,Object(r.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"linux",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"universal",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"arch",mdxType:"TabItem"},Object(r.b)("p",null,"Qovery is part of ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"macos",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"homebrew",mdxType:"TabItem"},Object(r.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(r.b)(o.a,{value:"script",mdxType:"TabItem"},Object(r.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(r.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(r.b)(o.a,{value:"windows",mdxType:"TabItem"},Object(r.b)(s.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(r.b)(o.a,{value:"scoop",mdxType:"TabItem"},Object(r.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(r.b)(o.a,{value:"manual",mdxType:"TabItem"},Object(r.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(r.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(r.b)(o.a,{value:"docker",mdxType:"TabItem"},Object(r.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(r.b)("p",null,"Change ",Object(r.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(r.b)("p",null,"Note: ",Object(r.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(r.b)("li",null,Object(r.b)("h3",{id:"sign-up"},"Sign up"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(r.b)("p",null,"Your browser window with sign-in options will open."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(r.b)("p",null,Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(r.b)("p",null,"Congratulations, you are logged-in.")))),Object(r.b)("h3",{id:"deploying-the-app"},"Deploying the app"),Object(r.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(r.b)("ol",null,Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(r.b)("p",null,"To follow the guide, ",Object(r.b)("a",{href:"https://github.com/evoxmusic/twitter-clone-rust"},"you can fork and use our repository")),Object(r.b)("p",null,"Use the forked repository (and branch ",Object(r.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(r.b)("li",null,Object(r.b)("p",null,"After the application is created: "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Navigate application settings"),Object(r.b)("li",{parentName:"ul"},"Select ",Object(r.b)("strong",{parentName:"li"},"Port")),Object(r.b)("li",{parentName:"ul"},"Add port ",Object(r.b)("strong",{parentName:"li"},"9090"))),Object(r.b)("p",{align:"left"},Object(r.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"}))),Object(r.b)("li",null,Object(r.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(r.b)("p",null,"Create and deploy a new database"),Object(r.b)(c.a,{type:"warning",mdxType:"Alert"},Object(r.b)("p",null,"Name the database ",Object(r.b)("strong",{parentName:"p"},"my-pql-db")," to follow the guide flawlessly")),Object(r.b)("p",null,"To learn how to do it, you can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"))),Object(r.b)("li",null,Object(r.b)("h3",{id:"configure-the-connection-to-the-database"},"Configure the connection to the database"),Object(r.b)("p",null,"In application overview, open the ",Object(r.b)("strong",{parentName:"p"},"Variables")," tab"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/open-env-var.png",alt:"Open Variable"})),Object(r.b)("p",null,"Configure the alias for each built_in environment variable to match the one required within your code"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/alias.png",alt:"Env Var Alias"})),Object(r.b)("p",null,"Have a look at ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"this section")," to know more on how to connect to a database.")),Object(r.b)("h2",{id:"deploy-your-application"},"Deploy your application"),Object(r.b)("p",null,"All you have to do now is to navigate to your application and click ",Object(r.b)("strong",{parentName:"p"},"Deploy")," button"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/heroku/heroku-1.png",alt:"Deploy App"})),Object(r.b)("p",null,"That's it. Watch the status and wait till the app is deployed."))),Object(r.b)("p",null,"Congratulations, you have deployed your application!"),Object(r.b)("h2",{id:"live-test"},"Live test"),Object(r.b)("p",null,"To open the application in your browser, click on ",Object(r.b)("strong",{parentName:"p"},"Action")," and ",Object(r.b)("strong",{parentName:"p"},"Open")," buttons in your application overview:"),Object(r.b)("p",{align:"center"},Object(r.b)("img",{src:"/img/deploy-env-1.png",alt:"Open App"})),Object(r.b)("p",null,"Then, we can test it with the following CURL commands (replace the app URL with your own):"),Object(r.b)("pre",null,Object(r.b)("code",Object(n.a)({parentName:"pre"},{className:"language-bash",metastring:'title="Curl commands to test our deployed API"',title:'"Curl',commands:!0,to:!0,test:!0,our:!0,deployed:!0,'API"':!0}),'# create a tweet\ncurl -X POST -d \'{"message": "This is a tweet"}\' -H "Content-type: application/json" https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# list tweets\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets\n\n# get a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n\n# list likes from a tweet\ncurl https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# add one like to a tweet\ncurl -X POST https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# remove one like to a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets//likes\n\n# delete a tweet\ncurl -X DELETE https://main-gxbuagyvgnkbrp5l-gtw.qovery.io/tweets/\n')),Object(r.b)(c.a,{type:"info",mdxType:"Alert"},Object(r.b)("p",null,"You can ",Object(r.b)("a",Object(n.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"add your custom domain"))),Object(r.b)("h2",{id:"whats-next"},"What's next"),Object(r.b)("p",null,"In this first part we saw how to create a Rust API with Actix and Diesel. In the second part we will compare its performance with a Go application to see which one is the most performant."),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Special thanks to ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/imjasonmiller"}),"Jason")," and ",Object(r.b)("a",Object(n.a)({parentName:"strong"},{href:"https://twitter.com/doctor_code"}),"Kokou")," for your reviews")),Object(r.b)("h2",{id:"useful-resources"},"Useful resources"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://github.com/evoxmusic/twitter-clone-rust"}),"Source code"))),Object(r.b)("p",null,"Do you want to know more about Rust?"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://blog.rust-lang.org/inside-rust/"}),"A great blog to follow along with Rust development")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/channel/UC_iD0xppBwwsrM9DegC5cQQ"}),"Jon Gjengset")," - PhD student at MIT in distributed systems and Rust live-coder"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://doc.rust-lang.org/book/"}),"The Rust programming language book")," (Free)"),Object(r.b)("li",{parentName:"ul"},Object(r.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.youtube.com/watch?v=j_4sadjjWh8"}),"My first service in Rust")," (French video - Fran\xe7ois T.)")),Object(r.b)(u.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,a){"use strict";a(426);var n=a(0),l=a.n(n),r=a(423),i=a.n(r);a(132);t.a=function(e){var t=e.children,a=e.classNames,n=e.fill,r=e.icon,s=e.type,o=null;switch(s){case"danger":o="alert-triangle";break;case"success":o="check-circle";break;case"warning":o="alert-triangle";break;default:o="info"}return l.a.createElement("div",{className:i()(a,"alert","alert--"+s,{"alert--fill":n,"alert--icon":!1!==r}),role:"alert"},!1!==r&&l.a.createElement("i",{className:i()("feather","icon-"+(r||o))}),t)}},428:function(e,t,a){var n=a(28).f,l=Function.prototype,r=/^\s*function ([^ (]*)/;"name"in l||a(10)&&n(l,"name",{configurable:!0,get:function(){try{return(""+this).match(r)[1]}catch(e){return""}}})},429:function(e,t,a){"use strict";a(428);var n=a(0),l=a.n(n),r=a(424);t.a=function(e){var t=e.children,a=e.name;return l.a.createElement(r.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},l.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",a||"page"," assumes the following:"),t)}},430:function(e,t,a){"use strict";var n=a(1),l=a(0),r=a.n(l),i=a(39),s=a(432),o=a(20),c=a.n(o);t.a=function(e){var t,a=e.to,o=e.href,b=a||o,u=Object(s.a)(b),p=Object(l.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(l.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?r.a.createElement(i.b,Object(n.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var a,n;d&&e&&u&&(a=e,n=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){a===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(a),t.disconnect(),n())}))}))).observe(a))},to:b})):r.a.createElement("a",Object(n.a)({},e,{href:b}))}},431:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=a(430),i=a(423),s=a.n(i);a(133);t.a=function(e){var t=e.children,a=e.className,n=e.badge,i=e.leftIcon,o=e.rightIcon,c=e.size,b=e.target,u=e.to,p=s()("jump-to","jump-to--"+c,a),d=l.a.createElement("div",{className:"jump-to--inner"},l.a.createElement("div",{className:"jump-to--inner-2"},i&&l.a.createElement("div",{className:"jump-to--left"},l.a.createElement("i",{className:"feather icon-"+i})),l.a.createElement("div",{className:"jump-to--main"},n?l.a.createElement("span",{className:"badge badge--primary badge--right"},n):"",t),l.a.createElement("div",{className:"jump-to--right"},l.a.createElement("i",{className:"feather icon-"+(o||"chevron-right")+" arrow"}))));return b?l.a.createElement("a",{href:u,target:b,className:p},d):l.a.createElement(r.a,{to:u,className:p},d)}},432:function(e,t,a){"use strict";function n(e){return!1===/^(https?:|\/\/)/.test(e)}a.d(t,"a",(function(){return n}))},434:function(e,t,a){"use strict";var n=a(0),l=a.n(n),r=(a(423),a(433)),i=a.n(r);a(134);t.a=function(e){var t=e.children,a=e.headingDepth,r=e.hideFeedbackQuestion,s="undefined"!=typeof window?window.location:null,o={title:"Tutorial on "+s+" failed",body:"The tutorial on:\n\n"+s+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(o),b=Object(n.useState)(null),u=b[0],p=b[1];return l.a.createElement("div",{className:"steps steps--h"+a},t,!r&&!u&&l.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",l.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",l.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&l.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",l.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,a){"use strict";var n=a(1),l=(a(442),a(439),a(52),a(29),a(22),a(21),a(0)),r=a.n(l),i=a(447),s=a(423),o=a.n(s),c=a(433),b=a.n(c),u=a(446),p=37,d=39;function m(e){var t=e.block,a=e.centered,n=e.changeSelectedValue,l=e.className,i=e.handleKeydown,s=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return r.a.createElement("div",{className:a?"tabs--centered":null},r.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:o()("tabs",l,{"tabs--block":t}),style:s},c.map((function(e){var t=e.value,a=e.label;return r.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:o()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return n(t)},onClick:function(){return n(t)}},a)}))))}function h(e){var t=e.placeholder,a=e.selectedValue,n=e.changeSelectedValue,l=e.size,s=e.values,o=s;if(o[0].group){var c=_.groupBy(o,"group");o=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return r.a.createElement(i.a,{className:"react-select-container react-select--"+l,classNamePrefix:"react-select",options:o,isClearable:a,placeholder:t,value:s.find((function(e){return e.value==a})),onChange:function(e){return n(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,a=e.defaultValue,i=e.groupId,s=e.label,o=e.placeholder,c=e.select,g=e.size,w=(e.style,e.values),O=e.urlKey,j=Object(u.a)(),v=j.tabGroupChoices,f=j.setTabGroupChoices,y=Object(l.useState)(a),k=y[0],N=y[1];if(null!=i){var T=v[i];null!=T&&T!==k&&N(T)}var _=function(e){N(e),null!=i&&f(i,e)},I=[],x=function(e,t,a){switch(a.keyCode){case d:!function(e,t){var a=e.indexOf(t)+1;e[a]?e[a].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var a=e.indexOf(t)-1;e[a]?e[a].focus():e[e.length-1].focus()}(e,t)}};return Object(l.useEffect)((function(){if("undefined"!=typeof window&&window.location&&O){var e=b.a.parse(window.location.search);e[O]&&N(e[O])}}),[]),r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"margin-bottom--"+(g||"md")},s&&r.a.createElement("div",{className:"margin-vert--sm"},s),w.length>1&&(c?r.a.createElement(h,Object(n.a)({changeSelectedValue:_,handleKeydown:x,placeholder:o,selectedValue:k,size:g,tabRefs:I},e)):r.a.createElement(m,Object(n.a)({changeSelectedValue:_,handleKeydown:x,selectedValue:k,tabRefs:I},e)))),l.Children.toArray(t).filter((function(e){return e.props.value===k}))[0])}},443:function(e,t,a){"use strict";var n=a(0),l=a.n(n);t.a=function(e){return l.a.createElement(l.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/dea3d534.252309a6.js.LICENSE.txt b/dea3d534.252309a6.js.LICENSE.txt deleted file mode 100644 index bae6dd8e22..0000000000 --- a/dea3d534.252309a6.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - Copyright (c) 2017 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ diff --git a/dea3d534.252309a6.js b/dea3d534.6b9445e6.js similarity index 99% rename from dea3d534.252309a6.js rename to dea3d534.6b9445e6.js index fce748e737..ee174621a4 100644 --- a/dea3d534.252309a6.js +++ b/dea3d534.6b9445e6.js @@ -1,2 +1,2 @@ -/*! For license information please see dea3d534.252309a6.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[236],{388:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(434),c=n(429),l=n(424),s={last_modified_on:"2023-06-05",$schema:"/.meta/.schemas/guides.json",title:"Microservices",description:"How to deploy microservices with Qovery",author_github:"https://github.com/pjeziorowski",tags:["type: guide","technology: qovery"]},p={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Microservices",description:"How to deploy microservices with Qovery",permalink:"/guides/advanced/microservices",readingTime:"6 min read",source:"@site/guides/advanced/microservices.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Microservices",truncated:!1,prevItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"},nextItem:{title:"Migrate your application from Heroku to AWS",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws"}},u=[{value:"Deploy Application A",id:"deploy-application-a",children:[{value:"Exposing public API",id:"exposing-public-api",children:[]}]},{value:"Deploy Application B",id:"deploy-application-b",children:[]},{value:"Deploy Database",id:"deploy-database",children:[]},{value:"Use the database",id:"use-the-database",children:[]},{value:"Consume internal APIs",id:"consume-internal-apis",children:[]},{value:"Consume the public API in the frontend application",id:"consume-the-public-api-in-the-frontend-application",children:[]},{value:"Summary",id:"summary",children:[]},{value:"Q&A",id:"qa",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"This guide is a bit outdated. We are working on a new version of it. Stay tuned!")),Object(o.b)(c.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have already deployed an application with Qovery"),Object(o.b)("li",{parentName:"ul"},"You are familiar with the concept of Microservices"))),Object(o.b)("p",null,"In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API.\nOur backend microservices will communicate on a secure internal network, not accessible from the outside.\nOur front-end application will consume the API only from the publicly exposed application."),Object(o.b)("p",null,"The schema of what we want to achieve:"),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros.jpg",alt:"Microservices"})),Object(o.b)("p",null,"As you can see in the picture:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"we have two backend applications (",Object(o.b)("strong",{parentName:"li"},"App A")," and ",Object(o.b)("strong",{parentName:"li"},"App B"),")"),Object(o.b)("li",{parentName:"ul"},"one of them (",Object(o.b)("strong",{parentName:"li"},"App B"),") connected to a database"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"App A")," exposes a public API that is consumed by API clients (our frontend application run in users browsers)."),Object(o.b)("li",{parentName:"ul"},"additionally, we host our frontend application (",Object(o.b)("strong",{parentName:"li"},"UI"),") on Qovery so that users can access it directly in their browsers.")),Object(o.b)("p",null,"What differentiates Qovery from most other similar platforms is its first-class support of microservices. At Qovery, your project can be easily\ncomposed of multiple applications. It's up to you to decide how to build your system, but Qovery enables you to easily and safely communicate between your backend applications, databases, and frontend websites."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-a"},"Deploy Application A"),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy applications. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this video guide"),".")),Object(o.b)("p",null,"In the first step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_A")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_A"))),Object(o.b)("p",null,"After the application is created, let's expose the API publicly - it will be used later on by our frontend application."),Object(o.b)("h3",{id:"exposing-public-api"},"Exposing public API"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_A")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This is it. By default, Qovery exposes your ports publicly over HTTPS on port 443, so the app should be publicly accessible and reachable later on by our frontend application.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-b"},"Deploy Application B"),Object(o.b)("p",null,"In the second step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_B")),Object(o.b)("li",{parentName:"ul"},"The app is ready to use a PostgreSQL client to connect to a PostgreSQL database")),Object(o.b)("p",null,"Steps to do:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_B")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080"),Object(o.b)("li",{parentName:"ul"},"Click ",Object(o.b)("strong",{parentName:"li"},"Advanced")," settings in the 8080 port"),Object(o.b)("li",{parentName:"ul"},"Remove the check from the ",Object(o.b)("strong",{parentName:"li"},"Publicly Accessible")," field")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-2.png",alt:"Microservices"})),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"It will make your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," application not reachable publicly. It will be only reachable on the internal network by other microservices in your environment."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-database"},"Deploy Database"),Object(o.b)("p",null,"In this step, we'll deploy a PostgreSQL database that we'll consume in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in the next step."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to the environment in which you previously deployed your apps"),Object(o.b)("li",{parentName:"ul"},"Create a new PostgreSQL database named ",Object(o.b)("strong",{parentName:"li"},"MY_DB"))),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy databases. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this video guide"),"."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"use-the-database"},"Use the database"),Object(o.b)("p",null,"In this step, we'll make use of our database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")),Object(o.b)("p",null,"All you need to do to consume your database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is to configure your PostgreSQL client to use ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets injected by Qovery.\nYou can read more about this concept ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"here"),"."),Object(o.b)("p",null,"If your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is a Node.js application, this examplary code snippet will work well:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const { Client } = require('pg')\n\nconst client = new Client({\n host: process.env.QOVERY_DATABASE_MY_DB_HOST,\n port: process.env.QOVERY_DATABASE_MY_DB_PORT,\n user: process.env.QOVERY_DATABASE_MY_DB_USER,\n password: process.env.QOVERY_DATABASE_MY_DB_PASSWORD,\n})\n\nclient.connect(err => {\n if (err) {\n console.error('connection error', err.stack)\n } else {\n console.log('connected')\n }\n})\n")),Object(o.b)("p",null,"This is it! After deploying the database, application and executing the code snippet, you should see the message ",Object(o.b)("inlineCode",{parentName:"p"},"connected"),"."),Object(o.b)("p",null,"We made use of ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," variables injected by Qovery to make it easy to consume all the services within the environment.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-internal-apis"},"Consume internal APIs"),Object(o.b)("p",null,"In this step, we'll use the private API of our ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in our ",Object(o.b)("strong",{parentName:"p"},"APP_A")," over a private network.\nWe have already configured everything to make it work. The only missing step is the configuration in ",Object(o.b)("strong",{parentName:"p"},"APP_A")," - it needs to know how to access our ",Object(o.b)("strong",{parentName:"p"},"APP_B"),"."),Object(o.b)("p",null,"In the example below, we'll use Node.js and ",Object(o.b)("inlineCode",{parentName:"p"},"axios")," to create an HTTP client able to consume the API of ",Object(o.b)("strong",{parentName:"p"},"APP_B"),":"),Object(o.b)("p",null,"Now, you can configure your HTTP client in the frontend application to target your backend API:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const axios = require('axios');\nconst appBAddress = \"http://\" + process.env.QOVERY_APPLICATION_APP_B_HOST + \":\" + process.env.QOVERY_APPLICATION_APP_B_PORT\n\naxios.get(appBAddress + '/api/users')\n .then(response => {\n console.log(response.data);\n })\n .catch(error => {\n console.log(error);\n });\n")),Object(o.b)("p",null,"This is it! ",Object(o.b)("strong",{parentName:"p"},"Every request using the API client we have just configured will consume the API of "),"APP_B",Object(o.b)("strong",{parentName:"p"}," over the secure, internal network.")),Object(o.b)("p",null,"Once again, we used the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. Read more about them ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"here"))),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-the-public-api-in-the-frontend-application"},"Consume the public API in the frontend application"),Object(o.b)("p",null,"In this step, we'll deploy a frontend application and consume our public API exposed by ",Object(o.b)("strong",{parentName:"p"},"APP_A"),"."),Object(o.b)("p",null,"In the first step, create your frontend application."),Object(o.b)("p",null,"After the application is created, we can easily configure it to consume our public API. All we need to do is to make use of the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. See how to achieve it in a Nuxt.js example below:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"export default {\n env: {\n apiUrl: process.env.QOVERY_APPLICATION_APP_A_URL\n }\n}\n")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import axios from 'axios'\n\nexport default axios.create({\n baseURL: process.env.apiUrl\n})\n")),Object(o.b)("p",null,"After providing the configuration from above, deploy your frontend application."),Object(o.b)("p",null,"Now our frontend application will be able to consume the API exposed by the publicly exposed ",Object(o.b)("strong",{parentName:"p"},"APP_A"),".")))),Object(o.b)("h2",{id:"summary"},"Summary"),Object(o.b)("p",null,"In this guide, we deployed two microservices that communicate over the internal network. We also deployed a frontend application that makes use of a public API exposed by one of our applications. At the same time, we deployed a database and connected it to the second of our backend microservices."),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}d.isMDXComponent=!0},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),p=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},u=function(e){var t=p(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,m=u["".concat(i,".").concat(d)]||u[d]||b[d]||o;return n?r.a.createElement(m,c({ref:t},s,{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=i>2?arguments[2]:void 0,s=void 0===l?n:r(l,n);s>c;)t[c++]=e;return t}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},433:function(e,t,n){"use strict";var a=n(435),r=n(51);function o(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=r({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),r=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(r),o,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[o(t,e),"[",a,"]"].join(""):[o(t,e),"[",o(a,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=r({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var r=e[a];if(void 0===r)return"";if(null===r)return o(a,t);if(Array.isArray(r)){var i=[];return r.slice().forEach((function(e){void 0!==e&&i.push(n(a,e,i.length))})),i.join("&")}return o(a,t)+"="+o(r,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),p=Object(a.useState)(null),u=p[0],b=p[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file +/*! For license information please see dea3d534.6b9445e6.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[236],{388:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return d}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(434),c=n(429),l=n(424),s={last_modified_on:"2023-12-20",$schema:"/.meta/.schemas/guides.json",title:"Microservices",description:"How to deploy microservices with Qovery",author_github:"https://github.com/pjeziorowski",tags:["type: guide","technology: qovery"]},p={categories:[{name:"advanced",title:"Advanced",description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",permalink:"/guides/advanced"}],coverLabel:"Microservices",description:"How to deploy microservices with Qovery",permalink:"/guides/advanced/microservices",readingTime:"6 min read",source:"@site/guides/advanced/microservices.md",tags:[{label:"type: guide",permalink:"/guides/tags/type-guide"},{label:"technology: qovery",permalink:"/guides/tags/technology-qovery"}],title:"Microservices",truncated:!1,prevItem:{title:"Managing Environment Variables in React (create-react-app)",permalink:"/guides/tutorial/managing-env-variables-in-create-react-app"},nextItem:{title:"Migrate your application from Heroku to AWS",permalink:"/guides/tutorial/migrate-your-application-from-heroku-to-aws"}},u=[{value:"Deploy Application A",id:"deploy-application-a",children:[{value:"Exposing public API",id:"exposing-public-api",children:[]}]},{value:"Deploy Application B",id:"deploy-application-b",children:[]},{value:"Deploy Database",id:"deploy-database",children:[]},{value:"Use the database",id:"use-the-database",children:[]},{value:"Consume internal APIs",id:"consume-internal-apis",children:[]},{value:"Consume the public API in the frontend application",id:"consume-the-public-api-in-the-frontend-application",children:[]},{value:"Summary",id:"summary",children:[]},{value:"Q&A",id:"qa",children:[]}],b={rightToc:u};function d(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)(l.a,{type:"warning",mdxType:"Alert"},Object(o.b)("p",null,"This guide is a bit outdated. We are working on a new version of it. Stay tuned!")),Object(o.b)(c.a,{mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"You have already deployed an application with Qovery"),Object(o.b)("li",{parentName:"ul"},"You are familiar with the concept of Microservices"))),Object(o.b)("p",null,"In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API.\nOur backend microservices will communicate on a secure internal network, not accessible from the outside.\nOur front-end application will consume the API only from the publicly exposed application."),Object(o.b)("p",null,"The schema of what we want to achieve:"),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros.jpg",alt:"Microservices"})),Object(o.b)("p",null,"As you can see in the picture:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"we have two backend applications (",Object(o.b)("strong",{parentName:"li"},"App A")," and ",Object(o.b)("strong",{parentName:"li"},"App B"),")"),Object(o.b)("li",{parentName:"ul"},"one of them (",Object(o.b)("strong",{parentName:"li"},"App B"),") connected to a database"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("strong",{parentName:"li"},"App A")," exposes a public API that is consumed by API clients (our frontend application run in users browsers)."),Object(o.b)("li",{parentName:"ul"},"additionally, we host our frontend application (",Object(o.b)("strong",{parentName:"li"},"UI"),") on Qovery so that users can access it directly in their browsers.")),Object(o.b)("p",null,"What differentiates Qovery from most other similar platforms is its first-class support of microservices. At Qovery, your project can be easily\ncomposed of multiple applications. It's up to you to decide how to build your system, but Qovery enables you to easily and safely communicate between your backend applications, databases, and frontend websites."),Object(o.b)(i.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-a"},"Deploy Application A"),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy applications. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/deploy-your-first-application/"}),"this video guide"),".")),Object(o.b)("p",null,"In the first step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_A")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_A"))),Object(o.b)("p",null,"After the application is created, let's expose the API publicly - it will be used later on by our frontend application."),Object(o.b)("h3",{id:"exposing-public-api"},"Exposing public API"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_A")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This is it. By default, Qovery exposes your ports publicly over HTTPS on port 443, so the app should be publicly accessible and reachable later on by our frontend application.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-application-b"},"Deploy Application B"),Object(o.b)("p",null,"In the second step, deploy an application named ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in your environment."),Object(o.b)("p",null,"Assumptions:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"The app exposes REST API over HTTP on port 8080"),Object(o.b)("li",{parentName:"ul"},"The app name is ",Object(o.b)("strong",{parentName:"li"},"APP_B")),Object(o.b)("li",{parentName:"ul"},"The app is ready to use a PostgreSQL client to connect to a PostgreSQL database")),Object(o.b)("p",null,"Steps to do:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to ",Object(o.b)("strong",{parentName:"li"},"APP_B")," application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080"),Object(o.b)("li",{parentName:"ul"},"Click ",Object(o.b)("strong",{parentName:"li"},"Advanced")," settings in the 8080 port"),Object(o.b)("li",{parentName:"ul"},"Remove the check from the ",Object(o.b)("strong",{parentName:"li"},"Publicly Accessible")," field")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-2.png",alt:"Microservices"})),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"It will make your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," application not reachable publicly. It will be only reachable on the internal network by other microservices in your environment."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"deploy-database"},"Deploy Database"),Object(o.b)("p",null,"In this step, we'll deploy a PostgreSQL database that we'll consume in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in the next step."),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate to the environment in which you previously deployed your apps"),Object(o.b)("li",{parentName:"ul"},"Create a new PostgreSQL database named ",Object(o.b)("strong",{parentName:"li"},"MY_DB"))),Object(o.b)(l.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"This guide assumes you already know how to deploy databases. If you have any problems, refer to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"this video guide"),"."))),Object(o.b)("li",null,Object(o.b)("h2",{id:"use-the-database"},"Use the database"),Object(o.b)("p",null,"In this step, we'll make use of our database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")),Object(o.b)("p",null,"All you need to do to consume your database in ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is to configure your PostgreSQL client to use ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets injected by Qovery.\nYou can read more about this concept ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"here"),"."),Object(o.b)("p",null,"If your ",Object(o.b)("strong",{parentName:"p"},"APP_B")," is a Node.js application, this examplary code snippet will work well:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const { Client } = require('pg')\n\nconst client = new Client({\n host: process.env.QOVERY_DATABASE_MY_DB_HOST,\n port: process.env.QOVERY_DATABASE_MY_DB_PORT,\n user: process.env.QOVERY_DATABASE_MY_DB_USER,\n password: process.env.QOVERY_DATABASE_MY_DB_PASSWORD,\n})\n\nclient.connect(err => {\n if (err) {\n console.error('connection error', err.stack)\n } else {\n console.log('connected')\n }\n})\n")),Object(o.b)("p",null,"This is it! After deploying the database, application and executing the code snippet, you should see the message ",Object(o.b)("inlineCode",{parentName:"p"},"connected"),"."),Object(o.b)("p",null,"We made use of ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," variables injected by Qovery to make it easy to consume all the services within the environment.")),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-internal-apis"},"Consume internal APIs"),Object(o.b)("p",null,"In this step, we'll use the private API of our ",Object(o.b)("strong",{parentName:"p"},"APP_B")," in our ",Object(o.b)("strong",{parentName:"p"},"APP_A")," over a private network.\nWe have already configured everything to make it work. The only missing step is the configuration in ",Object(o.b)("strong",{parentName:"p"},"APP_A")," - it needs to know how to access our ",Object(o.b)("strong",{parentName:"p"},"APP_B"),"."),Object(o.b)("p",null,"In the example below, we'll use Node.js and ",Object(o.b)("inlineCode",{parentName:"p"},"axios")," to create an HTTP client able to consume the API of ",Object(o.b)("strong",{parentName:"p"},"APP_B"),":"),Object(o.b)("p",null,"Now, you can configure your HTTP client in the frontend application to target your backend API:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"const axios = require('axios');\nconst appBAddress = \"http://\" + process.env.QOVERY_APPLICATION_APP_B_HOST + \":\" + process.env.QOVERY_APPLICATION_APP_B_PORT\n\naxios.get(appBAddress + '/api/users')\n .then(response => {\n console.log(response.data);\n })\n .catch(error => {\n console.log(error);\n });\n")),Object(o.b)("p",null,"This is it! ",Object(o.b)("strong",{parentName:"p"},"Every request using the API client we have just configured will consume the API of "),"APP_B",Object(o.b)("strong",{parentName:"p"}," over the secure, internal network.")),Object(o.b)("p",null,"Once again, we used the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. Read more about them ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"here"))),Object(o.b)("li",null,Object(o.b)("h2",{id:"consume-the-public-api-in-the-frontend-application"},"Consume the public API in the frontend application"),Object(o.b)("p",null,"In this step, we'll deploy a frontend application and consume our public API exposed by ",Object(o.b)("strong",{parentName:"p"},"APP_A"),"."),Object(o.b)("p",null,"In the first step, create your frontend application."),Object(o.b)("p",null,"After the application is created, we can easily configure it to consume our public API. All we need to do is to make use of the ",Object(o.b)("inlineCode",{parentName:"p"},"BUILT_IN")," secrets. See how to achieve it in a Nuxt.js example below:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"export default {\n env: {\n apiUrl: process.env.QOVERY_APPLICATION_APP_A_URL\n }\n}\n")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-javascript"}),"import axios from 'axios'\n\nexport default axios.create({\n baseURL: process.env.apiUrl\n})\n")),Object(o.b)("p",null,"After providing the configuration from above, deploy your frontend application."),Object(o.b)("p",null,"Now our frontend application will be able to consume the API exposed by the publicly exposed ",Object(o.b)("strong",{parentName:"p"},"APP_A"),".")))),Object(o.b)("h2",{id:"summary"},"Summary"),Object(o.b)("p",null,"In this guide, we deployed two microservices that communicate over the internal network. We also deployed a frontend application that makes use of a public API exposed by one of our applications. At the same time, we deployed a database and connected it to the second of our backend microservices."),Object(o.b)("h2",{id:"qa"},"Q&A"),Object(o.b)("p",null,"Do you need more examples? Do you have any questions? Feel free to ask on our ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://discuss.qovery.com/"}),"Community forum"),"."))}d.isMDXComponent=!0},423:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),p=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},u=function(e){var t=p(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,m=u["".concat(i,".").concat(d)]||u[d]||b[d]||o;return n?r.a.createElement(m,c({ref:t},s,{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=i>2?arguments[2]:void 0,s=void 0===l?n:r(l,n);s>c;)t[c++]=e;return t}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},433:function(e,t,n){"use strict";var a=n(435),r=n(51);function o(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=r({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),r=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),n(decodeURIComponent(r),o,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[o(t,e),"[",a,"]"].join(""):[o(t,e),"[",o(a,e),"]=",o(n,e)].join("")};case"bracket":return function(t,n){return null===n?o(t,e):[o(t,e),"[]=",o(n,e)].join("")};default:return function(t,n){return null===n?o(t,e):[o(t,e),"=",o(n,e)].join("")}}}(t=r({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var r=e[a];if(void 0===r)return"";if(null===r)return o(a,t);if(Array.isArray(r)){var i=[];return r.slice().forEach((function(e){void 0!==e&&i.push(n(a,e,i.length))})),i.join("&")}return o(a,t)+"="+o(r,t)})).filter((function(e){return e.length>0})).join("&"):""}},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(l),p=Object(a.useState)(null),u=p[0],b=p[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return b("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},435:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/c4f5d8e4.7311bd1c.js.LICENSE.txt b/dea3d534.6b9445e6.js.LICENSE.txt similarity index 100% rename from c4f5d8e4.7311bd1c.js.LICENSE.txt rename to dea3d534.6b9445e6.js.LICENSE.txt diff --git a/docs/getting-started/basic-concepts/index.html b/docs/getting-started/basic-concepts/index.html index 4eead4c567..48dee00d00 100644 --- a/docs/getting-started/basic-concepts/index.html +++ b/docs/getting-started/basic-concepts/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/deploy-my-app/index.html b/docs/getting-started/deploy-my-app/index.html index 2eb4da2c0d..6088958b29 100644 --- a/docs/getting-started/deploy-my-app/index.html +++ b/docs/getting-started/deploy-my-app/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/how-qovery-works/index.html b/docs/getting-started/how-qovery-works/index.html index a91c0dcfea..ed0087e43e 100644 --- a/docs/getting-started/how-qovery-works/index.html +++ b/docs/getting-started/how-qovery-works/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index a6d82d9cba..491d796cd7 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/install-qovery/index.html b/docs/getting-started/install-qovery/index.html index 75ea57d1d6..2e32efe152 100644 --- a/docs/getting-started/install-qovery/index.html +++ b/docs/getting-started/install-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/what-is-qovery/index.html b/docs/getting-started/what-is-qovery/index.html index 4360a86bfb..8dcce7ab40 100644 --- a/docs/getting-started/what-is-qovery/index.html +++ b/docs/getting-started/what-is-qovery/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/getting-started/whats-next/index.html b/docs/getting-started/whats-next/index.html index 0b4e773717..9862daeec5 100644 --- a/docs/getting-started/whats-next/index.html +++ b/docs/getting-started/whats-next/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/index.html b/docs/index.html index 89b9937c1e..0dd1ea5617 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,9 +22,9 @@ - + - + @@ -37,9 +37,9 @@ - + - + diff --git a/docs/security-and-compliance/backup-and-restore/index.html b/docs/security-and-compliance/backup-and-restore/index.html index 35b9d68b83..9cf533ed52 100644 --- a/docs/security-and-compliance/backup-and-restore/index.html +++ b/docs/security-and-compliance/backup-and-restore/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/security-and-compliance/encryption/index.html b/docs/security-and-compliance/encryption/index.html index 1a6010166f..628e59ee64 100644 --- a/docs/security-and-compliance/encryption/index.html +++ b/docs/security-and-compliance/encryption/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/security-and-compliance/gdpr/index.html b/docs/security-and-compliance/gdpr/index.html index 5d79b21cf1..99c57e939c 100644 --- a/docs/security-and-compliance/gdpr/index.html +++ b/docs/security-and-compliance/gdpr/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/security-and-compliance/index.html b/docs/security-and-compliance/index.html index 9e38d12ef9..1fe2ad1a68 100644 --- a/docs/security-and-compliance/index.html +++ b/docs/security-and-compliance/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/security-and-compliance/soc2/index.html b/docs/security-and-compliance/soc2/index.html index a6e22514fa..68d6060ce7 100644 --- a/docs/security-and-compliance/soc2/index.html +++ b/docs/security-and-compliance/soc2/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/useful-resources/faq/index.html b/docs/useful-resources/faq/index.html index ccf993d51f..caa5232abc 100644 --- a/docs/useful-resources/faq/index.html +++ b/docs/useful-resources/faq/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/docs/useful-resources/help-and-support/index.html b/docs/useful-resources/help-and-support/index.html index e1a70b2023..0cfff26b34 100644 --- a/docs/useful-resources/help-and-support/index.html +++ b/docs/useful-resources/help-and-support/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/audit-logs/index.html b/docs/using-qovery/audit-logs/index.html index 8d7fbd9ba3..cbfa11fc83 100644 --- a/docs/using-qovery/audit-logs/index.html +++ b/docs/using-qovery/audit-logs/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/advanced-settings/index.html b/docs/using-qovery/configuration/advanced-settings/index.html index 55f73a40f8..18a229d03d 100644 --- a/docs/using-qovery/configuration/advanced-settings/index.html +++ b/docs/using-qovery/configuration/advanced-settings/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/application-health-checks/index.html b/docs/using-qovery/configuration/application-health-checks/index.html index 8e57412b0d..18e4c779c2 100644 --- a/docs/using-qovery/configuration/application-health-checks/index.html +++ b/docs/using-qovery/configuration/application-health-checks/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/application/index.html b/docs/using-qovery/configuration/application/index.html index 8ba37b8e67..cc6cd6632a 100644 --- a/docs/using-qovery/configuration/application/index.html +++ b/docs/using-qovery/configuration/application/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -62,23 +62,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html b/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html index 03d9584d7b..712a337437 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html b/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html index eadc665f6e..6e8119d5cf 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html b/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html index 62cbb7cd18..3767ac4329 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/index.html b/docs/using-qovery/configuration/cloud-service-provider/index.html index 97aa36747f..9b04d14bf7 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html b/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html index 42046dab7d..1f4e542889 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/other-csps/index.html b/docs/using-qovery/configuration/cloud-service-provider/other-csps/index.html index 9421282c28..8edce9f3e8 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/other-csps/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/other-csps/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html b/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html index 068901146b..d2db1843fe 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cluster-advanced-settings/index.html b/docs/using-qovery/configuration/cluster-advanced-settings/index.html index e977e7fce5..6678612177 100644 --- a/docs/using-qovery/configuration/cluster-advanced-settings/index.html +++ b/docs/using-qovery/configuration/cluster-advanced-settings/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/clusters/index.html b/docs/using-qovery/configuration/clusters/index.html index 10602a7c9d..e501ce7b3f 100644 --- a/docs/using-qovery/configuration/clusters/index.html +++ b/docs/using-qovery/configuration/clusters/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/cronjob/index.html b/docs/using-qovery/configuration/cronjob/index.html index b3ce5707f8..16788f2592 100644 --- a/docs/using-qovery/configuration/cronjob/index.html +++ b/docs/using-qovery/configuration/cronjob/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/index.html b/docs/using-qovery/configuration/database/index.html index 3e0a5dc63e..e04085fd6f 100644 --- a/docs/using-qovery/configuration/database/index.html +++ b/docs/using-qovery/configuration/database/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/mongodb/index.html b/docs/using-qovery/configuration/database/mongodb/index.html index ddeeba6185..6fa36007c3 100644 --- a/docs/using-qovery/configuration/database/mongodb/index.html +++ b/docs/using-qovery/configuration/database/mongodb/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/mysql/index.html b/docs/using-qovery/configuration/database/mysql/index.html index 8c123c55d8..9833f45f37 100644 --- a/docs/using-qovery/configuration/database/mysql/index.html +++ b/docs/using-qovery/configuration/database/mysql/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/postgresql/index.html b/docs/using-qovery/configuration/database/postgresql/index.html index af115a8961..36dfd871eb 100644 --- a/docs/using-qovery/configuration/database/postgresql/index.html +++ b/docs/using-qovery/configuration/database/postgresql/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/database/redis/index.html b/docs/using-qovery/configuration/database/redis/index.html index 49817b9081..79c2ce284e 100644 --- a/docs/using-qovery/configuration/database/redis/index.html +++ b/docs/using-qovery/configuration/database/redis/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/deployment-rule/index.html b/docs/using-qovery/configuration/deployment-rule/index.html index 0fbc934771..b508cf500d 100644 --- a/docs/using-qovery/configuration/deployment-rule/index.html +++ b/docs/using-qovery/configuration/deployment-rule/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -63,23 +63,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/environment-variable/index.html b/docs/using-qovery/configuration/environment-variable/index.html index 44881d1a59..73ea685dce 100644 --- a/docs/using-qovery/configuration/environment-variable/index.html +++ b/docs/using-qovery/configuration/environment-variable/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -67,23 +67,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/environment/index.html b/docs/using-qovery/configuration/environment/index.html index 7063a71b6e..57bc172af9 100644 --- a/docs/using-qovery/configuration/environment/index.html +++ b/docs/using-qovery/configuration/environment/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/helm/index.html b/docs/using-qovery/configuration/helm/index.html index cdc3ca04fc..d23558fb6d 100644 --- a/docs/using-qovery/configuration/helm/index.html +++ b/docs/using-qovery/configuration/helm/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/index.html b/docs/using-qovery/configuration/index.html index e033cfff91..ee8ff479b5 100644 --- a/docs/using-qovery/configuration/index.html +++ b/docs/using-qovery/configuration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/lifecycle-job/index.html b/docs/using-qovery/configuration/lifecycle-job/index.html index 6b100af918..0d38540476 100644 --- a/docs/using-qovery/configuration/lifecycle-job/index.html +++ b/docs/using-qovery/configuration/lifecycle-job/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/object-storage/index.html b/docs/using-qovery/configuration/object-storage/index.html index 4f785e7764..91c4c5d7cc 100644 --- a/docs/using-qovery/configuration/object-storage/index.html +++ b/docs/using-qovery/configuration/object-storage/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -66,23 +66,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/api-token/index.html b/docs/using-qovery/configuration/organization/api-token/index.html index 5d1ce265ae..854579319a 100644 --- a/docs/using-qovery/configuration/organization/api-token/index.html +++ b/docs/using-qovery/configuration/organization/api-token/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/container-registry/index.html b/docs/using-qovery/configuration/organization/container-registry/index.html index 0ad55e25a8..6d3b82df31 100644 --- a/docs/using-qovery/configuration/organization/container-registry/index.html +++ b/docs/using-qovery/configuration/organization/container-registry/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/git-repository-access/index.html b/docs/using-qovery/configuration/organization/git-repository-access/index.html index 7fb2fdfa70..380c03bff0 100644 --- a/docs/using-qovery/configuration/organization/git-repository-access/index.html +++ b/docs/using-qovery/configuration/organization/git-repository-access/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -60,23 +60,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/helm-repository/index.html b/docs/using-qovery/configuration/organization/helm-repository/index.html index 71e0be2739..17363a1c7e 100644 --- a/docs/using-qovery/configuration/organization/helm-repository/index.html +++ b/docs/using-qovery/configuration/organization/helm-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/index.html b/docs/using-qovery/configuration/organization/index.html index aa6954f10a..1e8bb46963 100644 --- a/docs/using-qovery/configuration/organization/index.html +++ b/docs/using-qovery/configuration/organization/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/organization/members-rbac/index.html b/docs/using-qovery/configuration/organization/members-rbac/index.html index 810c088dd1..0f8d5a0d59 100644 --- a/docs/using-qovery/configuration/organization/members-rbac/index.html +++ b/docs/using-qovery/configuration/organization/members-rbac/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/project/index.html b/docs/using-qovery/configuration/project/index.html index 53fdd6dbb4..f725bb3760 100644 --- a/docs/using-qovery/configuration/project/index.html +++ b/docs/using-qovery/configuration/project/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/provider/index.html b/docs/using-qovery/configuration/provider/index.html index 60c80a8496..308ba4c66d 100644 --- a/docs/using-qovery/configuration/provider/index.html +++ b/docs/using-qovery/configuration/provider/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/provider/kubernetes/index.html b/docs/using-qovery/configuration/provider/kubernetes/index.html index e26e0bd214..4c2260dccf 100644 --- a/docs/using-qovery/configuration/provider/kubernetes/index.html +++ b/docs/using-qovery/configuration/provider/kubernetes/index.html @@ -26,60 +26,64 @@ - + - + - + - + - + - + + +
-

Kubernetes

Qovery Self-Managed or BYOK (Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster. +

Kubernetes

Qovery Self-Managed (or BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster. Read this article to better understand the difference with the Managed Kubernetes by Qovery. In a nutshell, Qovery Managed/BYOK is for Kubernetes experts who want to manage their own Kubernetes cluster. -In this version, Qovery does not manage the Kubernetes cluster for you.

This page explains how to install and configure Qovery on your Kubernetes cluster. If you are looking for a quick step-by-step guide, please follow the Kubernetes guide.

Components

How Qovery works with Self Managed Kubernetes cluster

They are two types of components:

Qovery components:

  • Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery.
  • Qovery Engine: the Qovery Engine is responsible for managing your applications on your Kubernetes cluster. It is installed on your Kubernetes cluster.
  • Qovery Cluster Agent (optional): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane.
  • Qovery Shell Agent (optional): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using qovery shell command.

Third-party components:

  • NGINX Ingress Controller (optional)
  • External DNS (optional)
  • Loki (optional)
  • Promtail (optional)
  • Cert Manager (optional)
  • ...

You can chose what you want to install and manage, and you will have a description of what services are usedi, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to.

What's the requirements?

Qovery requires a Kubernetes cluster with the following requirements:

  • Kubernetes version 1.26 or higher
  • Helm version 3.0 or higher
  • 2 CPU
  • 4 GB RAM
  • 20 GB disk space
  • Being able to access to the Internet

Run local demo infrastructure (optional)

First you will need some binaries to run the demo infrastructure locally:

  • docker: Docker is a set of platform as a service (PaaS) products that use OS-level virtualization to deliver software in packages called containers.
  • kubectl: Kubernetes command-line tool.
  • k3d: k3d is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker.
  • Helm: Helm is a package manager for Kubernetes.

Qovery requires a container registry to store its images.

We have to use a binary for ECR authentication and token rotation. So we create the prerequired folders and file for the binary:

mkdir -p registry/bin
touch registry/bin/ecr-credential-provider
chmod 755 registry/bin/ecr-credential-provider

Note: the ecr-credential-provider binary should be present for k3s to start. We will build it later.

And create an IAM user with the following policy:

{
"Statement": [
{
"Action": [
"ecr:*",
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "2012-10-17"
}

Then we create a registry/config.yaml file to configure the ECR credential provider, where you should set the AWS credentials:

apiVersion: kubelet.config.k8s.io/v1
kind: CredentialProviderConfig
providers:
- name: ecr-credential-provider
matchImages:
- "*.dkr.ecr.*.amazonaws.com"
- "*.dkr.ecr.*.amazonaws.com.cn"
- "*.dkr.ecr-fips.*.amazonaws.com"
- "*.dkr.ecr.us-iso-east-1.c2s.ic.gov"
- "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov"
defaultCacheDuration: "12h"
apiVersion: credentialprovider.kubelet.k8s.io/v1
env:
- name: AWS_ACCESS_KEY_ID
value: xxx
- name: AWS_DEFAULT_REGION
value: xxx
- name: AWS_SECRET_ACCESS_KEY
value: xxx

Now we can run a local Kubernetes cluster:

k3d cluster create --k3s-arg "--disable=traefik,metrics-server@server:0" \
-v $(pwd)/registry/bin:/var/lib/rancher/credentialprovider/bin@server:0 \
-v $(pwd)/registry/config.yaml:/var/lib/rancher/credentialprovider/config.yaml@server:0

After a few seconds/minutes (depending on your network bandwidth), you should have a local Kubernetes cluster running. Deploy this job to build and deploy the ECR credential provider binary on k3d (job.yaml):

apiVersion: batch/v1
kind: Job
metadata:
name: cloud-provider-repository-binary-builder
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: ecr-credential-builder
image: alpine:3.18
command:
- /bin/sh
- -c
- |
apk add -U ca-certificates tar zstd tzdata go git
git clone https://github.com/kubernetes/cloud-provider-aws.git
cd cloud-provider-aws/cmd/ecr-credential-provider
CGO_ENABLED=0 go build -mod=readonly .
chmod 755 ecr-credential-provider
mkdir -p /mnt/host/var/lib/rancher/credentialprovider/bin/
cp ecr-credential-provider /mnt/host/var/lib/rancher/credentialprovider/bin/
volumeMounts:
- mountPath: /mnt/host
name: host
volumes:
- hostPath:
path: /
type: ""
name: host
kubectl apply -f job.yaml

You should have see those pods running:

$ kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-957fdf8bc-nwz5q 1/1 Running 0 112m
kube-system coredns-77ccd57875-jhcnk 1/1 Running 0 112m
default cloud-provider-repository-binary-builder-4cvsv 0/1 Completed 0 112m

You're now ready to move on.

Install Qovery

  1. Install Helm command line tool.

  2. Add Qovery Helm repository.

    helm repo add qovery https://helm.qovery.com
    helm repo update
  3. Login to the Qovery console, create a cluster until it's asked to save informations in the values.yaml file.

  4. You will find several values.yaml files. Depending on you need, select the one you want and update the configuration accordingly:

    • values-demo.yaml: this version is to locally test with k3s or minikube
    • values-<provider-name>.yaml: find versions made for some providers

    Here is an example of how the chart works:

    values-demo.yaml
    ## Services you can enable or disable
    services:
    qovery:
    qovery-cluster-agent:
    enabled: true
    qovery-shell-agent:
    enabled: true
    qovery-engine:
    enabled: true
    ingress:
    ingress-nginx:
    enabled: true
    dns:
    external-dns:
    enabled: true
    logging:
    loki:
    enabled: true
    promtail:
    enabled: true
    certificates:
    cert-manager:
    enabled: true
    qovery-cert-manager-webhook:
    enabled: true
    cert-manager-configs:
    enabled: true
    observability:
    metrics-server:
    enabled: true
    +In this version, Qovery does not manage the Kubernetes cluster for you.

    This page explains how to install and configure Qovery on your Kubernetes cluster. If you are looking for a quick step-by-step guide, please follow the Kubernetes guide.

    Components

    How Qovery works with Self Managed Kubernetes cluster

    They are two types of components:

    Qovery components:

    • Qovery Control Plane: the Qovery Control Plane is the brain of Qovery. It is responsible for managing your applications and providing the API to interact with Qovery.
    • Qovery Cluster Agent (mandatory): the Qovery Cluster Agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane.
    • Qovery Shell Agent (mandatory): the Qovery Shell Agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using qovery shell command.
    • Qovery Engine (optional): the Qovery Engine is responsible for managing your applications deployment on your Kubernetes cluster. It can be used Qovery side or is installed on your Kubernetes cluster.

    Third-party components:

    • NGINX Ingress Controller (optional)
    • External DNS (optional)
    • Loki (optional)
    • Promtail (optional)
    • Cert Manager (optional)
    • ...

    You can chose what you want to install and manage, and you will have a description of what services are used, and responsible for. You can disable them if you don't want to use them. And you can even install other components if you want to.

    What's the requirements?

    Qovery requires a Kubernetes cluster with the following requirements:

    • Kubernetes version 1.26 or higher
    • Helm version 3.0 or higher
    • 2 CPU
    • 4 GB RAM
    • 20 GB disk space
    • Being able to access to the Internet
    • A private registry

    Here are some examples of Kubernetes distributions that can be used with Qovery. This is a non exhaustive list.

    To create a Kubernetes cluster on AWS, the simplest way is to use eksctl binary. For example:

    eksctl create cluster --region=us-east-2 --zones=us-east-2a,us-east-2b,us-east-2d

    Private registry

    Qovery requires a private registry to store built images and mirror containers in order to reduce potential images deletion by 3rd party, while you still need them (more info here).

    Kubelet Credential Providers

    To do so, Qovery advise to use Kubelet Credential Provider as it's transparent for developers.

    If you're running Qovery Self-Managed version, and you are going to use the registry from the cloud provider itself, you don't have anything to do. The cloud providers already manage this part for you.

    Install Qovery

    1. Install Helm command line tool.

    2. Add Qovery Helm repository.

      helm repo add qovery https://helm.qovery.com
      helm repo update
    3. Login to the Qovery console, create a cluster until it's asked to save informations in the values.yaml file.

    4. You will find several values.yaml files. Depending on you need, select the one you want and update the configuration accordingly:

      • values-demo.yaml: this version is to locally test with k3s or minikube
      • values-<provider-name>.yaml: find versions made for some providers

      Here is an example of how the chart works:

      values-demo.yaml
      ## Services you can enable or disable
      services:
      qovery:
      qovery-cluster-agent:
      enabled: true
      qovery-shell-agent:
      enabled: true
      ingress:
      ingress-nginx:
      enabled: true
      dns:
      external-dns:
      enabled: true
      logging:
      loki:
      enabled: true
      promtail:
      enabled: true
      certificates:
      cert-manager:
      enabled: true
      qovery-cert-manager-webhook:
      enabled: true
      cert-manager-configs:
      enabled: true
      observability:
      metrics-server:
      enabled: true
      ## Qovery Common config
      # Past information from Qovery cluster console creation
      qovery:
      clusterId: &clusterId "set-by-customer"
      clusterShortId: &shortClusterId "set-by-customer"
      organizationId: &organizationId "set-by-customer"
      jwtToken: &jwtToken "set-by-customer"
      domain: &domain "set-by-customer"
      grpcServer: &grpcServer "set-by-customer"
      engineGrpcServer: &engineGrpcServer "set-by-customer"
      qoveryDnsUrl: &qoveryDnsUrl "set-by-customer"
      lokiUrl: &lokiUrl "set-by-customer"
      promtailLokiUrl: &promtailLokiUrl "set-by-customer"
      acmeEmailAddr: &acmeEmailAddr "set-by-customer"
      externalDnsPrefix: &externalDnsPrefix "set-by-customer"
      architectures: &architectures "set-by-customer"
      -
      ## Chart overrides
      ...
    5. Install Qovery on your Kubernetes cluster.

      helm upgrade --install -n qovery -f values-demo.yaml qovery
      • -n qovery: the namespace where Qovery and its dependencies will be installed
      • -f values-demo.yaml: specify the values overrides file you want to use
      • qovery: name of the chart to deploy

    Configuration

    Qovery

    This is the configuration of Qovery itself. It is used by all Qovery components.

    KeyRequiredDescriptionDefault
    qovery.clusterIdYesThe cluster ID. It is used to identify your cluster.set-by-customer
    qovery.shortClusterIdYesThe short cluster ID. It is used to identify your cluster.set-by-customer
    qovery.organizationIdYesThe organization ID. It is used to identify your organization.set-by-customer
    qovery.jwtTokenYesThe JWT token. It is used to authenticate your cluster.set-by-customer
    qovery.domainYesThe domain name used by Qovery.set-by-customer
    qovery.qoveryDnsUrlYesQovery DNS url in case you want to use Qovery provided DNSset-by-customer
    qovery.lokiUrlNoLocal Loki URL (required if Loki is set)set-by-customer
    qovery.promtailLokiUrlNoPromtail Loki URL (required if Promtail and Loki are set)set-by-customer
    qovery.acmeEmailAddrNoEmail address used for Let's Encrypt TLS requestsset-by-customer
    qovery.externalDnsPrefixNoExernalDNS TXT record prefix (required if ExternalDNS is set)set-by-customer
    qovery.architecturesNoSet cluster architectures (comma separated)AMD64

    Qovery Cluster Agent

    The cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane.

    KeyRequiredDescriptionDefault
    services.qovery-cluster-agent.environmentVariables.GRPC_SERVERYesThe gRPC server URL.set-by-customer
    services.qovery-cluster-agent.environmentVariables.CLUSTER_JWT_TOKENYesThe JWT token.set-by-customer
    services.qovery-cluster-agent.environmentVariables.CLUSTER_IDYesThe cluster ID.set-by-customer
    services.qovery-cluster-agent.environmentVariables.ORGANIZATION_IDYesThe organization ID.set-by-customer

    Qovery Shell Agent

    The shell agent is responsible for giving you a secure remote shell access to your Kubernetes pods if you need it. E.g. when using qovery shell command.

    KeyRequiredDescriptionDefault
    services.qovery-shell-agent.environmentVariables.GRPC_SERVERYesThe gRPC server URL.set-by-customer
    services.qovery-shell-agent.environmentVariables.CLUSTER_JWT_TOKENYesThe JWT token.set-by-customer
    services.qovery-shell-agent.environmentVariables.CLUSTER_IDYesThe cluster ID.set-by-customer
    services.qovery-shell-agent.environmentVariables.ORGANIZATION_IDYesThe organization ID.set-by-customer

    Ingress

    Qovery uses NGINX Ingress Controller by default to route traffic to your applications.

    Nginx Ingress Controller

    Here is the minimum override configuration to be used:

    ingress-nginx:
    fullnameOverride: ingress-nginx
    controller:
    useComponentLabel: true
    admissionWebhooks:
    enabled: false
    # Ingress class used when an application/container with public access is set
    ingressClass: nginx-qovery
    extraArgs:
    # Default TLS certificate name and path
    default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"
    # Allows customization of the source of the IP address or FQDN to report in the ingress status field
    publishService:
    enabled: true

    Other Ingress Controllers

    Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you.

    DNS

    Qovery uses External DNS to automatically configure DNS records for your applications.

    If you don't want or can't add your own DNS provider, you can use the Qovery DNS provider. It is a managed DNS provider by Qovery with a sub-domain given by Qovery for free. -You'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain.

    External DNS

    Here is one example with Qoery DNS provider:

    external-dns:
    fullnameOverride: external-dns
    # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)
    provider: pdns
    # will use the domain name given by Qovery during the cluster setup phease
    domainFilters: [*domain]
    # an owner ID is set to avoid conflicts in case of multiple Qovery clusters
    txtOwnerId: *shortClusterId
    # a prefix to help Qovery to debug in case of issues
    txtPrefix: *externalDnsPrefix
    # set the Qovery DNS provider configuration
    pdns:
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken
    apiPort: 443

    Logging

    Qovery uses Loki to store your logs and Promtail to collect your logs.

    Loki

    loki:
    fullnameOverride: loki
    loki:
    # no auth is set for internal cluster usage
    auth_enabled: false
    ingester:
    lifecycler:
    ring:
    kvstore:
    # we store it in memory for the demo, you'll lose history once Loki restarts
    store: inmemory
    replication_factor: 1
    schema_config:
    configs:
    - from: 2020-05-15
    store: boltdb-shipper
    object_store: filesystem
    schema: v11
    index:
    prefix: index_
    period: 24h
    monitoring:
    # all the monitoring part is disabled to reduce resource footprint for the demo usage
    dashboards:
    enabled: false
    rules:
    enabled: false
    serviceMonitor:
    enabled: false
    metricsInstance:
    enabled: false
    selfMonitoring:
    enabled: false
    grafanaAgent:
    installOperator: false
    grafanaAgent:
    enabled: false
    lokiCanary:
    enabled: false
    test:
    enabled: false
    gateway:
    enabled: false
    # we use a single binary to reduce resource footprint for the demo usage
    singleBinary:
    replicas: 1
    persistence:
    enabled: false
    extraVolumes:
    - name: data
    emptyDir: {}
    - name: storage
    emptyDir: {}
    extraVolumeMounts:
    - name: data
    mountPath: /data
    - name: storage
    mountPath: /var/loki

    Promtail

    promtail:
    fullnameOverride: promtail
    # promtail requires to be spawned in kube-system namespace
    namespace: kube-system
    priorityClassName: system-node-critical
    config:
    clients:
    # forward logs to Loki
    - url: *promtailLokiUrl
    snippets:
    extraRelabelConfigs:
    - action: labelmap
    # required to be able to watch logs from Qovery console interface
    regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)

    Certificates

    Qovery uses Cert Manager to automatically get TLS certificates for your applications.

    Cert Manager

    cert-manager:
    fullnameOverride: cert-manager
    # CRD are required
    installCRDs: true
    replicaCount: 1
    startupapicheck:
    jobAnnotations:
    helm.sh/hook: post-install,post-upgrade
    rbac:
    annotations:
    helm.sh/hook: post-install,post-upgrade
    serviceAccount:
    annotations:
    helm.sh/hook: post-install,post-upgrade

    Qovery Cert Manager Webhook

    qovery-cert-manager-webhook:
    fullnameOverride: qovery-cert-manager-webhook
    certManager:
    namespace: qovery
    serviceAccountName: cert-manager
    secret:
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken

    Cert Manager Configs

    This is the configuration of Cert Manager itself. It is used by all Cert Manager components.

    cert-manager-configs:
    fullnameOverride: cert-manager-configs
    # set pdns to use Qovery DNS provider
    externalDnsProvider: pdns
    managedDns: [*domain]
    acme:
    letsEncrypt:
    emailReport: *acmeEmailAddr
    # As it's a demo cluster, we use the staging environment to avoid rate limit issues
    acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory
    provider:
    # set the provider of your choice or use the Qovery DNS provider
    pdns:
    apiPort: 443
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken

    Qovery uses Metrics Server to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics.

    Observability

    Metrics Server

    metrics-server:
    fullnameOverride: metrics-server
    defaultArgs:
    - --cert-dir=/tmp
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --kubelet-use-node-status-port
    - --metric-resolution=15s
    - --kubelet-insecure-tls
    apiService:
    create: false

    FAQ

    I have a non-covered use case. What should I do?

    Please contact us. We will be happy to help you.

    Can I host the Qovery control plane on my own?

    At the momement, you can't. But please contact us to discuss about it. We will be happy to help you.

+
## Chart overrides
...
  • Install Qovery on your Kubernetes cluster.

    helm upgrade --install -n qovery -f values-demo.yaml qovery
    • -n qovery: the namespace where Qovery and its dependencies will be installed
    • -f values-demo.yaml: specify the values overrides file you want to use
    • qovery: name of the chart to deploy
  • Configuration

    Qovery

    This is the configuration of Qovery itself. It is used by all Qovery components.

    KeyRequiredDescriptionDefault
    qovery.clusterIdYesThe cluster ID. It is used to identify your cluster.set-by-customer
    qovery.shortClusterIdYesThe short cluster ID. It is used to identify your cluster.set-by-customer
    qovery.organizationIdYesThe organization ID. It is used to identify your organization.set-by-customer
    qovery.jwtTokenYesThe JWT token. It is used to authenticate your cluster.set-by-customer
    qovery.domainYesThe domain name used by Qovery.set-by-customer
    qovery.qoveryDnsUrlYesQovery DNS url in case you want to use Qovery provided DNSset-by-customer
    qovery.lokiUrlNoLocal Loki URL (required if Loki is set)set-by-customer
    qovery.promtailLokiUrlNoPromtail Loki URL (required if Promtail and Loki are set)set-by-customer
    qovery.acmeEmailAddrNoEmail address used for Let's Encrypt TLS requestsset-by-customer
    qovery.externalDnsPrefixNoExernalDNS TXT record prefix (required if ExternalDNS is set)set-by-customer
    qovery.architecturesNoSet cluster architectures (comma separated)AMD64

    Qovery Cluster Agent

    RequiredYes
    If deployedThe cluster agent is responsible for securely forwarding logs and metrics from your Kubernetes cluster to Qovery control plane
    If missingThe cluster will not report to Qovery control plane Kubernetes information, so the Qovery console will report unknown satus values
    qovery-cluster-agent:
    fullnameOverride: qovery-cluster-agent

    Qovery Shell Agent

    RequiredYes
    If deployedUsed to give a remote shell access to you Kubernetes pods (if user is allowed from Qovery RBAC) with the Qovery CLI
    If missingNo remote connection will be possible, and Qovery support will not be able to help you to diagnose issues
    qovery-shell-agent:
    fullnameOverride: qovery-shell-agent

    Ingress

    RequiredNo (but strongly recommended)
    If deployedWeb services can be privately or publicly exposed
    If missingNo web services will be exposed

    Qovery us will be exposed NGINX Ingress Controller by default to route traffic to your applications.

    Nginx Ingress Controller

    Here is the minimum override configuration to be used:

    ingress-nginx:
    fullnameOverride: ingress-nginx
    controller:
    useComponentLabel: true
    admissionWebhooks:
    enabled: false
    # Ingress class used when an application/container with public access is set
    ingressClass: nginx-qovery
    extraArgs:
    # Default TLS certificate name and path
    default-ssl-certificate: "qovery/letsencrypt-acme-qovery-cert"
    # Allows customization of the source of the IP address or FQDN to report in the ingress status field
    publishService:
    enabled: true

    Other Ingress Controllers

    Qovery supports other Ingress Controllers. Please contact us if you want to use another one. We will be happy to help you.

    DNS

    RequiredNo (but strongly recommended)
    If deployedUsed to easily reach your applications with DNS records, even on private network
    If missingYou will have easy access with dns names to your services, you'll have to use IPs

    Qovery uses External DNS to automatically configure DNS records for your applications.

    If you don't want or can't add your own DNS provider, Qovery proposes it's own managed sub-domain DNS provider for free. +You'll then be able to later add your custom DNS record (no matter the provider) to point to your Qovery DNS sub-domain.

    External DNS

    Here is one example with Qovery DNS provider:

    external-dns:
    fullnameOverride: external-dns
    # set pdns for Qovery DNS managed (or you can use any supported provider by external-dns)
    provider: pdns
    # will use the domain name given by Qovery during the cluster setup phease
    domainFilters: [*domain]
    # an owner ID is set to avoid conflicts in case of multiple Qovery clusters
    txtOwnerId: *shortClusterId
    # a prefix to help Qovery to debug in case of issues
    txtPrefix: *externalDnsPrefix
    # set the Qovery DNS provider configuration
    pdns:
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken
    apiPort: 443

    Logging

    RequiredNo (but strongly recommended)
    If deployedRetrieve and store application's log history
    If missingYou'll have live logs, but you will miss log history for debugging purpose

    Qovery uses Loki to store your logs in a S3 compatible bucket and Promtail to collect your logs.

    Loki

    Here is a configuration in Memory (no persistence) for Loki:

    loki:
    fullnameOverride: loki
    loki:
    # no auth is set for internal cluster usage
    auth_enabled: false
    ingester:
    lifecycler:
    ring:
    kvstore:
    # we store it in memory for the demo, you'll lose history once Loki restarts
    store: inmemory
    replication_factor: 1
    schema_config:
    configs:
    - from: 2020-05-15
    store: boltdb-shipper
    object_store: filesystem
    schema: v11
    index:
    prefix: index_
    period: 24h
    monitoring:
    # all the monitoring part is disabled to reduce resource footprint for the demo usage
    dashboards:
    enabled: false
    rules:
    enabled: false
    serviceMonitor:
    enabled: false
    metricsInstance:
    enabled: false
    selfMonitoring:
    enabled: false
    grafanaAgent:
    installOperator: false
    grafanaAgent:
    enabled: false
    lokiCanary:
    enabled: false
    test:
    enabled: false
    gateway:
    enabled: false
    # we use a single binary to reduce resource footprint for the demo usage
    singleBinary:
    replicas: 1
    persistence:
    enabled: false
    extraVolumes:
    - name: data
    emptyDir: {}
    - name: storage
    emptyDir: {}
    extraVolumeMounts:
    - name: data
    mountPath: /data
    - name: storage
    mountPath: /var/loki

    Promtail

    A configuration example compatible with all providers:

    promtail:
    fullnameOverride: promtail
    # promtail requires to be spawned in kube-system namespace
    namespace: kube-system
    priorityClassName: system-node-critical
    config:
    clients:
    # forward logs to Loki
    - url: *promtailLokiUrl
    snippets:
    extraRelabelConfigs:
    - action: labelmap
    # required to be able to watch logs from Qovery console interface
    regex: __meta_kubernetes_pod_label_(qovery_com_service_id|qovery_com_service_type|qovery_com_environment_id)

    Certificates

    RequiredNo (but strongly recommended)
    If deployedCert-manager helps you to get TLS certificates through Let's Encrypt
    If missingWithout it, you will not be able to automatically get TLS certificates

    Qovery uses Cert Manager to automatically get TLS certificates for your applications.

    Cert Manager

    Here is the minimal setup for all cloud providers:

    cert-manager:
    fullnameOverride: cert-manager
    # CRD are required
    installCRDs: true
    replicaCount: 1
    startupapicheck:
    jobAnnotations:
    helm.sh/hook: post-install,post-upgrade
    rbac:
    annotations:
    helm.sh/hook: post-install,post-upgrade
    serviceAccount:
    annotations:
    helm.sh/hook: post-install,post-upgrade

    Qovery Cert Manager Webhook

    RequiredNo (but if you're using Qovery DNS Provider)
    If deployedRequired to get Let's Encrypt TLS if Qovery DNS Provider is used
    If missingWithout it, you will not be able to automatically get TLS certificates with Qovery DNS Provider

    A configuration example compatible with all providers:

    qovery-cert-manager-webhook:
    fullnameOverride: qovery-cert-manager-webhook
    certManager:
    namespace: qovery
    serviceAccountName: cert-manager
    secret:
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken

    Cert Manager Configs

    RequiredNo
    If deployedThis is an helper to deploy cert-manager config. But you can manually set it
    If missingInstalling Cert-manager is not enough, you have to configure it to get TLS working

    This is the configuration of Cert Manager itself. It is used by all Cert Manager components.

    cert-manager-configs:
    fullnameOverride: cert-manager-configs
    # set pdns to use Qovery DNS provider
    externalDnsProvider: pdns
    managedDns: [*domain]
    acme:
    letsEncrypt:
    emailReport: *acmeEmailAddr
    # As it's a demo cluster, we use the staging environment to avoid rate limit issues
    acmeUrl: https://acme-staging-v02.api.letsencrypt.org/directory
    provider:
    # set the provider of your choice or use the Qovery DNS provider
    pdns:
    apiPort: 443
    apiUrl: *qoveryDnsUrl
    apiKey: *jwtToken

    Qovery uses Metrics Server to collect metrics from your Kubernetes cluster and scale your applications automatically based on custom metrics.

    Observability

    Metrics Server

    RequiredNo (but strongly recommended)
    If deployedMandatory if you want to retrive pod metrics for the Qovery agent and if you want to be able to use the horizontal pod scaling
    If missingNo HPA and no application metrics in the QOveyr console
    metrics-server:
    fullnameOverride: metrics-server
    defaultArgs:
    - --cert-dir=/tmp
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --kubelet-use-node-status-port
    - --metric-resolution=15s
    - --kubelet-insecure-tls
    apiService:
    create: false

    FAQ

    I have a non-covered use case. What should I do?

    Please contact us. We will be happy to help you.

    Can I host the Qovery control plane on my own?

    At the momement, you can't. But please contact us to discuss about it. We will be happy to help you.

    - + - + - + - + - + + + - + diff --git a/docs/using-qovery/configuration/service-health-checks/index.html b/docs/using-qovery/configuration/service-health-checks/index.html index 1709b2efb6..865c9f723a 100644 --- a/docs/using-qovery/configuration/service-health-checks/index.html +++ b/docs/using-qovery/configuration/service-health-checks/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -59,23 +59,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/configuration/user-account/index.html b/docs/using-qovery/configuration/user-account/index.html index 50849d70e0..e630ed1953 100644 --- a/docs/using-qovery/configuration/user-account/index.html +++ b/docs/using-qovery/configuration/user-account/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html index d91fe92389..d0b1e00bb7 100644 --- a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html +++ b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html index 2abdc3fd22..e08089ee8e 100644 --- a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html +++ b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-actions/index.html b/docs/using-qovery/deployment/deployment-actions/index.html index 4dc26ba248..6e658719db 100644 --- a/docs/using-qovery/deployment/deployment-actions/index.html +++ b/docs/using-qovery/deployment/deployment-actions/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-history/index.html b/docs/using-qovery/deployment/deployment-history/index.html index 885613a36f..19a888e398 100644 --- a/docs/using-qovery/deployment/deployment-history/index.html +++ b/docs/using-qovery/deployment/deployment-history/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-pipeline/index.html b/docs/using-qovery/deployment/deployment-pipeline/index.html index e8f9f3138e..3cb332a6b0 100644 --- a/docs/using-qovery/deployment/deployment-pipeline/index.html +++ b/docs/using-qovery/deployment/deployment-pipeline/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/deployment-strategies/index.html b/docs/using-qovery/deployment/deployment-strategies/index.html index 13e30341cd..6a43344ab2 100644 --- a/docs/using-qovery/deployment/deployment-strategies/index.html +++ b/docs/using-qovery/deployment/deployment-strategies/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/image-mirroring/index.html b/docs/using-qovery/deployment/image-mirroring/index.html index d33613ddb0..6051a1cbf9 100644 --- a/docs/using-qovery/deployment/image-mirroring/index.html +++ b/docs/using-qovery/deployment/image-mirroring/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/index.html b/docs/using-qovery/deployment/index.html index 6cf8e7772a..02dfaaa76f 100644 --- a/docs/using-qovery/deployment/index.html +++ b/docs/using-qovery/deployment/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/logs/index.html b/docs/using-qovery/deployment/logs/index.html index 3df3072eb5..3d700c6920 100644 --- a/docs/using-qovery/deployment/logs/index.html +++ b/docs/using-qovery/deployment/logs/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html index a652dcc84f..03b660488f 100644 --- a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html +++ b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/index.html b/docs/using-qovery/index.html index 90fc390303..e3bf798dab 100644 --- a/docs/using-qovery/index.html +++ b/docs/using-qovery/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - + @@ -55,25 +55,25 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/api-integration/index.html b/docs/using-qovery/integration/api-integration/index.html index bd556c2f03..cd2e98dbf2 100644 --- a/docs/using-qovery/integration/api-integration/index.html +++ b/docs/using-qovery/integration/api-integration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/container-registry/index.html b/docs/using-qovery/integration/container-registry/index.html index b81b649daf..5fffdf73da 100644 --- a/docs/using-qovery/integration/container-registry/index.html +++ b/docs/using-qovery/integration/container-registry/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html index e9bceb66ed..5612580e7d 100644 --- a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/github-actions/index.html b/docs/using-qovery/integration/continuous-integration/github-actions/index.html index b72b916f44..a62d097471 100644 --- a/docs/using-qovery/integration/continuous-integration/github-actions/index.html +++ b/docs/using-qovery/integration/continuous-integration/github-actions/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -66,23 +66,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html index c455cf4041..ebc70c58f6 100644 --- a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -61,23 +61,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/index.html b/docs/using-qovery/integration/continuous-integration/index.html index b2a2ef40b1..43edff7867 100644 --- a/docs/using-qovery/integration/continuous-integration/index.html +++ b/docs/using-qovery/integration/continuous-integration/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/continuous-integration/jenkins/index.html b/docs/using-qovery/integration/continuous-integration/jenkins/index.html index ff56dc2db9..2c0356e1ff 100644 --- a/docs/using-qovery/integration/continuous-integration/jenkins/index.html +++ b/docs/using-qovery/integration/continuous-integration/jenkins/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -58,23 +58,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/git-repository/index.html b/docs/using-qovery/integration/git-repository/index.html index a0ce02a806..9e5397abd2 100644 --- a/docs/using-qovery/integration/git-repository/index.html +++ b/docs/using-qovery/integration/git-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/helm-repository/index.html b/docs/using-qovery/integration/helm-repository/index.html index faaed1e14d..aa94297e16 100644 --- a/docs/using-qovery/integration/helm-repository/index.html +++ b/docs/using-qovery/integration/helm-repository/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/index.html b/docs/using-qovery/integration/index.html index 80ad8efe09..21851c082a 100644 --- a/docs/using-qovery/integration/index.html +++ b/docs/using-qovery/integration/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - + @@ -55,25 +55,25 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/datadog/index.html b/docs/using-qovery/integration/monitoring/datadog/index.html index f6d6a9d4f2..2b1e0d6362 100644 --- a/docs/using-qovery/integration/monitoring/datadog/index.html +++ b/docs/using-qovery/integration/monitoring/datadog/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/index.html b/docs/using-qovery/integration/monitoring/index.html index 0d6b452af9..b3a634152d 100644 --- a/docs/using-qovery/integration/monitoring/index.html +++ b/docs/using-qovery/integration/monitoring/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/monitoring/new-relic/index.html b/docs/using-qovery/integration/monitoring/new-relic/index.html index e840ea5306..6d4cfd6b61 100644 --- a/docs/using-qovery/integration/monitoring/new-relic/index.html +++ b/docs/using-qovery/integration/monitoring/new-relic/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html index 0b9b4dd158..0583e09ee6 100644 --- a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/doppler/index.html b/docs/using-qovery/integration/secret-manager/doppler/index.html index e15b133873..16f200a138 100644 --- a/docs/using-qovery/integration/secret-manager/doppler/index.html +++ b/docs/using-qovery/integration/secret-manager/doppler/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/secret-manager/index.html b/docs/using-qovery/integration/secret-manager/index.html index 0d1d3ba501..51fa16c378 100644 --- a/docs/using-qovery/integration/secret-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/slack/index.html b/docs/using-qovery/integration/slack/index.html index e86523b675..d615d1937e 100644 --- a/docs/using-qovery/integration/slack/index.html +++ b/docs/using-qovery/integration/slack/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/terraform/index.html b/docs/using-qovery/integration/terraform/index.html index 2ae0b22d1f..44b51de8ce 100644 --- a/docs/using-qovery/integration/terraform/index.html +++ b/docs/using-qovery/integration/terraform/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/integration/webhook/index.html b/docs/using-qovery/integration/webhook/index.html index 7c829de2da..ef046b452d 100644 --- a/docs/using-qovery/integration/webhook/index.html +++ b/docs/using-qovery/integration/webhook/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/interface/cli/index.html b/docs/using-qovery/interface/cli/index.html index 8e12eb40f4..b3a473b811 100644 --- a/docs/using-qovery/interface/cli/index.html +++ b/docs/using-qovery/interface/cli/index.html @@ -26,27 +26,27 @@ - + - + - + - + - + - + - + @@ -84,27 +84,27 @@ - + - + - + - + - + - + - + diff --git a/docs/using-qovery/interface/index.html b/docs/using-qovery/interface/index.html index 03803a26af..72861dd669 100644 --- a/docs/using-qovery/interface/index.html +++ b/docs/using-qovery/interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/interface/rest-api/index.html b/docs/using-qovery/interface/rest-api/index.html index d5a1c367f7..3142e9d7ae 100644 --- a/docs/using-qovery/interface/rest-api/index.html +++ b/docs/using-qovery/interface/rest-api/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/interface/terraform-interface/index.html b/docs/using-qovery/interface/terraform-interface/index.html index 3c8bd9c6a1..648c4249dc 100644 --- a/docs/using-qovery/interface/terraform-interface/index.html +++ b/docs/using-qovery/interface/terraform-interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/interface/web-interface/index.html b/docs/using-qovery/interface/web-interface/index.html index ba0a4a2583..8daf1e3b2f 100644 --- a/docs/using-qovery/interface/web-interface/index.html +++ b/docs/using-qovery/interface/web-interface/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/maintenance/index.html b/docs/using-qovery/maintenance/index.html index 2686598b4b..81bfaaacda 100644 --- a/docs/using-qovery/maintenance/index.html +++ b/docs/using-qovery/maintenance/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -71,23 +71,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/application-troubleshoot/index.html b/docs/using-qovery/troubleshoot/application-troubleshoot/index.html index ed922c3528..9894d24273 100644 --- a/docs/using-qovery/troubleshoot/application-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/application-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -56,23 +56,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html index 70340f0058..d79bbe67bb 100644 --- a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/database-troubleshoot/index.html b/docs/using-qovery/troubleshoot/database-troubleshoot/index.html index f47c59502c..cab035939f 100644 --- a/docs/using-qovery/troubleshoot/database-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/database-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/index.html b/docs/using-qovery/troubleshoot/index.html index cc0e4f0de8..ddab176451 100644 --- a/docs/using-qovery/troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - + @@ -55,25 +55,25 @@ - + - + - + - + - + - + diff --git a/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html b/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html index 771c750d6b..4d93f89907 100644 --- a/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + @@ -57,23 +57,23 @@ - + - + - + - + - + diff --git a/f7098925.c179454d.js b/f7098925.26c73e3a.js similarity index 99% rename from f7098925.c179454d.js rename to f7098925.26c73e3a.js index 62bc5bb746..b852a141a6 100644 --- a/f7098925.c179454d.js +++ b/f7098925.26c73e3a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[256],{408:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(424),l=n(431),s=n(434),c=n(437),b=n(444),u=n(429),p={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},430:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(432),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},431:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(430),i=n(423),l=n.n(i);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},432:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(449),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(448),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},444:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[256],{408:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return p})),n.d(t,"metadata",(function(){return d})),n.d(t,"rightToc",(function(){return h})),n.d(t,"default",(function(){return g}));var a=n(1),r=n(9),o=(n(0),n(425)),i=n(424),l=n(431),s=n(434),c=n(437),b=n(443),u=n(429),p={last_modified_on:"2023-04-23",$schema:"/.meta/.schemas/guides.json",title:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",author_github:"https://github.com/evoxmusic",tags:["type: tutorial","language: kotlin","database: postgresql"],hide_pagination:!0},d={categories:[{name:"tutorial",title:"Tutorial",description:"Additional step-by-step resources to leverage even more Qovery",permalink:"/guides/tutorial"}],coverLabel:"URL Shortener API with Kotlin (Part 1/2)",description:"Create a URL shortener API with Kotlin, the micro-framework Ktor and PostgreSQL",permalink:"/guides/tutorial/url-shortener-api-with-kotlin",readingTime:"14 min read",source:"@site/guides/tutorial/url-shortener-api-with-kotlin.md",tags:[{label:"type: tutorial",permalink:"/guides/tags/type-tutorial"},{label:"language: kotlin",permalink:"/guides/tags/language-kotlin"},{label:"database: postgresql",permalink:"/guides/tags/database-postgresql"}],title:"URL Shortener API with Kotlin (Part 1/2)",truncated:!1,prevItem:{title:"Terraform",permalink:"/guides/advanced/terraform"},nextItem:{title:"Use an API gateway in front of multiple services",permalink:"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services"}},h=[{value:"Introduction",id:"introduction",children:[]},{value:"What is a URL shortener?",id:"what-is-a-url-shortener",children:[]},{value:"Ktor principles",id:"ktor-principles",children:[{value:"Kotlin",id:"kotlin",children:[]},{value:"Functional programming",id:"functional-programming",children:[]},{value:"Asynchronous",id:"asynchronous",children:[]}]},{value:"HTTP Server",id:"http-server",children:[]},{value:"URL Encoder",id:"url-encoder",children:[{value:"Handle identifier collision",id:"handle-identifier-collision",children:[]}]},{value:"URL Decoder",id:"url-decoder",children:[]},{value:"Redirect",id:"redirect",children:[]},{value:"Stats: clicks over time",id:"stats-clicks-over-time",children:[]},{value:"Try the API",id:"try-the-api",children:[]},{value:"Connect to a PostgreSQL database with Exposed",id:"connect-to-a-postgresql-database-with-exposed",children:[]},{value:"Deploy in the Cloud with Qovery",id:"deploy-in-the-cloud-with-qovery",children:[{value:"Install Qovery CLI",id:"install-qovery-cli",children:[]},{value:"Sign up",id:"sign-up",children:[]},{value:"Create an application",id:"create-an-application",children:[]},{value:"Create a new project",id:"create-a-new-project",children:[]},{value:"Create a new environment",id:"create-a-new-environment",children:[]},{value:"Create a new application",id:"create-a-new-application",children:[]},{value:"Deploy a database",id:"deploy-a-database",children:[]},{value:"Connect to PostgreSQL",id:"connect-to-postgresql",children:[]},{value:"Deploy",id:"deploy",children:[]}]},{value:"Conclusion",id:"conclusion",children:[]}],m={rightToc:h};function g(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(o.b)("wrapper",Object(a.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The source code for this post can be found on this ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener"}),"github repo")),Object(o.b)("h2",{id:"introduction"},"Introduction"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://ktor.io/"}),"Ktor")," is a brand new micro-framework created by the Jetbrains team, and running over the JVM. Jetbrains are the authors of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/"}),"Kotlin")," - which is now the official programming language for Android, and one of the most popular programming language on the JVM. Kotlin is gaining popularity on server-side and multi-platform application development."),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Ktor is a framework for building asynchronous servers and clients in connected systems using the powerful Kotlin programming language.")),Object(o.b)("p",null,"In this article, you will learn:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"How to design a simple URL shortener."),Object(o.b)("li",{parentName:"ul"},"How to use the Ktor micro-framework with Kotlin"),Object(o.b)("li",{parentName:"ul"},"How to deploy a Ktor application")),Object(o.b)("p",null,"I have +4 years of experience using Spring, and I wanted to give a try to Ktor, which seems promising. Creating a URL shortener is an excellent way to start."),Object(o.b)("h2",{id:"what-is-a-url-shortener"},"What is a URL shortener?"),Object(o.b)("p",null,"A URL shortener is a simple tool that takes a long URL and turns it into a very short one"),Object(o.b)("p",null,Object(o.b)("img",Object(a.a)({parentName:"p"},{src:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655859bc2ae5c7371efa36_urlshortener%20image.png",alt:"Flow of URL shortening - from original URL to short URL"}))),Object(o.b)("p",null,"It is commonly used for 3 reasons:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Tracking clicks"),Object(o.b)("li",{parentName:"ul"},"Make URL much more concise."),Object(o.b)("li",{parentName:"ul"},"Hide original URL")),Object(o.b)("p",null,"One famous freemium provider is bit.ly (see ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://uploads-ssl.webflow.com/5de176c0d41c9b4a1dbbb0aa/5e655a34bc2ae5452b1f124b_bitly.gif"}),"here"),")"),Object(o.b)("p",null,"In this article we will make a basic bit.ly like URL shortener. Let\u2019s go"),Object(o.b)("h2",{id:"ktor-principles"},"Ktor principles"),Object(o.b)("p",null,"Before starting I want to introduce the 3 main principles of Ktor."),Object(o.b)("h3",{id:"kotlin"},"Kotlin"),Object(o.b)("p",null,"Kotlin is the language used to develop on Ktor. It is an object-oriented and functional language. It is very stable and runs on the JVM. Kotlin is 100% interoperable with Java and allows you to benefit from its ecosystem (libraries, build system, etc.)."),Object(o.b)("h3",{id:"functional-programming"},"Functional programming"),Object(o.b)("p",null,"Ktor leverages the power of Kotlin and has a very functional approach. When writing code, everything seems obvious. It's very similar to what you can see on NodeJS. For me, coming from the Spring world, I find it very efficient to read and use."),Object(o.b)("h3",{id:"asynchronous"},"Asynchronous"),Object(o.b)("p",null,"Kotlin provides asynchronous code execution, thanks to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://kotlinlang.org/docs/reference/coroutines-overview.html"}),"coroutines"),". Ktor exploits this feature to its full potential, and even if you have the impression that you are writing code in a blocking manner, this is not the case. Ktor makes your life easier."),Object(o.b)("h2",{id:"http-server"},"HTTP Server"),Object(o.b)("p",null,"Here is a complete and simple example of how to expose an HTTP server (",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080"}),"http://localhost:8080"),") with Ktor."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun main(args: Array): Unit = io.ktor.server.netty.EngineMain.main(args)\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n routing {\n get("/") {\n call.respondText("Hello World", contentType = ContentType.Text.Plain)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-encoder"},"URL Encoder"),Object(o.b)("p",null,"The URL encoder will translate an incoming address into a smaller URL. The idea is to provide an ID that will identify the final URL. Using a hash function is perfect for this operation. However, the operation is non-reversible, meaning you can\u2019t retrieve the final URL by the generated identifier."),Object(o.b)("p",null,"Function to transform a long URL into a shorter URL"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension\nfun String.encodeToID(): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(6)\n // return id\n return truncatedHashString\n}\n')),Object(o.b)("p",null,"We expose the function through the REST API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// Request object\ndata class Request(val url: String) {\n fun toResponse(): Response = Response(url, url.encodeToID())\n}\n\n// Response object\ndata class Response(val originalURL: String, private val id: String) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n enable(SerializationFeature.INDENT_OUTPUT)\n propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE\n }\n }\n\n // Hash Table Response object by ID\n val responseByID = mutableMapOf()\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val retrievedResponse = responseByID[request.url.encodeToID()]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[request.url.encodeToID()] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h3",{id:"handle-identifier-collision"},"Handle identifier collision"),Object(o.b)("p",null,"Using a hash function makes no guarantee that it is not already being used. If it is in use, then you need to change it to another one. Note: even if the probability to have a collision is very low, you should handle this case."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// String extension (function signature has changed)\nfun String.encodeToID(truncateLength: Int = 6): String {\n // hash String with MD5\n val hashBytes = MessageDigest.getInstance("MD5").digest(this.toByteArray(Charsets.UTF_8))\n // transform to human readable MD5 String\n val hashString = String.format("%032x", BigInteger(1, hashBytes))\n // truncate MD5 String\n val truncatedHashString = hashString.take(truncateLength)\n // return id\n return truncatedHashString\n}\n\n//...\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n // Hash Table Response object by id\n val responseByID = mutableMapOf()\n\n fun getIdentifier(url: String, truncateLength: Int = 6): String {\n val id = url.encodeToID()\n\n val retrievedResponse = responseByID[id]\n if (retrievedResponse?.originalURL != url) {\n // collision spotted !\n return getIdentifier(url, truncateLength + 1)\n }\n\n return id\n }\n\n routing {\n post("/api/v1/encode") {\n // Deserialize JSON body to Request object\n val request = call.receive()\n\n // find the Response object if it already exists\n val id = getID(request.url)\n val retrievedResponse = responseByID[id]\n if (retrievedResponse != null) {\n // cache hit\n log.debug("cache hit $retrievedResponse")\n return@post call.respond(retrievedResponse)\n }\n\n // cache miss\n val response = request.toResponse()\n responseByID[id] = response\n log.debug("cache miss $response")\n\n // Serialize Response object to JSON body\n call.respond(response)\n }\n }\n}\n')),Object(o.b)("h2",{id:"url-decoder"},"URL Decoder"),Object(o.b)("p",null,"Decoding the URL is the process of returning the original URL from the short URL. This is the reverse operation made by the URL Encoder"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),"val shortURL = getShortURL(request.url)\nval retrievedResponse = responseByID[shortURL]\nretrievedResponse?.originalURL // return original URL or null\n")),Object(o.b)("h2",{id:"redirect"},"Redirect"),Object(o.b)("p",null,"When a user clicks on a short URL, the user is redirected to the final URL. HTTP protocol allows to do this naturally by returning a 302 status code and a redirection URL."),Object(o.b)("p",null,"With Ktor the redirection is as simple as calling a method with the final URL as a parameter."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'call.respondRedirect("https://www.qovery.com")\n')),Object(o.b)("p",null,"What we expect is that when the user visits ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"http://localhost:8080/fbc951"}),"http://localhost:8080/fbc951")," he is redirected to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"https://www.qovery.com"),". If the URL is incorrect then redirect to ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.google.com"}),"https://www.google.com")),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n // ...\n routing {\n get("/{id}") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respondRedirect("https://www.google.com")\n }\n\n log.debug("redirect to: $retrievedResponse")\n call.respondRedirect(retrievedResponse.originalURL)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"stats-clicks-over-time"},"Stats: clicks over time"),Object(o.b)("p",null,"Something that is really useful on products like bit.ly is the stats provided (click over time, referrers, country of visitors). Here is how to store click over time and make them available through the API"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'// added\ndata class Stat(val clicksOverTime: MutableList = mutableListOf())\n\n// Response object (modified with Stat)\ndata class Response(val originalURL: String, private val id: String, val stat: Stat = Stat()) {\n val shortURL: String = "http://localhost:8080/$id"\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n install(ContentNegotiation) {\n jackson {\n // ...\n // add this line to return Date object as ISO8601 format\n disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\n }\n }\n // ...\n routing {\n // ...\n get("/api/v1/url/{id}/stat") {\n val id = call.parameters["id"]\n val retrievedResponse = id?.let { responseByID[it] }\n\n if (id.isNullOrBlank() || retrievedResponse == null) {\n return@get call.respond(HttpStatusCode.NoContent)\n }\n\n call.respond(retrievedResponse.stat)\n }\n // ...\n }\n}\n')),Object(o.b)("h2",{id:"try-the-api"},"Try the API"),Object(o.b)("p",null,"Run the application"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ ./gradlew run\n//...\n2020-03-12 09:28:08.150 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active\n2020-03-12 09:28:08.606 [main] INFO Application - Responding at http://0.0.0.0:8080\n")),Object(o.b)("p",null,"Then execute the commands"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),'# generate a short URL\n$ curl -X POST -d \'{"url": "https://www.qovery.com"}\' -H "Content-type: application/json" "http://localhost:8080/api/v1/encode"\n{\n "original_url": "https://www.qovery.com",\n "stat": {\n "clicks_over_time": []\n },\n "short_url": "http://localhost:8080/fbc951"\n}\n\n# generate 4 fake clicks\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n$ curl -X GET \'http://localhost:8080/fbc951\'\n\n# show stat\n$ curl -X GET \'http://localhost:8080/api/v1/url/fbc951/stat\'\n{\n "clicks_over_time": [\n "2020-03-11T21:10:52.354+0000",\n "2020-03-11T21:10:54.093+0000",\n "2020-03-11T21:12:34.987+0000",\n "2020-03-11T21:12:37.223+0000"\n ]\n}\n')),Object(o.b)("h2",{id:"connect-to-a-postgresql-database-with-exposed"},"Connect to a PostgreSQL database with Exposed"),Object(o.b)("p",null,"By storing the data in memory, we lose all the data every time the application restart. Which is problematic for running in production. To make the data persistent we will store it in a PostgreSQL database. We will have to add 1 new dependency - ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/JetBrains/Exposed"}),"Exposed"),". Exposed (with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/brettwooldridge/HikariCP"}),"Hikari Connection Pool"),") is a lightweight SQL library on top of JDBC driver for Kotlin. With exposed it is possible to access databases in two flavours: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO)."),Object(o.b)("p",null,"Add the dependencies to your build.gradle (or POM.xml)"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'repositories {\n jcenter()\n}\n\ndependencies {\n // Connection Pool and PostgreSQL driver\n implementation("com.zaxxer:HikariCP:3.4.2")\n implementation("org.postgresql:postgresql:42.2.11")\n\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.22.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.22.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.22.1")\n implementation("org.jetbrains.exposed:exposed-java-time:0.22.1")\n}\n')),Object(o.b)("p",null,"We need to have 2 distincts tables, one containing all the final URLs with their correspond identifier"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ResponseTable : Table("response") {\n val id = varchar("id", 32)\n val originalURL = varchar("original_url", 2048)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"And a second one with all the clicking points"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'object ClickOverTimeTable : Table("click_over_time") {\n val id = integer("id").autoIncrement()\n val clickDate = datetime("click_date")\n val response = reference("response_id", onDelete = ReferenceOption.CASCADE, refColumn = ResponseTable.id)\n override val primaryKey: PrimaryKey = PrimaryKey(id)\n}\n')),Object(o.b)("p",null,"We need to create the tables as defined above programmatically"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/exposed"\n username = "exposed"\n password = "exposed"\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n\n@kotlin.jvm.JvmOverloads\nfun Application.module(testing: Boolean = false) {\n initDatabase()\n // ...\n}\n')),Object(o.b)("p",null,"We have to replace the Hash Table used to store the data by the PostgreSQL database (see the final code ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/evoxmusic/ktor-url-shortener/blob/with_postgresql/src/Application.kt"}),"here"),")"),Object(o.b)("h2",{id:"deploy-in-the-cloud-with-qovery"},"Deploy in the Cloud with Qovery"),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.qovery.com"}),"Qovery")," is going to help us to deploy the final application in the Cloud without the need to configure the CI/CD, network, security, load balancing, database and all the DevOps tasks"),Object(o.b)("blockquote",null,Object(o.b)("p",{parentName:"blockquote"},"Qovery is a deployment platform that helps all developers to deploy their applications in the Cloud in just a few seconds")),Object(o.b)(u.a,{name:"tutorial",mdxType:"Assumptions"},Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Your code need to be hosted on Github/Gitlab/Bitbucket"),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",Object(a.a)({parentName:"li"},{href:"https://ktor.io/quickstart/quickstart/docker.html"}),"Package your Ktor application to build and run it on Docker")))),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"web",placeholder:"Select your interface",select:!1,size:null,values:[{group:"Interfaces",label:"Web",value:"web"},{group:"Interfaces",label:"CLI",value:"cli"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"web",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("p",null,"Sign in to the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://start.qovery.com"}),"Qovery web interface"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("a",{href:"https://onboarding.qovery.com/"},Object(o.b)("img",{src:"/img/Qovery_Sign_Up_Page.jpg",alt:"Qovery Sign-up page"}))))),Object(o.b)(b.a,{value:"cli",mdxType:"TabItem"},Object(o.b)("li",null,Object(o.b)("h3",{id:"install-qovery-cli"},"Install Qovery CLI"),Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"linux",placeholder:"Select your OS",select:!1,size:null,values:[{group:"Platforms",label:"Linux",value:"linux"},{group:"Platforms",label:"MacOS",value:"macos"},{group:"Platforms",label:"Windows",value:"windows"},{group:"Platforms",label:"Docker",value:"docker"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"linux",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"universal",values:[{label:"*nix",value:"universal"},{label:"Arch Linux",value:"arch"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"universal",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI on any Linux distribution:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"arch",mdxType:"TabItem"},Object(o.b)("p",null,"Qovery is part of ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://aur.archlinux.org/packages"}),"AUR")," packages, so you can install it with ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Jguer/yay"}),"yay"),":"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ yay qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Linux manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"macos",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"homebrew",values:[{label:"Homebrew",value:"homebrew"},{label:"Script",value:"script"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"homebrew",mdxType:"TabItem"},Object(o.b)("p",null,"The common solution to install a command line binary on the MacOS is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://brew.sh/"}),"Homebrew"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery brew repository\n$ brew tap Qovery/qovery-cli\n\n# Install the CLI\n$ brew install qovery-cli\n"))),Object(o.b)(b.a,{value:"script",mdxType:"TabItem"},Object(o.b)("p",null,"To download and install Qovery CLI from the command line:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ curl -s https://get.qovery.com | bash\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Mac OS manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to a folder into your shell ",Object(o.b)("inlineCode",{parentName:"p"},"PATH"),".")))),Object(o.b)(b.a,{value:"windows",mdxType:"TabItem"},Object(o.b)(c.a,{centered:!0,className:"rounded",defaultValue:"scoop",values:[{label:"Scoop",value:"scoop"},{label:"Manual",value:"manual"}],mdxType:"Tabs"},Object(o.b)(b.a,{value:"scoop",mdxType:"TabItem"},Object(o.b)("p",null,"The classic way to install binaries on Windows is to use ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://scoop.sh/"}),"Scoop"),"."),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Add Qovery bucket\n$ scoop bucket add qovery https://github.com/Qovery/scoop-qovery-cli\n\n# Install the CLI\n$ scoop install qovery-cli\n"))),Object(o.b)(b.a,{value:"manual",mdxType:"TabItem"},Object(o.b)("p",null,"Install the Qovery CLI on Windows manually by downloading the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/releases"}),"latest release"),", and uncompress its content to\n",Object(o.b)("inlineCode",{parentName:"p"},"C:\\Windows"),".")))),Object(o.b)(b.a,{value:"docker",mdxType:"TabItem"},Object(o.b)("p",null,"Install Docker on your local machine and run the following command:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Pull and Run the latest Qovery CLI\n$ docker run ghcr.io/qovery/qovery-cli:latest help\n")),Object(o.b)("p",null,"Change ",Object(o.b)("inlineCode",{parentName:"p"},"latest")," by the version you want to use. For example, to use the version 0.58.4, run:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"$ docker run ghcr.io/qovery/qovery-cli:0.58.4 help\n")),Object(o.b)("p",null,"Note: ",Object(o.b)("inlineCode",{parentName:"p"},"ghcr.io")," is the ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/Qovery/qovery-cli/pkgs/container/qovery-cli"}),"GitHub Container Registry"),".")))),Object(o.b)("li",null,Object(o.b)("h3",{id:"sign-up"},"Sign up"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth\n")),Object(o.b)(i.a,{type:"info",mdxType:"Alert"},Object(o.b)("p",null,"If you are using an environment without access to GUI or a browser, you can use headless authentication instead:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-bash"}),"# Sign up and sign in command\n$ qovery auth --headless\n"))),Object(o.b)("p",null,"Your browser window with sign-in options will open."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/qovery_signup.svg",alt:"Qovery Sign-up page"})),Object(o.b)("p",null,Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/apps/qovery/installations/new"}),"Click here")," to authorize Qovery to clone and build your applications."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/github_signup.svg",alt:"Connect Github"})),Object(o.b)("p",null,"Congratulations, you are logged-in.")))),Object(o.b)("h3",{id:"create-an-application"},"Create an application"),Object(o.b)(s.a,{headingDepth:3,mdxType:"Steps"},Object(o.b)("ol",null,Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-project"},"Create a new project"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-2.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-environment"},"Create a new environment"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/heroku/heroku-3.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("h3",{id:"create-a-new-application"},"Create a new application"),Object(o.b)("p",null,"To follow the guide, ",Object(o.b)("a",{href:"https://github.com/evoxmusic/ktor-url-shortener.git"},"you can fork and use our repository")),Object(o.b)("p",null,"Use the forked repository (and branch ",Object(o.b)("strong",{parentName:"p"},"master"),") while creating the application in the repository field:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/rust/rust.png",alt:"Migrate from Heroku"}))),Object(o.b)("li",null,Object(o.b)("p",null,"After the application is created: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Navigate application settings"),Object(o.b)("li",{parentName:"ul"},"Select ",Object(o.b)("strong",{parentName:"li"},"Port")),Object(o.b)("li",{parentName:"ul"},"Add port 8080")),Object(o.b)("p",{align:"left"},Object(o.b)("img",{src:"/img/micro/micros-1.png",alt:"Microservices"})),Object(o.b)("p",null,"This will expose your application and make accessible in the public internet.")))),Object(o.b)("h3",{id:"deploy-a-database"},"Deploy a database"),Object(o.b)("p",null,"Create and deploy a new database."),Object(o.b)(i.a,{type:"warning",mdxType:"Alert"},"Name the new database **my-pql-db** to follow the guide flawlessly"),Object(o.b)("p",null,"To learn how to do it, you can ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/create-a-database/"}),"follow this guide"),"."),Object(o.b)("h3",{id:"connect-to-postgresql"},"Connect to PostgreSQL"),Object(o.b)("p",null,"Qovery add dynamically all required environment variables to connect to the database at the runtime of the container."),Object(o.b)("p",null,"You can list them all in ",Object(o.b)("strong",{parentName:"p"},"Environment Variables")," ",Object(o.b)("strong",{parentName:"p"},"Secrets")," section in your application overview, as described in ",Object(o.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/managing-environment-variables/"}),"envs guide"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/db-envs.png",alt:"DB Secrets"})),Object(o.b)("p",null,"To use them:"),Object(o.b)("pre",null,Object(o.b)("code",Object(a.a)({parentName:"pre"},{className:"language-kotlin"}),'fun initDatabase() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:${System.getenv("QOVERY_DATABASE_MY_PQL_DB_CONNECTION_URI_WITHOUT_CREDENTIALS")}"\n username = System.getenv("QOVERY_DATABASE_MY_PQL_DB_USERNAME")\n password = System.getenv("QOVERY_DATABASE_MY_PQL_DB_PASSWORD")\n driverClassName = "org.postgresql.Driver"\n }\n\n Database.connect(HikariDataSource(config))\n\n transaction {\n // create tables if they do not exist\n SchemaUtils.createMissingTablesAndColumns(RequestTable, ClickOverTimeTable)\n }\n}\n')),Object(o.b)("h3",{id:"deploy"},"Deploy"),Object(o.b)("p",null,"To deploy your application and database, click ",Object(o.b)("strong",{parentName:"p"},"Action")," and ",Object(o.b)("strong",{parentName:"p"},"Deploy")," button in your environments list view:"),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",null,"To get public URL to the application, open application details and click on ",Object(o.b)("strong",{parentName:"p"},"Action")," ",Object(o.b)("strong",{parentName:"p"},"Open"),"."),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/deploy-env-1.png",alt:"Kotlin URL Shortener"})),Object(o.b)("p",{align:"center"},Object(o.b)("img",{src:"/img/open-app.png",alt:"Kotlin URL Shortener"})),Object(o.b)("h2",{id:"conclusion"},"Conclusion"),Object(o.b)("p",null,"We have seen that creating an URL shortener API with Ktor and Kotlin is extremely simple. Connecting the application to PostgreSQL is very easy with the Exposed library. In just a few lines of code, the service is fully functional and can be deployed in production very quickly with the help of Qovery. In the next part, we will see how to create a web interface connecting to this API to convert our URLs without using the curl command."),Object(o.b)("p",null,Object(o.b)("strong",{parentName:"p"},"Part 2"),": bind a web interface to the API - ","[link coming soon]"),Object(o.b)(l.a,{to:"/guides/tutorial/",mdxType:"Jump"},"Tutorial"))}g.isMDXComponent=!0},424:function(e,t,n){"use strict";n(426);var a=n(0),r=n.n(a),o=n(423),i=n.n(o);n(132);t.a=function(e){var t=e.children,n=e.classNames,a=e.fill,o=e.icon,l=e.type,s=null;switch(l){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.a.createElement("div",{className:i()(n,"alert","alert--"+l,{"alert--fill":a,"alert--icon":!1!==o}),role:"alert"},!1!==o&&r.a.createElement("i",{className:i()("feather","icon-"+(o||s))}),t)}},428:function(e,t,n){var a=n(28).f,r=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in r||n(10)&&a(r,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},429:function(e,t,n){"use strict";n(428);var a=n(0),r=n.n(a),o=n(424);t.a=function(e){var t=e.children,n=e.name;return r.a.createElement(o.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},r.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},430:function(e,t,n){"use strict";var a=n(1),r=n(0),o=n.n(r),i=n(39),l=n(432),s=n(20),c=n.n(s);t.a=function(e){var t,n=e.to,s=e.href,b=n||s,u=Object(l.a)(b),p=Object(r.useRef)(!1),d=c.a.canUseIntersectionObserver;return Object(r.useEffect)((function(){return!d&&u&&window.docusaurus.prefetch(b),function(){d&&t&&t.disconnect()}}),[b,d,u]),b&&u?o.a.createElement(i.b,Object(a.a)({},e,{onMouseEnter:function(){p.current||(window.docusaurus.preload(b),p.current=!0)},innerRef:function(e){var n,a;d&&e&&u&&(n=e,a=function(){window.docusaurus.prefetch(b)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:b})):o.a.createElement("a",Object(a.a)({},e,{href:b}))}},431:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(430),i=n(423),l=n.n(i);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,i=e.leftIcon,s=e.rightIcon,c=e.size,b=e.target,u=e.to,p=l()("jump-to","jump-to--"+c,n),d=r.a.createElement("div",{className:"jump-to--inner"},r.a.createElement("div",{className:"jump-to--inner-2"},i&&r.a.createElement("div",{className:"jump-to--left"},r.a.createElement("i",{className:"feather icon-"+i})),r.a.createElement("div",{className:"jump-to--main"},a?r.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),r.a.createElement("div",{className:"jump-to--right"},r.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return b?r.a.createElement("a",{href:u,target:b,className:p},d):r.a.createElement(o.a,{to:u,className:p},d)}},432:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},434:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=(n(423),n(433)),i=n.n(o);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,o=e.hideFeedbackQuestion,l="undefined"!=typeof window?window.location:null,s={title:"Tutorial on "+l+" failed",body:"The tutorial on:\n\n"+l+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},c="https://github.com/qovery/documentation/issues/new?"+i.a.stringify(s),b=Object(a.useState)(null),u=b[0],p=b[1];return r.a.createElement("div",{className:"steps steps--h"+n},t,!o&&!u&&r.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",r.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return p("yes")}},"Yes"),"\xa0\xa0",r.a.createElement("a",{href:c,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==u&&r.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",r.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},437:function(e,t,n){"use strict";var a=n(1),r=(n(442),n(439),n(52),n(29),n(22),n(21),n(0)),o=n.n(r),i=n(447),l=n(423),s=n.n(l),c=n(433),b=n.n(c),u=n(446),p=37,d=39;function h(e){var t=e.block,n=e.centered,a=e.changeSelectedValue,r=e.className,i=e.handleKeydown,l=e.style,c=e.values,b=e.selectedValue,u=e.tabRefs;return o.a.createElement("div",{className:n?"tabs--centered":null},o.a.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:s()("tabs",r,{"tabs--block":t}),style:l},c.map((function(e){var t=e.value,n=e.label;return o.a.createElement("li",{role:"tab",tabIndex:"0","aria-selected":b===t,className:s()("tab-item",{"tab-item--active":b===t}),key:t,ref:function(e){return u.push(e)},onKeyDown:function(e){return i(u,e.target,e)},onFocus:function(){return a(t)},onClick:function(){return a(t)}},n)}))))}function m(e){var t=e.placeholder,n=e.selectedValue,a=e.changeSelectedValue,r=e.size,l=e.values,s=l;if(s[0].group){var c=_.groupBy(s,"group");s=Object.keys(c).map((function(e){return{label:e,options:c[e]}}))}return o.a.createElement(i.a,{className:"react-select-container react-select--"+r,classNamePrefix:"react-select",options:s,isClearable:n,placeholder:t,value:l.find((function(e){return e.value==n})),onChange:function(e){return a(e?e.value:null)}})}t.a=function(e){e.block,e.centered;var t=e.children,n=e.defaultValue,i=e.groupId,l=e.label,s=e.placeholder,c=e.select,g=e.size,v=(e.style,e.values),j=e.urlKey,O=Object(u.a)(),f=O.tabGroupChoices,y=O.setTabGroupChoices,w=Object(r.useState)(n),N=w[0],k=w[1];if(null!=i){var T=f[i];null!=T&&T!==N&&k(T)}var R=function(e){k(e),null!=i&&y(i,e)},S=[],I=function(e,t,n){switch(n.keyCode){case d:!function(e,t){var n=e.indexOf(t)+1;e[n]?e[n].focus():e[0].focus()}(e,t);break;case p:!function(e,t){var n=e.indexOf(t)-1;e[n]?e[n].focus():e[e.length-1].focus()}(e,t)}};return Object(r.useEffect)((function(){if("undefined"!=typeof window&&window.location&&j){var e=b.a.parse(window.location.search);e[j]&&k(e[j])}}),[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"margin-bottom--"+(g||"md")},l&&o.a.createElement("div",{className:"margin-vert--sm"},l),v.length>1&&(c?o.a.createElement(m,Object(a.a)({changeSelectedValue:R,handleKeydown:I,placeholder:s,selectedValue:N,size:g,tabRefs:S},e)):o.a.createElement(h,Object(a.a)({changeSelectedValue:R,handleKeydown:I,selectedValue:N,tabRefs:S},e)))),r.Children.toArray(t).filter((function(e){return e.props.value===N}))[0])}},443:function(e,t,n){"use strict";var a=n(0),r=n.n(a);t.a=function(e){return r.a.createElement(r.a.Fragment,null,e.children)}}}]); \ No newline at end of file diff --git a/guides/advanced/continuous-integration/index.html b/guides/advanced/continuous-integration/index.html index a4edbcec65..d32fb68ca2 100644 --- a/guides/advanced/continuous-integration/index.html +++ b/guides/advanced/continuous-integration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/costs-control/index.html b/guides/advanced/costs-control/index.html index d67e958bcc..1b1e9b40ae 100644 --- a/guides/advanced/costs-control/index.html +++ b/guides/advanced/costs-control/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-api-gateway/index.html b/guides/advanced/deploy-api-gateway/index.html index ea034b17c7..c4aade5921 100644 --- a/guides/advanced/deploy-api-gateway/index.html +++ b/guides/advanced/deploy-api-gateway/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-aws-services/index.html b/guides/advanced/deploy-aws-services/index.html index 643a8b3696..bc655d0573 100644 --- a/guides/advanced/deploy-aws-services/index.html +++ b/guides/advanced/deploy-aws-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-external-services/index.html b/guides/advanced/deploy-external-services/index.html index 8b05b14d31..37b49c8917 100644 --- a/guides/advanced/deploy-external-services/index.html +++ b/guides/advanced/deploy-external-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/deploy-frontend/index.html b/guides/advanced/deploy-frontend/index.html index 01316be9d7..00c067b6e8 100644 --- a/guides/advanced/deploy-frontend/index.html +++ b/guides/advanced/deploy-frontend/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/advanced/helm-chart/index.html b/guides/advanced/helm-chart/index.html index 946d2fea13..761bf3c349 100644 --- a/guides/advanced/helm-chart/index.html +++ b/guides/advanced/helm-chart/index.html @@ -26,43 +26,43 @@ - + - + - + - + - + - +

    Helm Charts

    Learn how to deploy Helm charts with Qovery

    Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the official website.

    Resources

    Here are some resources you can use to deploy your Helm Charts with Qovery.

    TitleDescriptionOfficial
    Deploy your Helm ChartsHow to deploy your Helm Charts (example with Kubecost)Yes
    ForumList "Helm Charts" threads from Qovery community forumno

    Q&A

    Do you need more examples? Do you have any questions? Feel free to ask on our Community forum.

    +
    Stats
    1 min read
    Updated

    Qovery runs on top of Kubernetes and allows you to deploy any Helm chart on your cluster. To learn more about Helm, please visit the official website.

    Resources

    Here are some resources you can use to deploy your Helm Charts with Qovery.

    TitleDescriptionOfficial
    Deploy your Helm ChartsHow to deploy your Helm Charts (example with Kubecost)Yes
    ForumList "Helm Charts" threads from Qovery community forumno

    Q&A

    Do you need more examples? Do you have any questions? Feel free to ask on our Community forum.

    - + - + - + - + - + - + diff --git a/guides/advanced/index.html b/guides/advanced/index.html index 5a3f576302..68eea8347f 100644 --- a/guides/advanced/index.html +++ b/guides/advanced/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -50,9 +50,9 @@ - + - + @@ -79,17 +79,17 @@ - + - + - + - + @@ -103,9 +103,9 @@ - + - + diff --git a/guides/advanced/microservices/index.html b/guides/advanced/microservices/index.html index 85652811b1..67bf8a8536 100644 --- a/guides/advanced/microservices/index.html +++ b/guides/advanced/microservices/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - +
    -

    Microservices

    How to deploy microservices with Qovery

    In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API. +

    Microservices

    How to deploy microservices with Qovery

    In this guide, we'll deploy a set of microservices, a database and a frontend UI application that consumes our public API. Our backend microservices will communicate on a secure internal network, not accessible from the outside. Our front-end application will consume the API only from the publicly exposed application.

    The schema of what we want to achieve:

    Microservices

    As you can see in the picture:

    • we have two backend applications (App A and App B)
    • one of them (App B) connected to a database
    • App A exposes a public API that is consumed by API clients (our frontend application run in users browsers).
    • additionally, we host our frontend application (UI) on Qovery so that users can access it directly in their browsers.

    What differentiates Qovery from most other similar platforms is its first-class support of microservices. At Qovery, your project can be easily composed of multiple applications. It's up to you to decide how to build your system, but Qovery enables you to easily and safely communicate between your backend applications, databases, and frontend websites.

    1. Deploy Application A

      In the first step, deploy an application named APP_A in your environment.

      Assumptions:

      • The app exposes REST API over HTTP on port 8080
      • The app name is APP_A

      After the application is created, let's expose the API publicly - it will be used later on by our frontend application.

      Exposing public API

      • Navigate to APP_A application settings
      • Select Port
      • Add port 8080

      Microservices

      This is it. By default, Qovery exposes your ports publicly over HTTPS on port 443, so the app should be publicly accessible and reachable later on by our frontend application.

    2. Deploy Application B

      In the second step, deploy an application named APP_B in your environment.

      Assumptions:

      • The app exposes REST API over HTTP on port 8080
      • The app name is APP_B
      • The app is ready to use a PostgreSQL client to connect to a PostgreSQL database

      Steps to do:

      • Navigate to APP_B application settings
      • Select Port
      • Add port 8080
      • Click Advanced settings in the 8080 port
      • Remove the check from the Publicly Accessible field

      Microservices

    3. Deploy Database

      In this step, we'll deploy a PostgreSQL database that we'll consume in APP_B in the next step.

      • Navigate to the environment in which you previously deployed your apps
      • Create a new PostgreSQL database named MY_DB
    4. Use the database

      In this step, we'll make use of our database in APP_B

      All you need to do to consume your database in APP_B is to configure your PostgreSQL client to use BUILT_IN secrets injected by Qovery. @@ -58,19 +58,19 @@ - + - + - + - + - + - + diff --git a/guides/advanced/migration/index.html b/guides/advanced/migration/index.html index f95d06f048..5d671d374d 100644 --- a/guides/advanced/migration/index.html +++ b/guides/advanced/migration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/monitoring/index.html b/guides/advanced/monitoring/index.html index 22b8b360f4..c2db05e582 100644 --- a/guides/advanced/monitoring/index.html +++ b/guides/advanced/monitoring/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/monorepository/index.html b/guides/advanced/monorepository/index.html index 2dcc51145c..4838aef54c 100644 --- a/guides/advanced/monorepository/index.html +++ b/guides/advanced/monorepository/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/advanced/production/index.html b/guides/advanced/production/index.html index cf14ec1198..5485d04cc0 100644 --- a/guides/advanced/production/index.html +++ b/guides/advanced/production/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/seed-database/index.html b/guides/advanced/seed-database/index.html index 0fefa08f4b..9f7f1c681c 100644 --- a/guides/advanced/seed-database/index.html +++ b/guides/advanced/seed-database/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/advanced/terraform/index.html b/guides/advanced/terraform/index.html index bdb7ef3b47..d3f928cba2 100644 --- a/guides/advanced/terraform/index.html +++ b/guides/advanced/terraform/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/advanced/use-preview-environments/index.html b/guides/advanced/use-preview-environments/index.html index e41313a58c..c6aa575e9f 100644 --- a/guides/advanced/use-preview-environments/index.html +++ b/guides/advanced/use-preview-environments/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/cloud-provider/guide-amazon-web-services/index.html b/guides/cloud-provider/guide-amazon-web-services/index.html index bd4514476f..d6b372fc6f 100644 --- a/guides/cloud-provider/guide-amazon-web-services/index.html +++ b/guides/cloud-provider/guide-amazon-web-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/cloud-provider/guide-google-cloud-platform/index.html b/guides/cloud-provider/guide-google-cloud-platform/index.html index 64e550711b..3851061fd0 100644 --- a/guides/cloud-provider/guide-google-cloud-platform/index.html +++ b/guides/cloud-provider/guide-google-cloud-platform/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/cloud-provider/guide-microsoft-azure/index.html b/guides/cloud-provider/guide-microsoft-azure/index.html index 5bccdda561..910bfbf370 100644 --- a/guides/cloud-provider/guide-microsoft-azure/index.html +++ b/guides/cloud-provider/guide-microsoft-azure/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/cloud-provider/guide-scaleway/index.html b/guides/cloud-provider/guide-scaleway/index.html index d7e7474657..c3384edfb9 100644 --- a/guides/cloud-provider/guide-scaleway/index.html +++ b/guides/cloud-provider/guide-scaleway/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/cloud-provider/index.html b/guides/cloud-provider/index.html index 2c47b75436..fbdbc55903 100644 --- a/guides/cloud-provider/index.html +++ b/guides/cloud-provider/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -57,17 +57,17 @@ - + - + - + - + diff --git a/guides/getting-started/create-a-database/index.html b/guides/getting-started/create-a-database/index.html index 3b8110d50d..c0db872066 100644 --- a/guides/getting-started/create-a-database/index.html +++ b/guides/getting-started/create-a-database/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/debugging/index.html b/guides/getting-started/debugging/index.html index 6b285dd936..09d0c3a396 100644 --- a/guides/getting-started/debugging/index.html +++ b/guides/getting-started/debugging/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/deploy-your-first-application/index.html b/guides/getting-started/deploy-your-first-application/index.html index 875841d077..fbf8ba27f3 100644 --- a/guides/getting-started/deploy-your-first-application/index.html +++ b/guides/getting-started/deploy-your-first-application/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/index.html b/guides/getting-started/index.html index e2aed84a25..f9ef4a9837 100644 --- a/guides/getting-started/index.html +++ b/guides/getting-started/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + diff --git a/guides/getting-started/managing-environment-variables/index.html b/guides/getting-started/managing-environment-variables/index.html index 75d5d387fd..82465c9318 100644 --- a/guides/getting-started/managing-environment-variables/index.html +++ b/guides/getting-started/managing-environment-variables/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -60,17 +60,17 @@ - + - + - + - + - + diff --git a/guides/getting-started/setting-custom-domain/index.html b/guides/getting-started/setting-custom-domain/index.html index 1594c7aa30..67e2a8b17c 100644 --- a/guides/getting-started/setting-custom-domain/index.html +++ b/guides/getting-started/setting-custom-domain/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/index.html b/guides/index.html index 7306e33c57..c7ead46d3d 100644 --- a/guides/index.html +++ b/guides/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + @@ -80,11 +80,11 @@ - + - + @@ -100,7 +100,7 @@ - + @@ -118,7 +118,7 @@ - + @@ -136,9 +136,9 @@ - + - + @@ -158,7 +158,7 @@ - + @@ -181,17 +181,17 @@ - + - + - + - + @@ -205,19 +205,19 @@ - + - + - + - + - + @@ -235,11 +235,11 @@ - + - + @@ -255,7 +255,7 @@ - + @@ -273,7 +273,7 @@ - + @@ -291,9 +291,9 @@ - + - + @@ -313,7 +313,7 @@ - + diff --git a/guides/provider/guide-kubernetes/index.html b/guides/provider/guide-kubernetes/index.html index 1ab012619e..c0b38998fa 100644 --- a/guides/provider/guide-kubernetes/index.html +++ b/guides/provider/guide-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/provider/index.html b/guides/provider/index.html index 5c2d53006d..fe703c6bb7 100644 --- a/guides/provider/index.html +++ b/guides/provider/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/cloud-provider-aws/index.html b/guides/tags/cloud-provider-aws/index.html index ef8be4ec5a..34a24b7116 100644 --- a/guides/tags/cloud-provider-aws/index.html +++ b/guides/tags/cloud-provider-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -54,9 +54,9 @@ - + - + @@ -75,17 +75,17 @@ - + - + - + - + @@ -103,9 +103,9 @@ - + - + diff --git a/guides/tags/cloud-provider-azure/index.html b/guides/tags/cloud-provider-azure/index.html index 5c81dd0408..e60e7346e4 100644 --- a/guides/tags/cloud-provider-azure/index.html +++ b/guides/tags/cloud-provider-azure/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/cloud-provider-gcp/index.html b/guides/tags/cloud-provider-gcp/index.html index 6d9026ae54..a62ce428f1 100644 --- a/guides/tags/cloud-provider-gcp/index.html +++ b/guides/tags/cloud-provider-gcp/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/cloud-provider-scaleway/index.html b/guides/tags/cloud-provider-scaleway/index.html index 0b68e19de8..2eda0882d5 100644 --- a/guides/tags/cloud-provider-scaleway/index.html +++ b/guides/tags/cloud-provider-scaleway/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/database-postgresql/index.html b/guides/tags/database-postgresql/index.html index 60080b43a6..2a4739658d 100644 --- a/guides/tags/database-postgresql/index.html +++ b/guides/tags/database-postgresql/index.html @@ -26,25 +26,25 @@ - + - + - + - + - + - + @@ -57,25 +57,25 @@ - + - + - + - + - + - + diff --git a/guides/tags/framework-rails/index.html b/guides/tags/framework-rails/index.html index df4ab8b535..eb391eaefb 100644 --- a/guides/tags/framework-rails/index.html +++ b/guides/tags/framework-rails/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/index.html b/guides/tags/index.html index af6725fe16..7883c965f0 100644 --- a/guides/tags/index.html +++ b/guides/tags/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + diff --git a/guides/tags/language-javascript/index.html b/guides/tags/language-javascript/index.html index 23dcb14052..ec68e912ad 100644 --- a/guides/tags/language-javascript/index.html +++ b/guides/tags/language-javascript/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + diff --git a/guides/tags/language-kotlin/index.html b/guides/tags/language-kotlin/index.html index 5a249eb8d2..9ad1d4b68b 100644 --- a/guides/tags/language-kotlin/index.html +++ b/guides/tags/language-kotlin/index.html @@ -26,21 +26,21 @@ - + - + - + - + - + - + @@ -53,21 +53,21 @@ - + - + - + - + - + - + diff --git a/guides/tags/language-ruby/index.html b/guides/tags/language-ruby/index.html index aafa3c6171..6ebcedb1c8 100644 --- a/guides/tags/language-ruby/index.html +++ b/guides/tags/language-ruby/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/language-rust/index.html b/guides/tags/language-rust/index.html index deca82ae0b..c34dd5fb91 100644 --- a/guides/tags/language-rust/index.html +++ b/guides/tags/language-rust/index.html @@ -26,23 +26,23 @@ - + - + - + - + - + - + - + @@ -55,23 +55,23 @@ - + - + - + - + - + - + - + diff --git a/guides/tags/provider-kubernetes/index.html b/guides/tags/provider-kubernetes/index.html index caa09ff572..3aaff22eb0 100644 --- a/guides/tags/provider-kubernetes/index.html +++ b/guides/tags/provider-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/technology-docker/index.html b/guides/tags/technology-docker/index.html index 762b9e4ce7..8ffaa213c0 100644 --- a/guides/tags/technology-docker/index.html +++ b/guides/tags/technology-docker/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/technology-github/index.html b/guides/tags/technology-github/index.html index 9762a3a969..e6ccedc925 100644 --- a/guides/tags/technology-github/index.html +++ b/guides/tags/technology-github/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/technology-helm/index.html b/guides/tags/technology-helm/index.html index a02775cf2d..05de404398 100644 --- a/guides/tags/technology-helm/index.html +++ b/guides/tags/technology-helm/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + @@ -51,19 +51,19 @@ - + - + - + - + - + diff --git a/guides/tags/technology-qovery/index.html b/guides/tags/technology-qovery/index.html index dfd4d46a22..42965283ad 100644 --- a/guides/tags/technology-qovery/index.html +++ b/guides/tags/technology-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -48,17 +48,17 @@ - + - + - + - + @@ -70,7 +70,7 @@ - + @@ -90,13 +90,13 @@ - + - + @@ -129,17 +129,17 @@ - + - + - + - + @@ -151,17 +151,17 @@ - + - + - + - + @@ -173,7 +173,7 @@ - + @@ -193,13 +193,13 @@ - + - + diff --git a/guides/tags/technology-terraform/index.html b/guides/tags/technology-terraform/index.html index 8d408261a0..bf91930ef4 100644 --- a/guides/tags/technology-terraform/index.html +++ b/guides/tags/technology-terraform/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + diff --git a/guides/tags/type-guide/index.html b/guides/tags/type-guide/index.html index 918da31ad2..b016d2e5e1 100644 --- a/guides/tags/type-guide/index.html +++ b/guides/tags/type-guide/index.html @@ -26,17 +26,17 @@ - + - + - + - + @@ -60,7 +60,7 @@ - + @@ -72,7 +72,7 @@ - + @@ -99,17 +99,17 @@ - + - + - + - + @@ -133,7 +133,7 @@ - + @@ -145,7 +145,7 @@ - + diff --git a/guides/tags/type-tutorial/index.html b/guides/tags/type-tutorial/index.html index 10e4f7ae71..94f92f5212 100644 --- a/guides/tags/type-tutorial/index.html +++ b/guides/tags/type-tutorial/index.html @@ -26,29 +26,29 @@ - + - + - + - + - + - + - + - + - + @@ -58,7 +58,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -94,7 +94,7 @@ - + @@ -102,13 +102,13 @@ - + - + @@ -131,29 +131,29 @@ - + - + - + - + - + - + - + - + - + @@ -163,7 +163,7 @@ - + @@ -181,7 +181,7 @@ - + @@ -199,7 +199,7 @@ - + @@ -207,13 +207,13 @@ - + - + diff --git a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html index a3cd3ac1cc..68f84831ce 100644 --- a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html +++ b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/aws-vpc-peering-with-qovery/index.html b/guides/tutorial/aws-vpc-peering-with-qovery/index.html index a865cc625f..1007703035 100644 --- a/guides/tutorial/aws-vpc-peering-with-qovery/index.html +++ b/guides/tutorial/aws-vpc-peering-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,17 +56,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html index 13e5bd8ba5..69efef2b2e 100644 --- a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html +++ b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html index e4fea37e1a..f57ba29d29 100644 --- a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html +++ b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -81,19 +81,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/cloudwatch-integration/index.html b/guides/tutorial/cloudwatch-integration/index.html index e252ef2a1e..0d6b8af120 100644 --- a/guides/tutorial/cloudwatch-integration/index.html +++ b/guides/tutorial/cloudwatch-integration/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -54,17 +54,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html index 61a7622ace..a3ccaaded8 100644 --- a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html +++ b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -69,19 +69,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/create-a-playground-environment-on-aws/index.html b/guides/tutorial/create-a-playground-environment-on-aws/index.html index a2bd012fc5..d1751ad006 100644 --- a/guides/tutorial/create-a-playground-environment-on-aws/index.html +++ b/guides/tutorial/create-a-playground-environment-on-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html index 400572ce4d..b320e82856 100644 --- a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html +++ b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html index f1c20f4b0b..456efdb394 100644 --- a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html +++ b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/data-seeding-in-postgres/index.html b/guides/tutorial/data-seeding-in-postgres/index.html index 2321ee2360..5af2688f0b 100644 --- a/guides/tutorial/data-seeding-in-postgres/index.html +++ b/guides/tutorial/data-seeding-in-postgres/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -64,17 +64,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html index cdfefe19ac..7ba6c0ab19 100644 --- a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html +++ b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -104,17 +104,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/deploy-temporal-on-kubernetes/index.html b/guides/tutorial/deploy-temporal-on-kubernetes/index.html index 640a408bad..d1ecd3beef 100644 --- a/guides/tutorial/deploy-temporal-on-kubernetes/index.html +++ b/guides/tutorial/deploy-temporal-on-kubernetes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/generate-qovery-api-client/index.html b/guides/tutorial/generate-qovery-api-client/index.html index b4c45a3718..d51dbeea24 100644 --- a/guides/tutorial/generate-qovery-api-client/index.html +++ b/guides/tutorial/generate-qovery-api-client/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html index d83f264964..cf808c7f09 100644 --- a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html +++ b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -50,19 +50,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/github-organization-repository-access/index.html b/guides/tutorial/github-organization-repository-access/index.html index e0788eec80..bffb3f3853 100644 --- a/guides/tutorial/github-organization-repository-access/index.html +++ b/guides/tutorial/github-organization-repository-access/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/grafana-install/index.html b/guides/tutorial/grafana-install/index.html index 0f27ba6ef1..66ab4692d3 100644 --- a/guides/tutorial/grafana-install/index.html +++ b/guides/tutorial/grafana-install/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html index 0d87f2f7ef..6ac24a3a6b 100644 --- a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html +++ b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html index ea5971c94d..5d49c9299e 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html index a58707a5ff..cf83949d84 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html index 08b3be765f..fb40c70348 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -67,17 +67,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html index b943a4a260..3d47d0c43d 100644 --- a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html +++ b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html index e0b36985cd..4324275532 100644 --- a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html +++ b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html index 5ec1a0aa64..a3f0482c95 100644 --- a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html +++ b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html index df5e009bcd..3ab6b214d3 100644 --- a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html +++ b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -75,19 +75,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/how-to-deploy-helm-charts/index.html b/guides/tutorial/how-to-deploy-helm-charts/index.html index 6b32394852..e2fa0cac1c 100644 --- a/guides/tutorial/how-to-deploy-helm-charts/index.html +++ b/guides/tutorial/how-to-deploy-helm-charts/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -54,17 +54,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html index f77bee8eaa..e1f92d4c3b 100644 --- a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html +++ b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html index f30b81331b..e32a52cfee 100644 --- a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html +++ b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -56,17 +56,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-run-commands-at-application-startup/index.html b/guides/tutorial/how-to-run-commands-at-application-startup/index.html index 25b1be858d..571720f6cc 100644 --- a/guides/tutorial/how-to-run-commands-at-application-startup/index.html +++ b/guides/tutorial/how-to-run-commands-at-application-startup/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html index 2fc5071700..17108eb238 100644 --- a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html +++ b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -52,17 +52,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html index 3548aefe6d..8c37e22d83 100644 --- a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html +++ b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/how-to-write-a-dockerfile/index.html b/guides/tutorial/how-to-write-a-dockerfile/index.html index d61f9d41d5..da74eaad85 100644 --- a/guides/tutorial/how-to-write-a-dockerfile/index.html +++ b/guides/tutorial/how-to-write-a-dockerfile/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -49,17 +49,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html index ac17e64d93..7c9b0fb477 100644 --- a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html +++ b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -54,19 +54,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/index.html b/guides/tutorial/index.html index 7b81ab0a8e..24899eed7f 100644 --- a/guides/tutorial/index.html +++ b/guides/tutorial/index.html @@ -26,29 +26,29 @@ - + - + - + - + - + - + - + - + - + @@ -58,7 +58,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -94,7 +94,7 @@ - + @@ -102,13 +102,13 @@ - + - + @@ -131,29 +131,29 @@ - + - + - + - + - + - + - + - + - + @@ -163,7 +163,7 @@ - + @@ -181,7 +181,7 @@ - + @@ -199,7 +199,7 @@ - + @@ -207,13 +207,13 @@ - + - + diff --git a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html index 8f9800b958..5ef58df4dd 100644 --- a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html +++ b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -57,17 +57,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/managing-env-variables-in-create-react-app/index.html b/guides/tutorial/managing-env-variables-in-create-react-app/index.html index 7a23a5e396..800a91bfd8 100644 --- a/guides/tutorial/managing-env-variables-in-create-react-app/index.html +++ b/guides/tutorial/managing-env-variables-in-create-react-app/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -59,17 +59,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html index f8e4fd21f9..ae2eea4230 100644 --- a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html +++ b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -55,19 +55,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html index 30270a652b..692858e49c 100644 --- a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html +++ b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -51,17 +51,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/url-shortener-api-with-kotlin/index.html b/guides/tutorial/url-shortener-api-with-kotlin/index.html index 2c0a270f78..d055d1fd8d 100644 --- a/guides/tutorial/url-shortener-api-with-kotlin/index.html +++ b/guides/tutorial/url-shortener-api-with-kotlin/index.html @@ -26,19 +26,19 @@ - + - + - + - + - + - + @@ -82,19 +82,19 @@ - + - + - + - + - + - + diff --git a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html index 3635d08451..97368c300a 100644 --- a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html +++ b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -55,17 +55,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html index 92f608a674..12508d06e7 100644 --- a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html +++ b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -50,17 +50,17 @@ - + - + - + - + - + diff --git a/guides/tutorial/working-with-git-submodules/index.html b/guides/tutorial/working-with-git-submodules/index.html index 6b3ecf34eb..3a77ca1494 100644 --- a/guides/tutorial/working-with-git-submodules/index.html +++ b/guides/tutorial/working-with-git-submodules/index.html @@ -26,17 +26,17 @@ - + - + - + - + - + @@ -53,17 +53,17 @@ - + - + - + - + - + diff --git a/img/configuration/provider/kubelet-credential-providers-plugin.png b/img/configuration/provider/kubelet-credential-providers-plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..2aeedb738f4458148886bf2f12da0323a6f54d2a GIT binary patch literal 72438 zcmeEuWk8i%x2^(`OHyDVt&$?$(x|AUbfty6lo+C=@u8=A&s_8x zpHCE_YT%FCcJdNpw+ed5R&U*+y7lUrsG^hh#w12u*w8%M&h|zk8^;lD$)o4LA2I}A zU|N1kF^PDMh4-N39>%MX*TVAYHHu|eA3W6+8EJyv>KOB!Ph9T{4%BRgk{E4GoY!u5 zx%KWlEleE?E?1}6aTRWZKSh~iJN?){u~TUKCpcuGJfgad@lpf{Kl1&*e-uf*m2G%9xd9)V!?}z#KbD<}_Z%nNp%Q5=9b!QOkhLhquy!^W-Mv)QGlbf+nD*d~4 zZNR!zZFhtCAN_AryhlNzOJ$|EDbG>+yLEZNx{>q#&&WUi`!WA*NiPC9=sjMIA*R1u zmkg}i4iitue)T`Bk66j89)li&nUrr9^LOip6YOX}KgGrdY;0JxX{G-Cb2C zc<|uDmc#?ghn<6C*0$o}7lYD+zk8ZTa;j9EocHwf^cIbFC85o@fqId_e`l;n5nU89 zF)>^U3hk{9Le%I)Il}+xK7U>S3%o#evHHKQ@gEx=jwc6Qh)a``_*?IrxpNQo&Xnqt zzgzcq8#+D2wo5MS;eRamUq4dqApFugkLd5#eQ$v9OC$P0yub4wTqlHI@+f2d*JA&% zE%j^&zvQ^L7Wj82L9a&mC28)Rzgu?(ittMkOowNG=RYXg2)_&)^8UMZZ9)-#3Gw6q z+Z{t<0e-pDY9{)3>+-$;erez@M*iXN{KtzJ_@$G<_rE*5C}a&%rs+LQLn>@pM{PjDk?g|LWuD))eMs!l9MoBkozC8awqB* za_Yo{=ECx_56=ju?*&S(84_(hE*UqdCH3Xow}woUifb zhm}^TqEzB5m0cWP=DH4$TXJm03$XsvV6h_a-j&lq%zk|ds>@Ll#7BqUYD%rUz9Kzb z8&ZJYv$5o&y1fj3(RL~>OX5H5MfeOvusbC54*Tf9nrCugKR}4c`8{8l8~g9rLmvP_ zr0vYAq6UcVV;zO9G`dwFxRLt5kD%!8?d6G}Qu-@WDRSQ4dfd>4Ywj5o%x$}7O$CDX z9Wf;bb!rfnFb%&`-(Cj$U1DPaz1rE$xFEcL-^}U@A-WpxEwk4*k+9=Q{jES***O-W z;5Z(9Ouvrq98AU{@b#DiPD<75m_9itXdyg245(Mzz;7|AQ+04;B|?@gzH2XuWbnM@j*hg zdXsDR;!iXNCi*O@9(P#rQ2SWTEB@m+vZ4G%N zO1+&j>PeR}r4wUjrN|looGhCH5hEkociU6>Ec{7NpRL8;0Xc|CM48|=NS^m_m6aI1 zFcG2JJ8jOWpM-?Oi2o9UE=gB3#7ykZGw6oZgB82>mfPE3J|Qgi*UaaY0^it#`fQTn zJFthm!m0>{;%mffKpr1syq1-fu(f5E5!ii(rLIWu*A|mwQOHh&vUQ~8PZkkcJ9{R=`OKL&ZMs5VCnNd}~)w+-m9eG^CMV2;w`|MnOjmxn5Y z*$NVRkz5mIEnbLx%uBx}pAFn2I`|dZtJGfzx6m~qL{)pAM|*Q7>xsa-l^5l{LBrss zfw)*p(+X+0qW6Djfahy)B@MC;ioRY8CIEiG2U8rR!%#&4G9+_g4ys&?8%HR54(#=0 z!)#C#>7BnQLx84}+Z#sZtB*mS#GNUkscy9mp*K94%$eV_dx)35Sxt5j1d~w#%Na8b z5@3uX92UvpAC~hKeTuU%=b1v$SmHqPva?+{=S9ZvG ztT#$dIWR9)tBzjeo%X*r*8=#!Tdb=44w3Jb^ddX&Sp1F-_)+(|4b2>z`ss)gt>672 z@%}nHNPz{VAKb)G%&;-{3)*8y&KKm|&W|Dt;GLuKa|8kyAdC^oJ<&JklnxwQ+r5=6 zYh`p4en^MoZO^Ut21!YdoiUtMiJC7(eN+pJRgs>beu`03i^8iUn3$hF#r&RQei=uY zg7>XFjkP`dVTQ-6`uhln;(ZJ$xuquk2SPjnn`NP=l7Wqnt_YB&iL5@wi!RAlYmL%y z=awYCgT20lQ5Y*RPHmD~*SwGSdyOikwlHFehx}q3e&HC(7&vlJMGQ2h*hgOM0Q@l` z#}o!ILiUtomj58<0mKfv`wrHLV4*yK{Dwco5nq0!FRRbI7mpd8zEeaqZ)R}rB>+iq zD7t5Sj|`s>FBEJ1ncg7Rkld5k9Dc9ws$gI%f^R^56HDb~i}(gKZBtn#sG>RpIo-`! zBt*FUb5gd$k!hqWY#;3tUUC+r0NpYR@arKV#SziEIvTM94> zax_jq%jr!+I4VEuS_}#k$QN&Kmw}y(9P+(^d!rA4hY-EvTBEw{=`YGxQU5&S-MpOg zSO!%OB!Q=l_8ob9Q{3q*A&j9ylHitkvvd0bnH(puAmdbAb{qcAH{ceYW-)TH|G1{` zMReG0Sql2YAwPd4%S7K|^*%wDt-{M70Ou31=I!h*u~T zl4=V{$-K8VWjU$8vp-DcRz*F&?_$GhvlKKN=d6MBpedpjM0?M-vmbaq7TMK}JZ$xT ze?%ui#e;KVB|h7o9iT-Xvd*uxPxrynVR3oc0Hne!wNlzOki@n;Hb#q)O-)Tr#!3t; z)@{Y^VEQDnVy^k1Y=AQBtyj%IT4CZOem2a}*-^@pGlx7lKwG*|V)|`djjuL|GQl@a z>|?T+_~-~rw7tG`4`_*<=2DQp0No?_41=Dg*wG%bsne2=;{I}#i(=E0*yg!o%dr*V z{2i$;92(DN{9MgOA5v>dPqCPvf6d{nN2}0eX3{8!ym|A6 zce{EYX(Ay9WZxWb5ax4OJ1Sc1;2SrrMz4e$zcNWm7a&)so5xu?u1 zhu2!I-{(f81TH-o%Qt>LA2*tfM#5`RT89W6(nNsmkV-A%l4o z-os&yMY_-Vm)v9g2SXdp+wTu!ww&XPm0II&zkyD4#jzo)Xghyx(>vapTp7wG<{eo6 z>^LQQd3Gpym}dVPdeBO0O~uBB=QshA$Ud_i626aB-zM`W-aSVcpzd^uRN!z> zK^1N@%SJi_)pXl!SsEwvj4mnD8RjNt(GLA88JiIKn3op{fhF)*hbLN9Vtn}U!7#ta zPJrAgqs4kS*=_Gt%6fkgBBM=!({rGfwT5(s>4R-}`}2z}vE&gm<{wYy6LOzE)00YZ z+Q&b>b$|c$1EDi!f@_(p20zOOtOg=?IXG4Z8>(;#)L9?XGjXE(6b3$@#xf8PcetK- z#-tOgw$ZoyW?x78@%2YW9U!T8euEX0O^}4u`oEuGB*zjlOEwWuerY_kcCvRkrxzIIp>RHBPI8~NLb-f8`^}>pH?%sF zzeo6VC-zkh?PklgD`r74oc*|#pLf&OK&Ps%t=0tkDLUGZ)CzuE`0{{2+hvue%zAoi z;E}P(J|+9N&+ihJxx!mUbUecdWO#3f-RJUlgf@@OLJXkqlRVB=O(rWHiYJ$2-K$lC zBO)Z)!pXb0x8#4Z7yF>$xU2~+eo~OSWP0kj)tusa71T!QInib0xl!EKm6u8MMExYO z=iAvm)YIn7s7G?9Ap5JaegZYWPqo9kvJGnYq~rA6s~PP&kDB=BcHLYfaku;o$IC5g zpXtTf9*r3%I?PY`CElt%->O<#(%)a|RxLFOQxj`ReMCLGbCQ}YBz3?SD~3sgkC6t-Ui~iP zKx@*GY7}<0gNesNA+^<&@m%)(E0Zr@Ii_`E=*79KNI&yM15m&)nN#^8H_CP)pKnkh zZ7grHU~gFKi3cnu;)f&D{&X>RzMyKW(KyB3$cTe@k}mKZ6SjJ-VO_JhN*5aiBf02H z6YsuEdkW#759QbadqE{2KnB2OdskO;s;H06_2sc^&mw!l)9q@4X^->#F${EbW(pClNV;f#{`V8^MnYSS2TUqgMMRD7kLm+y3d~*>OI|X3(l? zrJ?BqawQvN%@@T25z%kg09J*HBQE<*1}eY(imp+o&8Z>?CH(*zqU>U0-1TnDwdOCc~?-I_|z%-nO}<@sTZ zw$O33NN>q~m<=}f%zpJ(3yQ+Ui{R3*6Xzr@^Oy<>P>PBmEfRu+sV(|>``K+r=)xqA zBkSPipl+F^Juh@m0^0mlFIKP&?OY*P?IEgD%=@p#m3@|76p#u=qMDu%HZRv(K5jB9+pLlJTtziz>R;Xdjv7WWkC9`W|rDE4`mt7v(f`xCV? zsjeK^$loCMcL3;;#iTAok;~dH0XIl$rL4TZ-1cNM?jhS3kK^!s%?OdjOxFf;#pe}w395Z6vhZI2lVW*lYLhgNVn1O7m+iSEsjPsNE z2+4868^kt~g$VPvvqOwAk+Jw-E zVKT<@n!ZRXx3ia8&29JGDvXq10iqCtlWQWP9?Z3|(q%j?dP%7Lq{9fIx>22RFU7v$ z1D$1J<0SGPmR`8Pv}=^H$1d;Nc3cjQBzH!Hz4@61=Pe%eVA{rpFjuy_Vf=JeB=Qqg zcK03(M|mWNsAUZM_jXnNM1>m3=gT}U&%Dfko+2NqMnD%iXI2Nk5o;LqFRE6jxq>*? z&GUvS<3$*|f?EiYjMfq)QRGvF-ExAOP|_&@DXDoToogWri)rBlkAW67`6R;T?(ZQ& zFSxk42&3p^nU7qMVB|RpNcdS7z>XV~2B^gAR}4bWis~E*OVM0EN^YxtQ^)QxPYN~f zxx32;`Ca`KXGExSq-&3%K)_MuZqfid5&-jovcp6c7hU2kR-{3uKPa?^lapcsA|t63 zLm1;Kn!CTa3RdDgJ*J$ZG}($w;LSJXow}?Ok2`SLm2BaiZ@+x$`dFfm9JN@wr(-tO z;OV=K`t$8N>zHNN*b-mS7D4q|g>N#vS10q`QdB}|p~pTdI_}?{yS0us#{ducel3kP)iYd?aBBN6te5bjM@ktrLdeg5Rup|UG5pBaLJ?VuW z>j;aH^Fh5EESO+kCJ|1iw((*>Q?e&Au=Cr5U*cnqK$s_1i^KAiWUCX|@q;-YC7L@@ zi#7WG{18hxntcC9KplDKq>~!kq2d|y?H=AG<hHl`(W+L4l|jbQWmc2nfK{j6fsZ^9+N|kB>Rb@< z-XK@O1{s-JEOObP`n;#+30R)n*VuY<>pue{Fj^lUk3929NE=Oz3%HUctH1gp02ih< zD98`b?TKgzPT^p)kZB0boa+cQ$M5@=u`SDbXvjIChfDdm*YF~#xarc7*ER8&bz-Dn ztAi93Ci{S>=gfJxg}6J`^kS~t)jy)@Ne|H+WH()}FZ)}vSgBL*C=IRnkQhj_?eCe4MgoGmto9ZKnpNG)8rJ zb#P~S^|#B)h*<(UCyzqy8i8-S4oB5r#TP{7SQ&g1?TtfUs-F`z;uv^2@Ba{I^Jd4UW1Bg!tAfMB8 z+>9Mh9et!>%sR zUAZ5>-Dw`54EW@-IYALJc3^a zK^FZ0*xywc2SB=c9blLVx|NR#K5u%>X_cLuQnk?b`wT9o9y0qCj{U3-&H8r<4|(pY9XF*B1s``*5kel_<^A zdnGYXG!hiRj%cd4(pb37#UFdTsh*y5|9Y-Ret{pM(*g6OrXv)T?s}DxR{OHv1;K>G zJ>`SwqnFvVP*+#5=c@*taW%0n)eUw3-V0>KDkA%hLMh%+??)=;YR#!tRwWS5b8jor zUql<*hv6uQI_{XZf6CJK`r%aMj=K&|DfR+amK8vdbAYQUafA?}-f5ja@88=BORq_x zTADNiCgLJ3fsK@+VQRITb~mw}`lCGaL!;(@fIiVzVKP?zkW_*A8}$RIldW!;J~eYn zHBSD0|GC<&;w+W@_ILvlwbPe;3u3Qd)W*}4(G}aUm+3lLmhn$jk{HwYiE=JAi8)O- zE$UbI&dIxP?Y0Y&otCLiZSQbR1rXl#32YJ!R7FF6Bvc%I{1U+5y$Q++WIB(ERzowU ziCYQhS2kF;{hvO+VU@=%9?O*)Ntd=gI_8=i(5YZJR8rAeboLdftAAU^cV6whza+8Y zc`r_Ox7b_>YH#t7oZ72{3Bh*uJE%jOSKC+Bm_wau2y;DNu|$hl*rR7oB)u=y@TFd8 zx3qYz6o7rxkM-(6P(kslIiA{?AiXxm#k)Q+Zi!wntd9cSHr#yx4zD=N za4xY(Hg)Kf^i{rsZdH}=%VRHQwE5QXep=nL;MRI71f`VD3YmG}jJJKv3@s)ND8YR9 zb?KaXR#f#8N=bqvK!-bP$R=fl=VR_9eQzFl@DS@r^KA3S zbeFsbsvIN;PWh1_xRHu3)ccI;_Bo-knYEUYzGxVY{*a! zMetMC=JaL04-ymhsv_BcQK@NdbsB=I(_jWOtciU7lMh2Dkkm|xxbyU zBrg8`n3B=y(Z!B)km}XIEL|`R^>}Ex1sVv$it5XRL0wXGc9u0#_}`~+8zx>GK{?Ik zka|o>g6iHaruKfiOcr6_WI}hY2tcO&v1b0ze7+fVxEr!($XO9P4}ws)&$GtHaG|iz zZ7`kZJ$p;S-ocOE#dfJqKK%MvAX zTD>S~qFZsT~|KmG~GZ2*!~3JA1N$3h4hY zH~#QknhA>zC~|Q}-IHX)TbW8OUh#Yr>TJK7+?;_X_BJaKH&~lI9VXpoq8K4huh<&l zkB#Wc$jt&aZ|tcr*we#fP?zxU?Ri}d92?9ZCE>FKa+K-7zoGV+P}}Tw5b@Y&`%AWM zHPkK`1c+|!^SPfEB*Wly6ZFk3^!G|;48Gp@BCi-Chc^L3XnT74iEfExox^KJV>S2Y zYoI+$Bsyr{=ft{fuk$pCbDpElf4-J%`!b?1Q;R(RaJeo{llTpu=*!o=;%-u+IZ^NE zakN^u#ARfDPUG%{)JD(_mQyMVqQe1e_MRa3HU_Uc!d03K9H0k>{$vxE8y+bI8;#|7 zaV`o-J@-qnsD%U+uHg6eoa_{zJk$6wk}5lr9rdU6AdJ9w^DE|0Fn!#j_otl~wP=?n zqr#rr_FMn2=eab zSfy|i)$s8Zk6IkONH-u(hyBg2jJ2-FfL2F0|)8LFKPeJ7m&D`+>5yp3wpl=I> zHI4z76feXvE!*U6m`$TiMu&a5J#{}Y46}7WQob+S;nCU%W(y31ddb7m(KdNZ_w3rE zvw1VN^#Ow*rH>K0pl;>iM^(t$n{E%e!+Lh`>M?I}sWEuvZ?;K?N&9cGla?2!f2iZ|BCyHL^V9=4gNhHzykg}vS1;&H|FghAN>>ow_G_fFo1 z^s~@WKiuE>y>Ha!m%z}t%&1>^9=fSt?Q1JtF7>`^%D>ARV(8c`oHdC zz;}Z#Rj-d{4JL9sPoU0@d{u_L$)t(|K03UCL+c?ad_8U5!VVGwjbdfn8J8*a>n^}1 z{N~>u-KM)~d@1HZd}_}*h#duL3j35CEXchWcxZHu^(p+jgaR)aPNDr(`~?=omf@W} z4thgpObFs%i1=Beb$qRAY|vy-1$)lB+5M^> zk!_fuxR0AsKkR=jK4=q{&{TTngnQ*EdpBu(dVx5agG^i@>+1WM(wvo#8YjscEV!SD|6c6OQpSxm6~9-iQPEB1tgMo)r_rdpA+1QDh;Suy?VYV_0k2G{y=ygky>@R`s3h(#e zgH&775>Y*ukA?&)Yroh!pPNBPc!r6YHF_&nGZR@|4os4q=7N$v+|E|Nsa89&rKhL& z)wnv^uMPgJK0X+boiD7rVs~Y`OTyml`|{nV?Ye7<{pH>^1zABuiT&HA`-#@Iw|y$& z;-DMjKMLiwG(_qZvr#M%+3{iR7-_5DRqxWwNA3n_|NKg4?dGQGqNQM@9`2CPIU81n z&fHQjjWG5Uu~yGQGG7rYf0E{IZT0@5i$l)`@a_lMks?C~hiW*{AVj74x|lXTTGQVB z_$qyE2-4t+GyFo;q~V9~#J#fy75w78SSb{0^fYSLfxz50l=*0uUjowU_Hmbd&MARu!}j0mV*>{`%$1qRfX% zUkImE0|EjPi!4`veT82hjpw#Uud~z0?E=&^_S6V*f{oX`uzf~b2SNsRel62j({F|} zT3%;|KV=EoT~z$6@CtlV>7&=6;mdjn5M6{CqZc`I8&kWhY`d-mY20C)nbr=PLqe!k z*h|zxw9q%#G8k7U=aA6k6yF`(nGlKfboIBaQ`(=yC8l3CkUVK*yNp3;Zb3;L(oMOJ z^OBT_V2_}dN>z0+Cr>j;ZfXoaX6wQ z;pQd)=+pN+Q%=ZD=QtxVSmn+@eGI;Xg6m%PPD&&YsnejiEL z=R?lau5nozDNI@B)yC1eUj3GWi-+gMtW_CjZaP`{eK~Hs_8c2Qn4j7KP0X9Bce{!2 z_TzAbFK`i^y^(^?71)lm=HNpGYW^*?I|;nVX7%rHx1efj{II%Xyjdhjp%SwPm_z-c z9HpgCQ8N4(pr=HkI$dJe+4bYIbOL9?b7C#Utk*|j;Tu0dew&fHNp2y3k{h9(oK-Rw z0AdDjW z&e{zrYP2;Ud~t@~>i&fDXOUBS(-D8uy;@$S(LSv*FiV4d_C7;?gXja6hGt18a<_MO zHZ=zkG#F|_?(gmI@9y^sC(`JAOR^2d;DIjWX;lp~@wu#ijm0HW?&AsX^}kCR`RSAI zVrQ%YXpc(RAD8wDaad}CPbAyD2qy~y{X%CWtbEOiU%mnkoo<}$jA}Vv&czeyes<76tmEcYpjDMF^O>I(I&1OJUkdy??TOFXYyc&!V0KIH1u%oj-i?F@3C(J_PDq_b`=5g@t3a zq`&!I%)*DGMKR&iH$%0sRJC)V#noS{)cl5pNqE|i+77??Y{a|mgZ7jV=KNW!!F&PP zL40*xvvqV{vPajgdC=owo5jJp_SzdYh=`wQbafuVVyS))wuJOsiib*5{2B)@CsQ}i*7lr4|7pRIabVvKi!$I z>y57oR~QOWYX@6Ch8#-dk|Jv&>f$=_Q z^6vUr+S$6@GS%GF*#OY*j^_ZDk&Py+Ef2OKQC*r|R3)C%a>IS0D)P-|$4mr0wtA^E z$*`tHxvfZVJ#-!iW_};PQUe*G(}jnPR95KSR9Wz_R6Y&kmA*7uD!sU-G2SVTKwjj4 z(hx*Jm^HpZ9P0!d4ym$u)a$bzw}oAnxzlKO=U-?0 zi^jIhWo&b>zVm31XGax0G`llDr1!nsV7}B&YlYYC$JqPI&Q(08jU{g?_7AGE|V{t3>rDc9}i-3b9a?M9xh5tP>4fc^i#Fn(_CS9!TH6mxnd{E`QkvR`loFz)+mgMSmStM&S#r_=jF8% z!QKH`9r05fqPie^lb5(Lve_Xko;*26#9YURdaAG%LKUZ+w{j)0`Bt&cGPpB`@tVzc zB2d+pRtLGB*j$rszi-$2S=>nFFFV0ue15b^+qKI)!I{9}6pTs_`fE?szndwojAnc< z1yat^iH)=XioK+!L@87aNO~|)kL_Fue6Aosvcjl4VR39FKBWnRfHtnS%9zCc@^ECd z!p=C&&;nv+qG9hpm|IvI+!8_zcIb(E*^VdEM*xIbDA zW_|eP(z7(X0qyxR>)$&u81K3YxzD*0C{0E3%kAoP*=aFaMZonG{&+6*VNdgH<{-cx z&B=nUQgv|ZQr9{velR4}WJ;M|XjB&7rcaCx`(A`)@f=*);iEF8$$p9LEPR zG~Qg5!dBPq8snZ>+Oa&Jk+x%J_pL?}am}+A$UWTpf)lxIzxt4N=|S?lmYSIQG}PvOd{~w=?VK76h;IUg7xB8Fl$!ZiTkJn>xdoKU9*6h zuhidhNy&ZXN~<5EUvCkIQgRy`w0Q}4r_LzW#S+FO>1JD71=wrgj52lpsRJe=CDlBHbnb%W$mxw*!Xx;F)CEO zmQ6p!-!4vMDVnWk9d=rVrm}6|s1k}JXqfpg2pXomfVKUKO%BHm9N&e+#Ga2Lh6sIP z!%KBM)XyAmdG_KuE;Q81DgBEt=ZYLuut5hEiI&?Ab>vwh?QGn^3-&23_jWrA6ZD;y zg~}`!*F-cZ|?R=hdFc_y{FmVo# z2y=pepNhQ{=Qv{(HtS?QI9ubuG{Y@zgCP$B6!KZ1N^ZgPO$3K$Qv&SoDgi{KH9#G+ zajb&l1{7`!RiAr4i5LR4<=X~&@W{IudT#Qg{T*E78N2mdu+gYb0i6`T*ZB@EhVcM# z-eA-}K>T%PQz@Xx)=aCEPOc-(O;f-HXYYFQ;cr)i)v2f>{m$gMV=P-0p&VHx7f0Ts zJx)(-2M``ox=Qq+=Bp~6XXD#@euY_ntA~_}*q2B3H=0ZcXCUxDF zs!)=c5ws3o2~al1CgCs>c7j^yr*?JMjP6WJ+V{T9H&Bn?Nnzv30=h9y-O$MQGL{dz zQGXGK{WhQ=oG!G3_-iXoR(r0ByA}!aQPS~Xwj?!t$HgP^9Z|_N_&v@bF=VdI0xb;B z^NEz-5PaLfn)OHeivAuEB~oM3UW2xCJ!W4T2qi#6j|`rMex}(B$lq^@v>jDoE_RQ} z1fRr|(e3yag^90RPnqu(M&$VcqQI^C2v_?;fV?mw%P(?eR(rq_ekbJ{)&Lwg+@L&m%wEIq|9XmjgXnQ{ybxnrN(kcQ+GcN5Rn-UCE}2yn6Q=WjTuXP|_x{`6djvN6N@%e~*iSt~Tj z{Q?k{358Az`tD2j6Q|QBRd#*mzl8Q5J#nlkl14Ft(5ni?M6I)*qihO9hIkAdKcuNy zprYsIN9mo2e?J`7#MGzsM;Wb)5MMq$L?ENH(tkYX9jt+|981yn+%B}v-W29}WT`y#9_wYQdcSInH@l`1dMbsNakv^n{%d%QdN3c7u z6Oe+WJYmRfjT_AKVwk(sLrff7*k$TmwHLWVlQ~J)4W}f$gfn#c?ujhZ7CbNEPR?Iu zPNG6U?Kj|56xKCTonHTQLn{dA)fcCxcO|jF?O7AtfGu5SrBo+ zqxTUxe{p>|2pV$=ru={Z*6KWf+8e?+j)-0T`td|h4n9;m?UpKbomcOCWZyzvsM+MW zzL<+l$RZ-~y%s8`EYL5>HEqK6&M|CNQ0cdDDt&D18i>`|4i8O<=G@M}apJ zT3yaxASjGFB0U)(T)s@9Fk9Kv4}GUZ=HK(GIaZih+k=Rhz&qA|_*us91blm`m*j{6 ztkjPPxu>HDA=u5{VLMyf$fP6-kMCBKzpt>f(eUZN)&nuqhvejNfFh{b*-Jhdud;&Q zD!GviKH7x%z?XY7tTXlcufGyu`kJ+(CU&RAUM8uT5XrqFYiOu9G=4riK*=6CA5HG( zhccVy0b3G`et75V>fHJQ&>+0~T^wLog&Yqdrp~gz$zJk*yn1SRmvXS`-6p$NWapxo zws!KV)^j8of|)3v)5naAm|%{EcMCp`OH3S4#431a)YRbX)k~^A1n78ju`Mm8u701_ z53ZD}OjPFdmf%O1K%hfn>BZDhy=3nEk)*+ecHt1=UU5;1`w@xD!OHAN=JmzCtN?f% zI8f*H1MMCAP|e$)`1YH>hor`D#zSTl5$7#D^rjMV@$e8TDJhBk_))(xH8d2mp8%Y+ z?S&w({CiP38=Invx=JD6i}h zagzF7*$Ep$?vCJ$a&G3n(h(5%4MaohEaFPSVhkg#7L?%t=+aRsOmp_NE|5q94M zpe*M?m&3J{$*LdAa4^T@1~h*s;QgdY=~CR-&yKe}n{j$4s~qR^e@rz3@eD$ye6TrA z4Aeu7fFYCCs^)vEG3|c*nJ?37vJwu;#1D~?Gp6gYIv#9*7`!@%&jmjgDAaM9^)ngH zi(l?dawsz!Vzl^O_S3DZsT_=xH0!s;9Bxk6QO0V!m{zoD-^`2d+>pl0qKHg9m0x9y z%z$p&6PHCtg9SH6-*x=gTvv(i#AkfeUHRj03kI8+7H^kNYQqH|Frja1JRikJ*}czu z=`zfD^LkIJ;B+o zv%~dWK=IB2fVwO2+)MAH<4%cQ6DmStZv5GSC`T#R2#Hb#qi(mAR4^sguro%lJAn(n z7^8t`TO**N(JBctZ4b8o?7=P|U*uQpX&C?d@=ABK z=@8+1Jd!^_8MNcP-_0Y)V&~s)*DDy%pCLg!{$}fTeQJO!ChXlCGqW6L{r1sfgYLYC zM5wQROu6K$nJsDYa+m^o(1-{ZEB5;?vGJLW0<6bYpWJcMK_zXUcYhT@uq2)ls_-hT zMyqJEkt$N~+qZ8h)Yl4vU~|=`9EPxLIHIdM6%l|4D?=_bcQToOwip8yWJ4Id;*#28}*B+${!Ft_|epn5{l(~6;hecsb zYEaN5;V^=LHs(nrYF)TCsL8mkL1W|Da1B!6 z3t^oTC%#-q(X!0upc|1^zgoTD!%-S>!dV8oEZ2Aa%@BH)TZoE_5*d-4a~=MgRD2Eu z$8Q_j8Nj$zg)c3biR@obqHg-;6MgU~A0de7^DDKS;INudvb}&y;9QsN^lwh3g*lc^ zWW`hCh?7vLOl0trykz5@JKv(wZgKd0xkx(%DL&yWNxxhwVYO24K8E)n^kW*+wY0S* zg27vGTrLpZ*y(h`TvW2($VJH;%AncU$DO?*k$Ar!O^L7G{Fn`T8dO-3HL`c1Z$w5YTDY zK!D&zP=0E^`)-x?p5lo$b$J4?Rn8|wq3y5nzenc4As-v6^g|*U6M4ssOL_;zTtCup z4>3EMwQ=)YdjIrXe+6Mo#3ZOUwcaT5U(RP6uBVnmosr))TN7Iu1avAE5v z{d+_mxeN%5coTJf|My5Fkg&vRAYVOzY2x=#3;rjTJ~zm_&|>gTNSRHGqL8)3t)!)>EON4MhbYCo(ETL`=;4+wgw? znGbPsfl;zTB$wyMXxB)^h$*Pm)z!ejK-M-b&&xxb5%-@ov8g~ToLuR21@d0_UoEW6 zWB{niVRx8gu_!%GsPA){ya#H>8Yva0of%QYJl9e+0(ofy+%@S7pv%t#PrxS!hKIL; zu0;`mI4F1S#C!Pq`|AUe;RN79Y1a`=ySo56DCd-qO2*USBqAbv~#d`y32*A==RcI#;K^%?l5mVspg# z!IdUOV9Yv_ri+HVPKJr+Tvf3I*>`7!mhHVEMmBIK2?}htHqG0E{JrF#a_V zVE_iN;&`knjJo1xvmHQt24qvT9{zPEg7E6YVU6~Vjz-YjF$vep`USF)R1z;97z-)K zV77wKq8@Bbk~&Vi^DOnISchv=*wQHHsd|AvU>ZO*CqQV%YS?j4;C!PrFeK!$Jt4$< zt74fV3D!#D1R`#yy&squ$z*}ZQ+S-{btMaq`)b`_v@+-f>&mOwuN$=-C;b8_T+qSJ za9Xl9yMQ)@)QrQBk_t61+#c%yjN=!(o!Tb3ZdGKd6eh#oo^ZOK*~|9r0|4hOI)vzT zicu43Upp^<4gmaMLOB?*a%a-69#tL41{j#O$iO{9VDDu-nSBwECp&>O?!_adjs>F4 zq00JSr#hGs;r|~Lz^S(7OMrr`4N4nqPK(h#g--Y5Nn@lBA3Fft4F{d^`#&aZL->5J zp>uh0U{Zz<5~sQhkaD+cQvgm|ndyL3Tytd5wsR~??Mb6AJE$EQ5BQCLcExkFp|FEK z-s||n$W57K0TOW6N*tdZZ2^1^Gs&hAL$%~>5JuTVX*7lF1{(r_1E!AM(qgi5s7v!c zpY50BUIb1n-rUzbc5WeO)o(_RK%TAxXtvuT4GdO0V=qrfP>cJ|#2Y8G749aG7_p)6 zGXo(zd)p`OBu0)n84xku5O)?3Bu>l7Ll<~nD=o-*$$IoOoozBhR>-{9-iTsveys$; zcpxxE)TFvypvZr(8BRN)7gmMYlL=Y(R#C!0wPcoL-i2H+Z$guV;f)~@pHrCRkgJ#z_$4zSn#igOc0}^tw{}wk#ONFCt2PmL!FBj8sntd zru~(sc!{mXzRlC+6ybE{?OJxI%R#?{;ARz$QBm_w&>=##*Ms08w^hN*jOgT}X^TX} z;QYChCg;zLAqYW;v(iB2-x=2$M!KBs<$Cqy%a=GqNv5QqO=?f4&W~8p^;PeYkeG(U z(C9%OXLN)U8_Y%q=8nE&$n#biAFT94g*^nEq*6P}Eys62&oYjLhiOW$^YVClTdlI? z_~dlKJV_9Yf--4>8Yy$zkO7OBne+VACOheA-fZ%7%{d1^b|>b*BXB2I=C$A!R@1fa zMq~G}Vk2O^54K4}+)~^#QV@MOrkm>bzhEkMW|a*+Ru(a(Z{M$cO&qsxgNR#Xyj~+{ z8*kB@{1hQ=lRX0H1FR?gE^FD}x<2NBmrRsSs~8L}HJva7*vAP-K)OA6w;J!pPr5>2 z&V&)mMqLnA=9&X}PRrkeOf|tlLA$GGGO=LXkM0}LO5e1yVIL0>mJA^_2I)T%!1#b>>r9t#NljG$y zlV3dSIh(B&V@mNj%f{&9B?zL%FHCG8iOq){;bR%U?f=l`WWA;}EVSkXni;GhpCZkx z|5gXh4CU8t|GG431_4IAdwoFQi*z^fE|mp1E(F}%K_Cb2%ow*&>`D!g%!FU##QN6D@&Qb_X zOMsr72J=XX|vW;dO(emPH57IfM0(nDowp;M^3i z`^V~Y1MP~yfr9@qaPkNSPW`VtJQNYk3sGni!puXyy+}!6O<@HU0*~eVJkj7fxW-K6 z`S&Kfp2}UmsR04?8lbY%-e0i^;E(i7yMJAffGid4Y4-Rt^TgyOpQoTM3A)qCyQa-QNBoy2&>Xs85cq+{_uZ&p+46ajPGa`$A6XI z7i6;eGe5%!M7{jLe6_#sW-|krViSmfAgE$DoBZb<5(_*h-7D=!M!wX%k5EL*4@AP` zXZ*vdO~&a}p$NjU>Z9gMAr#JBQeRfYI$?!~b&768+DHE#S;hnbsQ=S- zM26O_<9X@O+}4%>PNUO&7*CP&z7d({#V&l-pA^uWDp?AiSEqDf_}CZla_Jxp!nZ2d zafyhOSK`2hJ=I{$d$hz53tUnV0%RDV3`FJy6YE&yv4FG%&Dwb|IxGUP7qa8-pG)MB z!E^KJ;tu}%zA(8LV9yOv_7`mcjh{t+o)phvoUYg858o*1l(K26HwLKC31F(ol#~cC z6it#L@qY+=>#(Z6Zf#h4BO$QqP`Xo;ZV*&bsZE#CAR&!(Y$R1mS`4~tQ&JmHX{9?P zq(kX==kj;Xd(Lyt^S$47DSzMw*P3grImWo}d)za=iz_c91Op2<2VgpgMo+#h-*v90 z-``cU%5DDQTRAf|K0bbMz4r)Y zkkiTpUR3(qBcHp&xv^tTZ@1(;oY1{jP7qt2S0Z{NN}0Uev5 zs-u#doISm3BkpzyC^X+YSs0{DIl)dviB#XBHBKC5BH!R+8`Ae10AZ4^R z2Q>AB;lq2s7X#SoZOYlv&a=a7X+l=G%q%Q@ZUX#&)`4b|gVA!ZW7!&1nEN`NdyDKt zKusW624P~>+P?q>H0Z9TtQ;}%9;y1ZiQtHG@p}zuoNfZB?&vDKNEuoPVuYWIAXHpdZ9YhP6|VBm=*mn!QW>FK?VPFe)f*@ zc`uC=p)d8f-HuIu|H5&==eq#G!ObdHeg-QTTBX}P{@tR;3(tDvPka$-{%MFIl^>0C z3o%R)_duH>W!)$Nq9H*JVvTiZlpl@#)9Zro=z^7b(uRZ#aO&^F{duKQ?1WH{{t>eO zZ&$})P?3{!8kG4$P5R~t8Z;6RcAv@-3=*DNPfhW%z61EB6yTTY02O2k4@NZ3sN=Wp zm1cfpS8JFhv8*I|(KKHiy3wS6CR+g5@;@8x*oVL#srZcJR`zAaPW@+(D^xkhM7ZiC zHdVt4sq}B#iic-RgW({alA*>t$lzbLZ*V)nX(&nVBgJ^;roxqtdz|kJ!U!O8os19S zR|9+XeJH07{_9>1p#UTK*xWU(<>BJc_% z?uQc6#$Wq4Fc5SvSBw?2Pe-grll2%?dM5$yLEA%9Bspq17|MS;Y# z04BlE`H$WgmWS|zt+pJJpPKC3>tiOF<*Ypx;v+3Ow<_fUKV1w3Sa1zgAMhaH5DX38 z^yL)OKu|cQ$_C0nnV@Aj?;-SNCISa5EraUk#n2lN>~ZzeYP>xp@1@<+TIH8t2qerWDV=We%&J|9?nlunGrVAd0= zYNg)mt~G#<)?tI{m6%%SdU__5fQ6W;-_~8niAo$GMZ5=w^j+p#F)~2=k(K5JT19{& zPyq`D6;Rv_wFCw#DJgl+t~zFeYL$_npE%opA0NQ0gJov2fJOS|-V5amvw#zv^KNa( zCu9To@1a)G97y2sC2`1S0}b$&a=RbwKa@e&wrLFo&oBlHHOypIA7B8vco z>I5oSvpaU*u?Zi6{AAOfCb^C3819`9>8WsTx$uM^`vX!5IN~r_4`eyD(^HNL0Xzgg zy-S4^59E7Gfa%zy???!94wj(lbiK%>-WYXxx*;9e4=@a=y;5MLk#E}E zfbS!7Jdf3zcDKj9cedHD@6QizNl7}V$?7(M$izT$^S|iB)@(B!Xbm~Hn~zK(oCBav zk#j0bj!HvCD3ty<1Xi* zLF@+d6E^C^zY!?Pj1wT4Z>~KOs0ShZ-+!KxU5$dg7Un;*q|tBXp-w(It}%vQoD7K1%Y9}{sKZ>|BAz^XQsCED3nXiXn|pxC zXu*H?l83O$xxNWNety0}cN2h#02NHyFTP5Da0<$UR`V{udVN=U zBAa%#bdeJDA#nLKw}$U2r)geaQlp=}4^r%bN=C;3Wd~dT7cN88&kf+1BKX3Kir;MM zMk}P}PeH}RzSAFS|L8*aRZRG+3AOzUAnuUy@dC9wn*=sA7l8g;!Q)Q}B%&6Svxtw+ zR?lP)ehK-8Km;D=y}(>YX^V$@P%dQiX81IP&>s?iSdJbn{V+zrll?!oQPE zKmVpiE4V-Xnc@xU=SqW1CJZ)1fLDgARJSIC%fFIj<)+;i{IU@9J_^p^+rRu>sDE+6 zr<3CH{Yzmlg#PpA)#72Q)zriQZ`wp^drR5Ox!lUh4ex0N?wT%t-AERTv%pNtL{$sP z#?RZO-xJ@5BbxSB1$Lepj+fyOP?9_7ryV|z0eh$r$UV9-u9cN3;^N}>)z$B+##>og zl{gwYLB*I@;WeAD2Un_uMKe_qO63GVY-T+z)>9Pv|E+c@W(S-k`$?=Ix zBqu<>%Aq-n6{mozZ!{{Il3vQdC@dcJaJ#X?KppT+lcYPYKGbKc&BH}&YHSe}({+); z8BJ#$&9SKNgd+#SK6cG4YQh!c6O%g;Tb-iZ&hc*nMiGvUFUMQXByAM z+$2Cb^;dM87Zc`w+LmqN4^sqH;~mLi@s8Xq@a|m$4jebCW-wZMJ$BBxsPT1l|7L?G zC>y+R45{)${r&~KAaB3JZ{fQSpkAlC8SAW!&UQM(2+rxVh&eYmnqdgHIE;AYlU>kvGi7#VLOU`T~UyFJk{Awg)1Y2xif7)(7Y=(z8pXd`i3&C0v;GgaN!J7wWx14}Pu zEO-aU3V>Hca4Xm(uE#jsD;Z(H-I}T!I49Jm)_J7z_##oCq4N z=ya)nj=y`<4Jwdpr*A*T2V)aMOw{}jDA)ZL2ej5TN$J@w0)BOc;`=!80)g=_nglr} zD1!VMA?*2IjXWi59|0?E23ikLbOLA0fgq?5ya1j3lN!|I8&Fm;ViZB&Vlxq%d_=7y z)b*e_QBIcv++m@_e#7=6_8nmW6^28h`CkrjW7rGEN{d z{1S2_>|Z|%xi$W;>jk@akt`OluA|iV`%5O6Cqdu(z@sb)oEp2t3R1}O3o%dM>guYP zj+tZxSpzhp9$fSPYt{M)zuU-RhC?^A8~mT2{T+YU^PgG(=wAQfKDWn}DR9L-ZT;8B zLGG{cJ8}lyCOt@RG9wlv55UY8)I0S}r0$(t>-R z%lfTi+hkb&zacyS~);q336=BelbHpOqJLC*87_7NGr%*9Z?x zIYq-Y#{m~_4o!(UmABzOD(T_z?~0*OZoWDSys`nPHbEm~?KKGsA-kon*s4B}Dc+y% z12SjDpw!Fnw*k&0{8zw=(FXLQ7Gq=IV*ptPNIj80Fflb@{s_$KG(b{;Lr}+5SARMx>ZZRJ78N<%1G59ZUpzt5x~~JTjIoWD2Q_e$ z#gKa!jm_}rRW`7dDQ#Hi_5%ZA#(^E`3rKmqo8CE0A~-K?0T-H*l$<;Xh)Cyn>BCfy zt;xI7+(wBzW>=>vaJ|o`>pZHOnq_sx;FpTdJb$xs1O#wKJP{OBRCJh6fRprQFy75_ zuz!!%2uxaPq0|g9O?Qfu2Y*zR#0H@mZz=0oCfrES4TtU%DW?XrwP1j6x*FL@A?17Y zN5_|~UTz*_>lr-NRcFw9OT*>aZhGSREkPtXi?WW|fv(nj&yr5!dA4`Z5&zNxuBeRCgQq?mgsAzz>m)S^ueW*F)Xh2G_~qk z(_VxL;8`?&=g`ZN<=)&j3r-e&xBf?!@D#9x_N!D|kSr?`W}v6H;#~vgG1mXy%5526 zo0_n!EGH*yR@@W8T(VIAAbLFA^P`rl8c^&YV5`>uq(1QKvfsD?OjI5Y1YTBYXmY5h zJ%Or3VVYY~-sMJu5f6vELtH^w=|sjgc?N`J6TTZIHo#c%O&_SY#cED~mz(h|M9%I6 z=t5#I-voY1U@9%?^~>TD5b(-NM$^GWFTj;VOzaD^oLi=H-+J+Ts21qf8oQg_gc#;P z2*qf30)%tK_i*zUW!LTv4o#HPBN2eD)?a;F0~ zpfw1i%a5EO6^mFbM~`#SJ*%x9#*{jAEDW=($ zVtJ_z%28HeJyr|wQ?Z`ckd>UX`Y>n$>pn4E0DiAD_VnxTr}Maf;!6D$vf85amUu%y>@q)xQdN zgFDzt(WMgv|M5wdZ?h!vF$IWbBS2fXfX2wvoooCy@>1Al{`Kq1l^x_=X4iCTcL5;* zL>-{s#$4NQVvq1D@}=rNo3j`1aAu!$PDc=I$YufG^Jk-TC9?*7?VlnIxiF&SWeAJG zi^SM1PXW66xS4>nEe+IsWaqW^ub?S3X+&^wbGt<|E8V0dI({h&Am(jxvJfJI#^%Gx z9x*;ipq!ntTm+FIYC5`_;T{L7pdM~+?oCig)CFVVH8k-~3hwoN{pyOTZf^OilQ|rX z87igz04AX+bMnEcykhNr2`?ey=L{H>*`BM8oCCCez;<|FbY}Q>hqC6C^`^Dl=yl#T z+M-)bj?sLzE<&W{?FvYd^0oKI-&m8cMNfeF@R8+?m`k9kbd@@>bl}xgR#vv^8(d{( z#Izt8Y?mOs{~)pRnNa?xF2~6oU6GaM<-?&HPxVX_cdCkko@T8$-r?w5Kv+zR}p zfVx{zp`rxSKqN7ey9QMQF-T)*nzn{`XY&EDn6gS?h^CrNYSQ<4wjb~_0f%%kCzQAn z^vUl%;hMA20-wj5Z6;in*wIyvtyosLd!q53utmc5E+Eh|k+Ya?6q~lZ2!*v`P=s7} zz{cjpW}Q@#L>Nu`AM|Y>_0nJ`0k5)Yh?(c`$LYR=JkYj)8pC5tg;icnL5@-2ioHgM zP+@m|6)ckHMX)sG!|L=?#53vrFD%Yd5R%-DgArZB;KSc??&ihW*^upV({cnf*7}l; z^o6dRDzb6lQWNw<#!S32jk?YG(1zE8aXumKf`vk9=>{TJ6n3TT?}Pt9VkOmTbG@jn z78t2ol!zSojn*T*f=iu|2$&316c@#bw;lB2txz^0RNCYI+$^>IU|tbbD-HHdXOmdL zPDDowK(M#x(0A?aze^Sspc7l}!V{=}cC0-l+{bVeE^7UbL&~DFn0S4GZ942Jp@6f7 zM$>a3m=PQL^o~x9L_%zYrGjzs$vWV*pI<3sD>yFPNTTBRF%b003qmpm+kq+38UdZ1 zqYQL8s!gGwAXz>!_)9g|pBq#DfIPb1Tkpfg@_jetQ#`8%%z(Nwm8Ig?s;xVE8g7cf zu4II1z|8&_+IRb~iI62IK zD0$rx>$&sC&R1_y-`Ov;Cg&OFY4uD(pW0oFD%cfpd9L->dyZ?=*S1Og>3+87S54~c z9T>UP@Du+UVtqFb%}nKBP#jl5zZiKJKiyMP3=$4IfnLGW5-U=?n8&-$YAAG>c(ez` z1UOT%5FA0h+dntPE8bU)o13_R#!P~=8y@N{%Ob*5$aw1F9r{ODR!ZgiGCL*jdbyq= zQhX7~l98ZrR$(dcEuUBq=o@1LK8nydiFHm6J@fDm!)Q;xb}A31LB=P8*87Yh=D*Os zkpV0SrT|7v6W~|7J%@n#M7k7rlI*O>VrrJ}w$TzqyJ`AcY@y{@@PdaoqU4cUv9UHU z+?j^u5sH>18;^)D#S%JbIZ%BIFXe&mHAS+V?yh|zgYViq4Z-)OVP$}K$&(jCdT{Dl z_UfW4W}i%h?2iz=m6rCq-=14&`B~rJl-B^Iyy;$U7&WzjQJ6k?bit=-?luChamL>LpNpp$LXP9*lSNt+jOMiT+^+3QC%smq{g}~j z9_+BbvMHES<*gMXvRt4|MZnx1BdN(XvhKS*HegOD#;z{c7=3kPW(U*(NIBVFuDT(C zvT{53Z?xg@%Y#d+9_9NFt4NOoobJeG@#8tqb!ki&#gwYP8iu@{$C2&0HmV5_40rpCENRo^H2BJyHCv1|Ke*%fw2XhxY;lK~7wPC8Ab zEP|4W(8rQw@%n&oRM22Cm&?w|d<1zMHF^P_JdA3=ndR^D#rE>kfp3XTOfyup&D$JU7%(M!(;g z<_~)fsiv?52%tiBQbbWv2D)Tq_ymjqtwMv}-u`2j3N6cbtp#KOKQjDXPlE?T24rN9 zziU%2Cfte&dWk~5T4Pxx-&*y`Ff9Qim^FRo!R=g(1h6nZjqho%z2&P~Kit%$S14Ab z&t))Obk`Wbd`2TL)n0gA=%sdt%l@5@PTzPinMu+>L7YYtjGfDd%e1bRt#6k%-8}s5 zTTy#Nzq^3R?8L*K!mZ;W)%Jk67^7#YPNJDw=9vVRUT4(KhNu@7CzFVM>}w(eFlkff zEP|c;18!qy(wH#(cX$|Ku@ZQE&pJB9DGg*kqfmwr)1=e0CSL+Pmx~!xa@8 zVC&@}IN~90@y_$x-T=k&>;a0GDRDkI;w~{WQK>Shrz(5MN~zIadgi$;^w$J%$(>S#yB~%<5@1?QeE;u8@=_oZ2O?d1|%*N}q@K6#OES%fLU+v(d`s(Vw zHg}U!_v@@N!P`k~0xAT#I9G~e8J1JVQST@mQh~tUvaHlv5GZa5USV^j*AcHFG6&-ImYEg$=*i*oQmQXm11CyNW z?Ak)?y$lYL@HZS8B3$vH?(YDv=qMpRD+!;_+PgZ{&5FIw2-J_^JL`#u$*-(EXFGb* zPV=9B${YW6R#O8%`sTD>^~(F&5OzwToP6$Qw+;9;m#6#K@$)vWEQ%Qx((M@JmdfVW zDMOJIN}C<6JwliVRwfF5EL^x1lybIhccW{rQ8E?V*oxxWs#Am_1ejJ55P9ZKiF zT9ygjSfkj<#A?N_kV#)GsPT`ui_=^wI@%*Vs2vnX`97Fi;OKMmegbqyo5V71wERMh zjXRo=x6$Q_#r2I*KJ}YE(oiWT!syERXf0OUdy7U2Pmyv5`1c9zWg5$~6RF8X3d4Gl zUjNw*+?#-oi^ePy#SM#ML_f)QV!4HJnq=GF3c!%B&w=H z@SQ*A&Bdd>2W$klm6&_0o6!W>QnP*bu_L7C;(2d)mCIv7IGAq)V@?>i2IDY(>e*d+ zLYN{Z=Jp=D0@g&Wx$x7@ek#!nTZ!=wC^i4Sb4<8NpfkIf!dLyh@)M6d`nvCLGlt^I zZ=1z}(`bcQ>&Wvven(v+=}%hVrHV~06))vc_-bJ0r_qn9%GvylY4)`s)w{uQ74`)J zGe9@tToNpq%%PVciXgPiY>PEQGZpSI;|{3vK2Da;axl!fN9xq^^k!Y%rUpvg!sf<6|YmO;@$FhX}%Z!Ca=PC%^h@3yP&tf9b^JN6}ou{7R7YF^F7A(E@ zMW>q0lAXRw{utfJaBg&b<@A)|uE^fm<1?!VH5bnw7F^sZt9+oRj7t0SYdz51j`#ry zR=I@yZ+x}cngdkoQiL{G(xA}J>q4%WB?hqG&CX4~jgqH57HRkMqq&#BbW26yUa3FFt>i%j5sTXi7p{+JbtNu7 zA(5P#(sVl#PR@BepVlowRK$MTX_1l=5}s64+VIUFoaJ&zK!DVR#^P%<4SB!!DI2bj z`z|oRaMLqn9nGUxT4Y|GVOMTqRbt}pmKK#F-WD5X6|9*?w_o~dE0ZEQK~#};(liJ{ zyObV<5JwOjDF+e(zbCxlH(+O8?&E2mx$rZ}nohSC#tH`?{(5IJ_UJCH<=~s0((1EW z&O+@InzPl3^N+fRlX(u#WGusdU`}XCSA`OxXWii%VBK3(K4r#V`7E#?pD$&8=nFAaP^(YwjI%G zgk$Q21Xdw%E9s79@@hT=VcH$L*93QBk3+rD9zS6^{zon-5r8J^d!d9v4J~Puq)lTO zj8|a9v2y60`CS0HjMhhuR@pNj3*qSoQ@z2CmZuLB`i%Xji{e(1^P(72tE<>b6xe|B z%q&SLx6zRwW{^oRDRlAT5lkVA`lo@8Q1_R3b9CxbGIhU`VqYxVwE{Wefx{>JE8KEZBb(i=_=yFE)} zL4<$J@soJ*UI<6kakqW=oR70bmCb->sVeLqE1Jf*4T~@ISbBR(Dl!RAH2XCQ7K#c) zMBeGV4f7J7?y2BbNNxYlnwZ~Fvxqi%k{#qHwMa5LgnF`&rWtrn7E01jePfZ8+5eSG zr~(OdmZrG^Y7#(!CQ?cQm$^qi<<#gM8pVCr4jOz>;l(3!isdNz^UoD~zf}oy`CHh-QrgWEZ>oCLeqk-oXL(dcpiiPk zy{3E41n_MF6)y`LY%dO?*f+S(-_3b+`$#W znAz`%ALkT3&UfR&bD-vpYl;@6Es`BxMPeaXU44`kIfj2{hjOedGDdl{H{cZ6hSj%v z$MQL)jA^F2eHqodZX;zhndOpogt#Ljg0zXb8(jFd1)amH!JZp$_F#v%<$h6?5+hW9 zK6(x6&nLP}m;e-DCV^ubBD%5truAs;glzBqTAv@%P2I+33#eMMe(O0$!!W}!o}YcR z_V{cq^7a91I)i9mwco&|ZBo+R+7s~uJ^`yg90*(n39&JL@#pGVD+ITUtl@bPwOT6v zr@N!2$$yRxTqUpBr^3)o7{v{)Z&;3Nsf1w;%!~4_;@7u51K66Y&Y4Sm$%6j^m=FFv zfcc>_XU{Bod|8ufY-+CUqH?oTTXHzy^0Mxu=dVbgd@;~(=h-=gQ`;9|P&1I_y=r+DaF|A|(3UjoYREC=5gmhiS{4x{*F@Ip6g#eu zz$Sed6f}imA;TgQt!hO)9NG?@H5g(q-iJs1y*SnX&x=#d;;lUTTte47u_09#5!=`h z?ZJJ&N+6KGDwxjN!2ab#dpmdI`Y(mE{Z%(ff0t4d&tvVH3=KbX1u z8#M|Yk^zPw7pHGtsQKEQJTUU;lmr1T6O#Y|Sw+{OkS7UFg}@*7@uk}D_oL+_XOB}Z zYRjFQ7|RZ(oL<}A$QT*oF6xUgtr(1OO1HAPm9Vpj`N}z<;7f#a(h{cno7r>!j~=$^ z_L7ciTbIq1#a;aYwo!bBdQZztMmisBKX%M6qMBT6Z|RFv(7N1=a|TlW*Ps%$Bpa0E z5$aYii6aJAG_+utr}Ix{f&z~bQ-~=i+(WIr+v(#g%23ai=kF-W2>JRm8qBgXD>Og% z9XC(M)jLI5n3w-pG4MRHW0<}YO)M<5cbs#eoOqo(^0dXpz-G!k^LgV%jiuk=#cSVN zFP75yN1GK5r}yk*-t&y-|CMfJDz!$tPg$mf6_I6{yln35Dx>-g5hZ>vVc?dKQeGCk)<_ey?R@D&?X&49lU~^vCXN%472W*}_s-4Mi-dbvA&JBsI zzp}W;HsbkxMs>3eC#hyHxSuB3hJ*NPT^R_;AKNB|&ocA2jLh?P(&?BCxs|b%TAyKp z*ikqB(R-*0u0Vd}Noa4#?F*>`yzn?pK{Q5PS z1JIx9Y#?5xkLXKnZ_vhE zws&Co%+;jZSae<4mZQmJUgK5wX#R)l$*kOfHF#o)<}bW=dD31Q@4y!R0WR8&J32K%Rs@oF`aW?`PQo4yorF4F{M`f&c$3-l- z;;+BmB#+wI`a`-^FGRnTH)?K~*BfvpC#OB;8BM?&69~(mqe`5bSyC;ouI{>Ycjchs z;S}2nykOoKV(ROk5gi!)m0@95V2x8>P_wM7KZf{PNNe=Du#4Z{v7j$Q|45`Na^TmK zDaQ{e`Lq+}1SGhphv-Mz>F@7>LaF)-ZXyr#F1u>sB*P*67LaNUqw}vjx?YF*^#O+l z`)DeGT0q{-K~HQ#WXjPB$XCm~W_`MWPVear>E8)8z)5x)JZ--%;O;0|90PPHj=S@1 z{kq&dJVmv6h^q5d*{ceOvKck;GMNJEB9j1Kqw(rzK#(p128sLtAGrlw1>Gq{z|>PIIk#*8)6b60uMr^k0i;qUVw@F zl7@y!=*-Vm%&r!$rBCV3Zj>C$%gg-_Z7$DG_-)s~DNmb#P04qMtZNnU8ExBRhiuIHeK&x@#x(=D zqiqCe)>m7A|Jv({pP%1zSy(S-0b;yRWDpEz;eNgD>Swx?Po*?qI5cuBdugt~c{urT zJ&(nfAc>>o9&Q|}RT}6M9crlhf4=Vr_6v%wapJwojmFh1KVviKC@)dx->Xom?0ydU z27G3*=##q6aaTm8={EABH*+hTmMk7=Vkd80%^8$gg4Y9bT17m-tdrJ_%KmrBU$tTc#BX2 z91U_(iK%@BomIE`8MhmplQ%I^0W$58XtdvY5C&HJH@JpTd*AzT57dX(EM{NvY83uc z3-AG*Bl?-M#v!YKPGBuWao_3K+2`=f@$%tZy#6F*^KHl91yED(_=SQXlkw-rUbU*P zb)Hq#EoEag#&flx1;pn5;%nmc$eUZAR=s>dlic*1kG4d-wZP2t(iQ#8}t z^nAv3%jrtKs4P$O!*3v2M|rus^C`g#%Iu3^!zyw+ynRHZ2t}yru9Ampm8G2PmNC=d z!8-pC2f{Qkyt!&G+V6;h&}Xankt9Pk4*FDY!eVE^yu=ppIw_xWZtQa^CFSgwJ~FPW zx6+RL5|$b|s6@jmQjNrb-Gsq`)S#Avl2T&99FX%~Tjs(iWq}tx_-c|{)o&;$DC&Jl z9NE=U&4HC^iQ*PG=<1GX0`ewmHY}awt%mqA`57R9r&)%(*^>^-eUv}6-@||PGFEu; z2ElhQP0Z1-S-+a4AteDAoJ<$AJB$wockCt2n_plPnMGbll0(!|>`m!Oe3{(??0m>N zEy@|S(Ux|VmkE0S$f+_o<9(DmQ@eV$%nVQnY)xt?h{N}W)EuyiuX!^_ z0v^5Ma_H=v+F4(RBSHn8e7a{OdB;rQKdv6VR~8pChnTfR90f}EkcMAgsHOO8kzzq| zp=WdljvyI&L{N;P6oiP8&cEB>`^N(ANvouxB(lJR-T?5aMUBB@!fnsjk{gUX}=^*0fGkQ8J zhW=GUM5H2@&%V+_!qd|fH_4@0Hs#Hn$;1#uwxw=TQQ%koje``=%0G=y$MaL7H|wK# zW_C_~r!C-k&U+Tkv@6Th_nP1Z&dL|f`BBN%_sSf5{@JoZ%HPPEX~T6&d@6foV4*Uz zPu1d){qf^lcWr{ty_>(HC8n&K&t17zW?s&3;P2cd7^U^!+1*}b0PF_Plg)UgF49CO zs`?o6U^G`5ZhR>;>jMQ`zW8w3aSS?#9aD986OqO!QvRs7&jg+wq%J@pDl&m)v#3If zwS6LH3WEnuYu`t*LBoD<`tkWaUbh_fgeq9x)8 zDj*?Jo!3cmSHYG^u9_n)AzoeZ;=Sx|9zoJOsYD`l-q?7io4kn?-{d$C$d<{TA@2z* z;BK`s6ZG&1FeNZOF{hy5M%`wf04Zj=I}h*hk~T>Spw z5ICcCRYCp!Mq*EVN-7Tw-pjS3X|;4~9G5pY6|b6#lwHv0MdS={M#{MMbz0tE3LFz? zUv>M2MX1N)`JK?Shct*E=A9wPko&-p>cQo5HFvc`=aHZU)w~%4csw~J7cmGt>15f9qBPD-DP=Q~Oq?En}58*!V z`1(U<_RsQIyToHwBNg#i01&Xq@@*NuNv)4criR}yG|MLRTR+#(s21NV?G)LnyY7&k zZND=+ID#(?|IAgRn$2A;GQo9tSYyH~z%gRoS61Hf%y9Eg_B#Mo#dgNgpi`9-;nV>ma9;4Ib{Qe#(7K4iY^D*VPzb*I8j`noMNhuKr+e^SM(BaY2uW?4n zeZXJKq_E577I+0f=6#FbK#ForJg(6EN30|frC@MWEPFd%x;8d}$Pr}v=6(@h&9H)w*{kwwQ+W6Jc{hWX*dFKOuLKRz z9|>;8O$)xIrWorkT{mVZ2yiX zxE5>v9F#o3CfFd;em;7Bkqwb>1XRvt6n#wtAZIq#XjowpbTr`X1+}<}T)ZRWs0|kK zq+OTABss|ajK&v|qNBTNU6p>9ATIReOM=9`s(0oxOt#+mUVMwo=F5w0>z&+0u2?+j zTKKLZCttnIm*Lz#i;THcOPzDrnD|Z(8imi|yxWl+l)g{>0y%=+gJO9ol`@i-+$g*q z7#7#`jGUG)+20Byj&`3ZF=A6GvGTg!$D?-%s-kb_i@)3xPZynLda%$-s-znx)5R-j zQP4%rl)OI^vKzL+x}9L!u1hwQC{YpMz#BhSy5e#pK$&3UzLul(Q?NtrBQuV6AD`J8 z&g|^T8Ny`77>vx%h`!YR(6x4M?5>b<_Fo0U`-b&=l{Be^(xGNEWwS63V~^(|N04QNYt?tB(Lxm=NK zg->dzcZ%md@~cCnB*W~``Sb0*uiMc!k*q?~Wvp%d1QB+z3=Jqdq^rfMIF z+$VXL-vJjq7NzqJ6E8L$S7W))lu$w4#r93Lnu;J-%aWMx#bofvOPgTQamvLiZ%WMt z7sukO7(OTb>7Rbf%-H3E#5U(xQ;RqOU6ULxy>?wH`$B5cL>Q2S&!dqlzs8dk7 zCBRSVpISHlnsU=Vn1DJL-#wy5Ka6LQR;cV)vb&+bid8|bW09~(^fI7e%zcBv#@W2B zbB>LfW)2GltDNYdi1*p9KlT~b$!cUtM-&r~zM79-rpDx^)F)d0HC^v6)_0vJo^sT} z;$fN^KoDTprO#_S`@@SqCtBV;{8G>0v_Vu=Tv^!ljoZFh-Lp_y(k?vK*Y0Fa!)(P8 zv-x*mW{G~vbEAsF$^Aoc6ezHE6(zzWBaAI$H9gq1jW{Mpg5`ixaDpaTMFX zh3Rr%^rrV<>jFV(v#GJDVH6vS^Cx=a1Sz34AboLbzdOeO6p~(eIKib$DC4T_`Q{)8 zz8&#mqLa@|uDgo{e<1S_4Z>AP90H@+TPUi7%P#J>q1*wO@a(-8onG`iY}1`SS(Rd} z9n7yggojw;#<9l_tzN=qX#F3)AEShL#u5|M~QpYBK*d!B+4a{O#?ObW+wB?#_-b0IP+ zNm#}B3CvGp|G-X2o?wcWJEBO@Yod!O9126Y#o8pYQYj46QReNKR2adrRW|bI_M}5* z4cEnojTUi#@OVkb#$%RDl`c>*q(Bvd)%HQgl{JBh?!x6X{)|k4^2Hy^-tzpe$6=nk zegdXCic15SH(g_PZekNrjw5Qz6C$PEe^i-Tyz5mC4i}}=M?A22N51x0Idiw;F~OM1 zH^s!(Z&7>i`l?BtW3cv~&tnQdJGgdZQgM?(0#p-t^=P$57xvU^L z)GCB5JCxE-jM_V2i})z8S|P(}4yfdX1xaHveZo-+Mr&|q1XA&w(R)wPpX2hg6wht3 zebI<7o#*(X6<>qdoZ6nowos&YU`F#8w6g97-hO;tqe8$~e|*Fg@A+74F>F z{xvV$LoD$%hvtV)#xH!_#kCe==TCLpj(YLT*-8i0Iclq3;Fh|+Jw4CUJsfXjJ6wo= znw*tviRYN`TKK3iBYGV>_2^2V%Dk!dZr_ zDaz4a*aO&oG@laZqGa~mf!U}KYz--aLhWhn5$kY9?^u3Y$^7QU!A!hEUo7eqaYVTj zIID}|T=JbAbocN6p`qksS+Ym?)MDgY+ap%KcW+h&>i-<->=chm)~*};fEZqhDt1{W zq5Q93$ks8G=yk^uyG6cg3Wiyrc0hr0$m! zY!ScvM0=~gs+`7p0Xf*Ql1e3@KuL%RKQYK~^Ho{wV#B1sN1Zd z<&>DW4_^yCR%9N%;jD(bDEH}F>~_a%Ps6I{x9Z2us;v~XHYS-wJb{aLtHv-ecLJbj zV_Y=3eM>f4e=;^I|U)^ z;~bI^VC8ym?!oW3R~*V@?ds;Qj2i`Ku z(OA-lr33GoaOHR3{G#ye4|V8%O7J0i;oGtb#ki~|0$x_ebZXYi`&SX91zS9sx}0b` zoObJT$_j|f=fHJEqK~j5)ltfLc|bpmX0>d9)W;NUw4pnyvtz>x`1k2Cy(1YAYx_6n zrO}31Ly=yRa|N?)*LMU0G-iG^B`of8RgSs7K&xEJ&Nv9#ABXrMH=aVw1M9^QbKRx4 z%6MM!og&FtF#6O-RYFJ3qt|AT%7CUv2O8xS$nN zM=l9zF_W+>wzOpz<9>pu_t0AXqajf-UyRE4Bl?y@g6uGoVJgmEEgRI*EsZm=S5M;@ zBN*q)2X7>$Iv}`)D0v?@5y^>pc>5p*S!llt6i2P|V3Ee}?JBi@8YWFm5${vRdqrR& z;zCS9LQ5JQtCurn?!IB^8l@Hfl$`F<3j1Ww3bJKm9$^5J%}BI*6+ZGfAIP>=YD+$^ z0;v1W5Sm}W(2_(aD_zI_y=kG}j6Wlv^G(0wO=7)4_L0&TwS%>DtUaSUSr!`}8dblC z$F4aC!J4Y zB-Bb6h-;!&PuR+1y;fp_Z3d`Jzjp& zFibuHBW7F+rfAzZbH%1+a~{*OITXjz%TaP67?0|=E?q)Z2Fu#;he)H@Wh@}XKn*aZ z?Zvezz^U$_-HRg?J2hfD5rzH7i~!&Ej|nv-1wt19&b%{AI%z?s^9^{&91LL;&RI}xme!&y`Gd= ztQe5C<-W{pq-!eb{e0~3*Wo4`LkXjoN5U_}$N4FAleY)*c5t1O#V@3!o|RCjf&nhm zXY;*KRo*!>^d-U5Up+@ebdf7S`jY0#88qckPQkq>RciCWT!?dewMnQwGmF|Ac^|>Z zl))7h^cM!h`4<@MP5$-bU?fY3B+S|D-E`V{doT~2!-bX7t(r~j@THm4gJfSQIxKFE zo9-`#L=x!CQ*19J!sC5h?x8;pM5lyJ(Um6mxxRBK4n&QU4yQGkBOC9#1g!%Jot~z< z%vgJa_^{!QZ~#)Ct;l|}b>p(Kox)>jkZ6u?EFjg$LOY=3YNbMMf5S_)?xOZv1i@PrP*P`T(P+s7u4g@zD3#VYv9ja?2 z`rT()?dr6ycvK*Uk?LQ(qNubc9q>lKWFdYS3n6O=Qpict;}{1_+lgpgzqk*51`1#k zf7vpD1t}FNw$t`LYtzMj7`1sly|IyAKs%tN^u!VqISl@e$$a?tV=|{qxI-t; ztaZl=yhQ1>8pIPGYin-~xl2waZGg&I3(m7}D3%9Q&hXY`Llp7I|@_&Xw%NIhds zi$78Fh;@=8!dIbFM5LZzm}!Y0n~^jW?-4SZ9J7q9MXsWZ+?C~k6OpX$#X-s^YHu6*T`M! z26ei|1ypS^t=~?$^--h|IsUboR3q{bd`to`aN|7ngq}3?IOf{mtJ>l=x5(PZp1ZMc zpJxr&v0T848!J|AyTwbmWOp(U?_W(`W*5F-WFKr%6`=A!PSW~rrZ%T@Nz zG!Zi?Adp`v^PD>U(I(6l#SRHLO4mI+iMd@=+aRBl{(XvQ^lLSX=hup2>RI~H#6xcI zb8-hD&5lSp`xbiqm0_SD#ruDgVel1Og-AQ|{4pYYX+#1f0!TSyXqV@YycheD6k3TO zXqW%rE5R+q31tGnp$ZB&SKT2}GADvQ-HQt)20e=Z$u5(HE_&Jy3j!h>i0-hMwIZRE z&mQ)#^mqa_IW#L(fX+cN&;rg@3G`GeLC}lg2T``^sC9_4#UKSosiGNM?sF(hlZBF5 zWeh(gy{`wjQ?`vSMRV_9Uv7Vi^kMq9JhP6a)-*A&LIlir4`Uw&Y5rfJ9{yJy_g^Dh zAbufI`oDcx=)Sugw2@2WfiHle1zLPC-gON1d}bfu?{7xQM+s@ze}u6@Xz6Q@pCdb3 z*iUGFb~FLu%l~uj5}ragIQ*9z$NwMK%!=CyNkaZ>p%bV-h%*Ab<2(xsd|@v=g-CQc z>~l!aEbu+*Q9L>aP0dmB82fb+h@-C(`|Dnun3VuQGX;zHZ=QJ)HF=%l`v`C|Uv5J; zxK0A;bi)3}HIs!}LILt$AHGlcogR9O0Rzw%xc-ZOo^=2z_(7^)=zJAREz6iUhJO`R zJH<~JeEvw1|0T2qARzC5&j9*b4lZ^^mw?01M&Bt$qMVAL=ab-%4RNGkrn^?eX%b;? zZ@-VB6@QO02#T9eq5m#!OzaE{-a^FJ@ebhcXvds%m%!@0j%@vw#Nz~9Du4^0Xir~X z5_O`KVp-Pc-$$>l_^*1Be;$2lb#89^%jjq)!2NBvIJOoR77`XQv5~@3S~uo&rZPGm zR(i!1zqh~8IZ?_X#^4PC2K*VT$#v-5c_z+||or_rCrE0~Wk5H>0W(VhjT(vud!ocek#6@i;{xtwXwcvUOa1|>5w z>(mv`R+*;*eZ|`Bg-Gmm2Naxl+KJg30DNg|Lc;ouu8M#JFZGy*7(C^Hb!XJHJxwGO zM;)Z^-E$QFH{u!O%?JG=onQcRF{)Shylg0y=svMV(7wYopG+T7qjj%+lsP$ny@9x; zt)}$)8=sQCHmag!A3nbRIL|?ixu%+>)7A&-%2S+D92C?r+H^&pk%`G>CTnfAaxD@$xz9ZjR;R7I zkJ!>wL&BakR{pU6If{hr5a6 z05*eTllV#*ph)cs_5ZJXg&&$Oqz9<~050##O;F#0SF;o5p95_oXSgFwq)63b(lcvL zIQ0C8bv}suXApn4lnM_nyyavK=ovOqp+(F_2f85I;(b2XD-{Xm)Dtt9QrI6uAByB+ zd;+~Eim>Q94+fLDaG7whCBdQ!Qu#d=Wx%|PQt`_AG<`<^Vok`n*jCDJ-fbmpk*}pz6+_>E~t`- zkAp71K3GJ%;L*QcibP5T)+&gE5p;`bBA_C``@lOF^S8}5WxDh3jq5uYPGN0KR)@GU zm;xs9xybi|X(3&>?-%baUP7JnNmNT>AF78wU#*Nyde2kK;P@JT{&gyz z3noPGV3_iP1@xO_Q;PgHxql3=F!4_$;xjFd%8?HXoc$eB!AgRLt-0bjTpvku?cg6F zb_LQZ5?&yQ^Lq>a(!h9(oL$7C09xNxD@)R9qn`%>d79++ifqoQQsL*)4sRXX=M^;n z{eOSX3OrdpdOQ1m_tv2XB0Fk*Yo1R7k&ruUtevv;C!krdXC)JNl%jpV#y251heEq} z{pNi*?{8^?_Zw1Sh)P&t|7Q^}Xz@+U_Vef;SOtXj_0@vINZ4U`Ec)ikW!AK)ov#)O zOcTZb81@xwzy7{HOQw+MM5Nh|vKVWNs202D1tQP!8YIQxDIQf;~ z&)-^rDZ5PdKV6Q0?Y6Bn!sb(2ADE2BD+GQvMX|qn0gP$C>T%ks zC8E+7ki$>J|8RqT3r5IVt?KP z{*3qmExu9*<_egqiPAk1szdHqc~+*kO1d4yyAyQQM1-8QJYW2OA`h9}dBUK#Dg5_O-YappXx?t&x z&X!}$@UQwybU7%zy}kFaXa;0ob~f(M7B6;-(CGxI#0u;)W10s7=}m>(XVCxn?-wpd zfy~~Bgivm#1~ikpL{!u0Nc`4dxJzaB;BOIv{|7%3MD12j;f0fMr$#DiVS7gLV#j<7 zk@Qz1=%V9$&57qczfUj^sPTyOKkK@KA#M&iwz??!BNeV%D14t0!`QIU64)puEz@Q? zm8XYpzS@rKthDFY#uUn6PDEa83Z&rrsDSYZ`8*;GN4T^3*S|C-2oeTXW05S?e&%Oh zibU>s++I`hrm=|qI0C{ZQ;!GVP`|0v5_SUJ4lV5g)-Q+xY;;LxQSE=vNDfdw#`p`ks0o4<04Sho>VKJ}AzBC$uiD%4*rf9M z%}oq>!HyT^IOIIPWtlWW3G5rixJ_Q!Ke9RGiVWL(%fB04k#AI=)+2P0-I;PMVK0`^ z*vMA(k_Y$69ls8jas!m2;~on5?^poo8nOJ(2D(5#RrCS#f^0wM#xb;21ncA^*~TVIKq>CM0sQz^o!=u9hGS-^Kl&)0MQn*_lPU zYCHRj5sgp!H;z_uix4UJ?HI&Q3XDQ@S4MUvu*#nw8df) zGZDU2zNH|tn+&zs+dn&-C<``gG+`b2FM$M-=|hFt+<=)+pBLvJLmD%=Cb>gy-lbeT2#x<0 zB+yN7e(_#=9DKYy0<;d|K*oOkbIQb!&&V#e`rx*ap=U9se}K88*A2VU@WT4@k$oAk zJMQ7(8kGNtlC2zqPll#Xff2q>N4wwG@!F8fT@2|;HE~-$+i`yQHi{d7GmUiF8+ZI? zQ%$MwKvQ2o%_+XqplErt_dXWqdv2;+C1KkJp|rtPghrWv^eUo+{QBo>Ma|=Sl~u5} zm{DN4?T^_jH2zW}eyBTzcPN%YXP5rE#dxR@49NKc$|K~o(g5>hQXEBKMg<45I#Xre zKfaQAPoVlWZ6ugU3m!$m)k%VLYoq)x@c_49nD^@9SYiQZqA0n8wYsFpyY!wv;v2*U zJ`L{>|3~?V1(5Xmz3<6WwFC|>?O@LHFOp^^WwpM}()zPeC2$v*ZB{w&pYLxcx^s`? zftUD8=VFrUSIbXuc`Gvq6U1#ZK;#kWSq~-lL;`^5?Q*X*B&5J(Nu-Yw`#%Cj{1~Ek z1Gk^du@aFEQc;k@N?=%!ptX!gkdxrY_*oe(Ca9^tkWcg+`DnPj^r4dMA|$Q z$3(*RI=gL76`zReGm=1)Tp3nf`1?&X=>MMjbII9~kp(smWkO4nL&d4Zh#$k17sk%R%_8n<} z+C5fZZxa$Yuhnw~hN`0@2X;ORB-XpeLuBxnL!ROvQx1Sn^vncM9;m$cZmF06=BV2) z%b!f>F$Jx+=tH@1DT@y{PJ`dS*(#8C7YwLw=_{|OLr9>?N=k5u5hEib|Koh-VDG2U z_#~-V+LFG$J`DjR1@W)vK$lrlQ$GFU%J{@%3_V)8NfWb4V$K$Y1n^ZymBy+KG7a*) z?`Mm}1z$A*D8WqdGsz+Qf(Re&THf7@O-Zo=p^PJ~-(pr+@WcZUyt5gY|4FgHRb3Io zv?~$f43~X}BxR_vum@8tseE||%m)$KWyc=)zd_v#c4^8mL3s&@V1OSp4!W>e>`3AM z1kGw+!mkwy6$>Q6ApBaR{Bt34rkwMwqs)IKO*qBddCu+S0xz~B60cJ6_x@#DuimJK zcuFE@NW{XJQq+@kqeWj_3}8vyBO{8MjqWwaYr}1T&1X{;ODPQ5ie<7Q;AsA_0R1_PC*TkZt45wKo1QO0R4S721B6jag}XOk`%@OE!Ifl z^{7pX1Hg#3CB8s~EFHk(ed?!wd}E(tB)zx5pelE1ekGUp^Dpj5s85^0eJB;jIBbyk z6Zc1ON=ZmCmZ#J&N=h6bcN3dX?eY$(U9PtbIzs>~IbSZ7ccRh5P1om2SvVBvR{08xqfWLB2_3?BVorA5)h(l%boJYusEW7QtfGQO$*5;&nWzrh=)pr; zIsGpg;g7`R-?KGn8!)R4dD&^tKcT|(1VMSh0OHyIQ!Q8kK1=DWP!s0i9DL2y)K~iA z)%IdW?UX1_`g6pF!7-|1)t#$`=M0DnZ!WJKW{jh>X592NHM4(B3tT11smO^&A{Yz- zK9GC>?pnd*3n_|Ypr*EE@;g&N2?tlk9tU;YUoY;B!~xNnO#q4~IDbPST|x=W^vUZq z9N|C&d+rhX51t_cYIhr6nk9tYmQLp8sfP0Fgv8)2ji<&%8H;TXw>S|+;HI>^`btOI zY-Ioky~FYi!WTv`YbPEgK*AMU)Y*4aNAeHUFpzgij+XlCo+9o>Dqbh`pLStAQjgRR z>D{?l*1?KPQOy9>x6xTNEVQ05_o>0qL5%Xr977h{O)u%CheFNx*tpMZJO&2=dkK2R z)-$%7Py@otd2{v>d9$)(JIgLMtAg7LPWqv8MR%B~G@1sWHNo;dI6O2W!d{7xKtsWb zE`>W5zyFcr-m&IiIgG0 z7v;0$^>%6HaP5@S(Gw!Amn2z}Sny>P>-l^Pj2CRjR5XW=Ds~9KS~6+Rqhek1yqbvgdofr}9M45y|7G4wa=*SK z?3ql}4@4DWZkyv2SLiQeMS4~Atjb5GSF@)A=E~66i=r9P-{$68Y$c^iZ7+w%PQ9ae zq@o^9#iHk{#eKU+k3vs$|5Y^;lPO5RiE5F|b|KLhjB$W_KJ10!gTLGq9~DUiCjFjS z0wHO=s6y@LFY3Euv6Ty1pMXHfAf#55 z7-}J`PKiqyZkzxNOg)P7A zcs=%KA>l)Ief*Mu9wdWMgae7$y`Dm6NRBWeLqi;dY-z?*3fh$YafGz(}_+ta!pW`oBI z<>0?P114hcVj+|dGU-WK28?(Z`HEFlBCszZ=8n*yUWcEPk`~?D0RVy~W}H=}y1oZR zDtCMIlFe*HEjn6dCf+%2l9Dgq^r)uqz0!<{ye7Bls#5@=M)mq;0)^ACke8Z{Z0_=E zCfE1k*dPH_ZO0fMFqb<4sFo;~q!XAsu5ZCy(~fn$Di=W>WHS6m~XlN{G>F7Fm zo0{HC<`*N;(B)M&h0ttQgrjcf;ZxvnZIyBEn-uw2S?yX)Ys}2Dn7qX<^ckw+D=N3& zy_{2tQPort4JjC98m-)%`J&F`3m>*1WHt;+aTt+s0;g2l2rmvgO{kkpfgzbUfNG#h zz!#Czf|%9|$>j|aO%p9|lGE7~hr`XRfpQ;1ZnJp$pu5P}a-*+AXP zyz9!e{1dLXw9dRW?C!n9erXv1U&Q3`Z*}@9sP)$jK>|VVi147LL=h3oaudVASI$s$yt=vN&H4+Ia!sYf;Vf z5dgAwJDn>QMqmUV*#f{(&J%!L=nD(=&qGPHkSiE?ynGcy^;ft9y9cqu4S|et(2Rs` zvt;V#hCRlaU!nVuSo8%7i?A>@kO>5D?WV;z8lqYlyg&Mw$#k#Dvoya?X~v-8F}G!$ z6I;$3!pr4w=1ZF%yWU>e3hk=Cs^f|7Qs*X`N>xgR7k(*?4W-+KWv*4Qo%^c}rFX=$#wcZ_H4(L^JoWp#!@^j; z^$Ob~^mC%AQ=?qvGG!TssaCyr^TWHa7!2e=gpp#`Lrp*MP;d}*EmusmlZy_4sUI_F z3NJu5{(f-V`G^~v+zw@`hT0oB8brIbHPS~bZ-tNf9g9qs;4_v zwUt(uOoHZXkeD!g|I00BtX4&~IdnKC$3T8&R;h0L{ilfsf+8qx!Gh_eH%$WKi z(4!$isu|JNV%#Z{yI%^x?qv6U{m8AxEC)H}S%E^Dd@lg^q!qY~7DYng z!a`(^UQkuj1(PD$3gN}RoPCBv^Hy~Tz*T+10*=ll}X$;sKN-XQ%L;?5wK@X89SQP<_i+-YPkxVv1%Q`HQv znEc#a<1jqzAJ4#mqd`NR(R7xWa~a*m(qxbF_|EkC5o2LMIH=k0QdP}Q!}rJXKl|g8 zN#fl*=>PipHb}Zo*j;{979WxJjUY1m6^u%3kfvw{Yu+&YQ*{^zF2CFdSxR|^hJ9pf zyYG-PO1YA1Oy6R}i~TBPVDgqvt{1+y?^YT$7A(;9>fDwOb$VzRhKACZzeXhTJf@w= zG^s?NDM{I$=3DU8Ebie=E^RfwRyV%OZvDFML6^O1KYKL5c>?&+J+%(&29(J*f?XR6 zF2B$L*7M*Nn2td^KYx$^LThLZOmj@fMCD5u$S;ZMfJZ{E@c*12Q%5Mw2?u99|ItF= z0ymSXjRrt_)FeW36o(3@=|Fi=7DE|m zx!tTTB`TpqzxtaAYR z3P`DuBUV1nl7#u>VC*%v5$2{@XqIh0ps$)8TV_HfZb&bm1|v^3VVC7YlD&|3cki*j zWT5OnA()&vc@hsQTlqLnIJnBwXAB|R*Kb15^U^OA11s0rEH5F1vwRDsFFpoOWSRyG zWMyT=e)?n$G6N(@Ac`<=*)ZmYw3+d*T*oOj0TyNjO7m4_EcbPB$_d z8^|k2#57#LEs;6Pous*`+&~_m-|AB$oMjk%F#R><(NY19FAjZPIk`@mu=Iwf|7Ys%}~v*N10 z&Y?T5uQ3BvRYu|Mc%>S{OvlZX+2PA1o~GGno~o8FJQ>Q+-3;;XWL8a6edj&I8Kof=t=arzeYsZxEHmB|&Pr7XD4Pa=RLoe_(N{q_ru!vCUz#aM6WioLa;>zE#k zPSJ}+`tx+cpRL0}n>(4QHN42``E=tV^Zt{)^UY`g+J-T} zDSz0MhG@5A+amp3r>2vD`UTlIZ;f*lmmD!LHvP1xbw?~^Vc+{JrNVW-A#+HDJ}>a_ zti3)EOPJg1b5E)(?(2DOp(SrB2Ow>_UY^q8@N2#q>nwa(m;`)q{Fa=V)$D297b>+D z>%nxw(w}ATt%I{*uDy9g3ZyCjzv>x}xwj~!ca3Ga+}4^(zWE{kfkLZt;oB%1p%n{X z$E^CIYBC*lN5_imlJb$p^NNxAB$d}OF)>c7w(3m43wW?N?>M$Yv~_fsYntpA&P-ku zs+AGH-a0@iJGB&b%}sf$XTt6N-N|Wg^w4V2xp%WVSpqHOj3va?2QD9Q<@-nPf~fDP z+qPqS399aNU?VS!#t#v_`jsKsoWy?DHM?t(F*h^g6^8)~BCkHRk+3B=(=dr+eJ6u! zrTu@kG6>J-V%Glb8eB)(#HJnVL3lfv4B|U_5`6cd#K_3PnrK`X0aGWNsd@PuyT!tv z4G{Zv74^lmPV-_At9_WT(SrrfYs{Pusd+%K+A&b$Y)!<@_{pk^IcTN}iC9L@oZ;U6 z2w54{8IRsdr%~{!f*rae2@WZP1u!S|@#$UgFv-RIU#5rH0D4keGmCg6Su)(_IOo=$ zmP;J9mLUPEmp?FqD)AiF$qu)^pBtU5MoNO_QLE4G#OYHqmjz?i?#4cKit|#SWzS=x zyRtXXxy*CZL^C97l5$jKQs!1&FEmzpj8`)iuY5V6#_4>|F<a~iRqEVI+>&g5!p?VJi(HAEq zFo(2tEQhikCKqDaIjcO8?WSVYM=YF(US~2>Of)^!!u?3i+DY4<$N+_h&lV(_(kDGN zk)>_`irhGIYn*LIEf<8(7eIO1G8`p~z zNGu;3c>EKT@kar-S?^fl3)_lJ>z6({V*UtQ+5v|=EmYzS1u?xoG3AL0?T}ezEEnE0 zfH@YFYta{ArK@*;YjWVgZsMd#kmVw;xRv+9)8B)`2#n22vvVI7);O)vZ(9`=92RH> zzK;;ZTvk>6KA9>-lT6HF;hB))Ca%iuarBtmQB7CEBxB4NgfSV9F#&6ntKLkR6Hh5ygkLK^N z+NT0ZIziJ4^h{La@wEhpowv3Qr6Ok`mHT?0Zg!N&m*>6T|!3a@W0gC47h0#Gv*1$C<$_0PUH z`BVj!gPyb{xHnaOlD&BoG=-oa8jizo4G1hM$5j9qb8m02)qMTiN{4mDnb(=5^?&sO zfXP|QIBlokwdN)eSjwVt?KR(Rqjv^lamRFHTed$M+ib{JP0lct3hxUx~a*o zbe^O#Rr%@Djmae=H>Y!UNylOd%KC-ar0BC8-v@ZgEr={W+swSfI|A4jGs>#k%9lv_ zsc%>C;aPHR5R^@T_BWf*P{~Fx4?hK(R4qUd>7djTZul8Um4v;c`oD#Xoca#i0@fE5 z&dt<24I7^X0rVQmjYnjNVXwo+;=qmhd=Zfg}HZ1(dsd180%1in_y4rH{~{}_}$>-X==Ok5H2iK26#JKNvkzLX;EM&(23(u0-Xt(pbV{N)|Q#mY(vGB=(z zGFMJD0H$fS;{;ijQ~j&czQUYkhWF-thR;>OVCeSLX`CM|7a30nn>zc%9Y`C&m?S~Gp)nZfsRIMo5bJC^>$;n!RafMB>ku7W?V0F;_=Fq_qO z62CM+KVHL(h=!-9XTI99TZTtEG=%$a5ZFiK(n zx5xIATPXdYZ4LgI{7MEmE4hrbP)~!Q>|eCzfNG4scVM9M#Q;Y}Wr*05x9#dD$(|SMDoRR*aDs6- zvQ`HHslo)DeH@@$9ES)5aj8AgpAr(3t^tNgJD-#`T)f5F0I+D;8w`PMeFL(C;#O{e z0B5y52OdGen=?g*cur?u!#NWGT)wf4$Y?&mz)SQ83EZWUuYZCnA48Dt#*5CE9^0M7 zNc zG*nx4A(BZ1t(D-u1rcVl1ff;=MJnD5$KfO7`F#^-O1Yh%xOGcDP2N=(T&O{LQil<2jw8(n%Zb+U(@iG~c@BkE%#gm=ase@|z zgI>jbqK{`g;^GB%y|fKYo{WvNt$j2bM)7z|V>|>1yMG#71HQ8nWNxT;BLE*lmwLQ- z?_T!otQIBWPmSNH*-1Vfb7{1LgP)Rcm?1c7R!WRQnuY4CcH+f{`WOxX!-Y$qiV?vn z{#Aj<6ewdN>2?MF$GpHGZBKJ-=!m!lC-{(=4JGEJp*{CRzD)8<@SrYcAI?`C)GG3N zc4pSl1y|rLRV29xuA5O~IF6%q_|5dA9E{Mi=e@1+^Y7)1#w!Q#Hzvw${o1n^{_+4D z{X0ioJ|F-quQcuS8w?segk#XC@qG%7jay&1y{W1LJ$*@dwgEbT%NO@)4yf$zU>Lyk zwaeGPBuz{>0?3#;;)(h3gHJOW#YuRBuU2H(=ay*Sbvc7P;F(=${C8adz&TLAcL-`! zsWEncGRlBvhm988FM;)Qs8XnG%q>1?Sj9=^c9<}E?*no?Lq`Ru0Y5Rwq2W33?#H>{iuZEs*W!LO$lC++Wd$npJEBaORbd#n_i|<=?V|=<{)?9TPaS-+YB2JFrL44Dmc-@f ziU#|4_c@t06*supGkO@RZGb8JMh7hZUnN!k#~96t5LHHN4FY(b$lG?zij_hD*=5n_ zyA!pYg7grRQke+xFldPi83-DuMATRIb;J4I{uOby+S*`ND8cNJ@)gPG>QL~Q@0S<=Q(j6AXbg&FE z;KlwO#5S8if&?-^4;{EKyO(=SPIBoFpfE-X9nnvDl9o^I^nY8imCDQp^9r}74S?9K zvI9qR(m2U#g&?%|`>$}m9fOD409B~bA+5Z83~un9u?Y4*T*(5pm(%*U+Ec-r4InL) zW9Yglh6MM1&@ksh2||n>jfW^#gZ9_v`0!k`mIlohb5yBzl6%Z=NZUCEL2i2Bepeqa zK<9A-N$X@0*aQ!}W#s1i^41G5F%hZSR{nHWZP4tXp|@+%W2_|6%O!DmtRaX>5zS9L zHsooZ;{%h#L^2y2B0;8bKzqhN7?S9;jvET^(v9=a!h{dbE^gCfnnR>xf=V_ zgu1%J**A?$H6GPh&nNw*##Hjvd;oNk769l2RCwqo)K$5<%v5__6uyu_CDuO*1oiQ* za9a#$Lg>!Ofq(F)G8jYJ_jw@mT#D&=yACF1R9 zw2%+7mS$!xiL4gVo~Z!m?+`1u6c~i^%F0CT!Rk2=ju1onA77;q?|u4e{-@N1cgM%~ z&8}i&G{)YjREDoNsc(8l>X>AF4zZ}w1C?@N_F6IUHx8$|_2oKXnLKp(*e+jkf2S)J z1Db8BYF9R^+rB5`YwqrJ%r#wTqTsO0JAPIW(aUkuD=vAWjGNopNq2`HweD)&#|TE| zx5Gt2ZGGO}>Mw=ZA;{2q!zzw=uQB|em*?-pDn2-6^lD$fe0Jv1@c!l}vu`%T5VZA; zi>p98toT{Cb4nzKUaLuu%!+EwMi-RA|3mzzS3*}LjL~SW8}G=mR~_EGD!@#ElKZBY zEi4v{M+*4t+IFWkzfcZ?mn>nU(E39$v=d>MVk5>TuYR*<58E&#n9x;maap1DlwH1a z_q7aOjsF-{3s3x{EOd!kd{A*LX3U5|6FDrz&rIcdLGwwI1|R!uJ`N4#<*V`EGF z<`Bfi1NuBPoVm6jq$hdZg3=EHs~dA}NGS?mMh*+GiHNr!cLnu_J{3o#PVm|~sxp+{ zIx?cw4F(6|rV4geS~&w=M{j@Z(-MnpBgkm-#Uqb`(Y?QwSwy&fRxjufm4H@Ku;$gG zyG{Gvvb|Z6^Dy(mUq0wCpV420yan0>Pg`X$o*>pK1k$0_FbBvK3YI} zdH$JD&U5Kx{YU!aAKizT9$aj(4@##je}qeJVeN@P)v>XeFfM3i;-m~eIfcJZ4nx=*(zWjJPS-(=+%I4!*@RcFeJ0c=1aZL-W>LTGf@}OC{3%oG zL%9!M0U_%ih&*JPxoHe?o-1e0%KIH%nvypY5ie*g1yp_v@0=&B?T-`?dNG3Wlad%5 zCU3-FhY2HrQh7dp5QxE_AsQAEp(3LCf|f){eRt=h&{b1Uzz$Vji0jQ_6B2#mi4#sAu zsaH)d&xapVWM8&a4PSh#p?}PrLU^xz;p`+#{!~Gw+_YRIOcL>Yw3mxb3rI0U4z75= z#e?4u254oCO9vQ?{QdngMrc^cRFE8;oD2Xja94M?03ZQY(!$wAzLD3Vmb6}@cQa9k zu(40c$8Wc+(T1OwF-rByG<3g}^UR=@{1Bx(k2(R>Ic@uK+U88S9nU*)YC8ORw{ViX zH8TCN>U)B)FM-f`=Aeb7jm=FafL*qYIt>I4w{XTp6SVWP6^9+lT~M=mzzZk0Dkrt%t0RoKGOQ)A-7PPgVF)u z1S3k1u1+NChMwI^QD6gn$QY?gDGyQb&YLe)q=LxaDv6lPobg(S=qqxF3Y8ebn%GOW zqXn+|ekd~aytWLUt&e6T*C##=hQ>1JS~sS>ARryFzrSDR zGfWr_F9LrIdSw-20C7)UzO>TO(HUE!`@Ht~=rdIobg^`BWyP3gmJl}ynQ#Y4EYx7>Vb;T^EQTf~Nl!fo_7qwgdr)g&s_oU!g>#RdX>ae_N=#`n{nMOo1;J*?F6(ZT9yigu`+=lg8l=zgSxO(o zpb_BnHGs}z;&;g4S8Z0?`A5lp4bre2k?)WdgN#s=E;+$LCb*gMXOtEApy^;m%=yc@ z?;n(s`r%Qu?<&4WDg|H`!UxXJ)V>-6dh@lQHJ@w1@y8NO6>)nWC=ua{8{2EOBgZ|A5JW2QUG+Nc|WzoFE}CQ!0kc!)i|j0md0)WcODv`1zN|m4%Ls zkP>E+EVNSc2*(C3=85U)kc|!VZsIva0m>ov0~2CoLsoK?orW~uV=f;3M&1^0vJ~L;|)V z4ww25AQo^J>AenE$MB4^`CC2Y_5*M_Xz6H)Y*re2EnnF%@JM_@LQojj-|Faml3*-g zW&v9D8GjuKK4U-uL%}aE{BrlyODp*8bAsZ+MpSg7!aHUZ(>|^5$t|Pe-i;cEbtbrB zlQ8*|2+<6S1IL2EO~&d04)_wikID_hqQtRAunhlvBLnFrO-03#vV7X<3yJM8bco6k z%pR#gv+BXr)D$rKOu=821Aq{*u#gdf$thSC^c}VD?30Hp3>M8{ZwkM$$5^e|I0e4C z)UZ>;wCReryjqW!z>7;--0XGGg2KfyZ9x82t1MW-mUbGVFp`g2oWPa!_~c|zZZ1t( zhr5YMwghbfDdZ6xUKrZ{fK0Q$(VrW;?6Z*uxWE>(G^BOAurGycyXBO?tOHNODZ%bc{v^MLkTFL3+>_&|`D zq=?m+P3K2klP_lpqQm5&>OaCiv7xX(;hHCpo1fik4!DqIajuE@nCv|=i;ZnWnXoik zvmRVL3iGeAoUO*-yZZUC|Nb_hJPlf0T=djD0{O;Y6Pj;WN$LPLH@~(v5r=-}+FO8J z)t5?JHRnWlvmfrI2QJGrq{TQ%UR%RkBCrY7AcOTWApw6SZ~o#aQb04l+`*-|ayqQs zkoya^zwvwexh1v}hgMVWkr)EvtN?n(3T9zq$VVWM`|#F%5^8gbrU&0gibuajPq4^}MsP~7DD1ofTl)H3{U z04nn@z`yzqkROZSYWso0zRh!-Xkmb2&Gq5sf%p}GKNbT+2b?P)BiklHnc@c^KJUrB z+!toRKLU-{r$H1G*8rCGM`7Jg>(}g0As}Z-VN-usDasI*G3kAv@i5lX;q&Ovmgq&O z^i$kK(}1GyHS#)}qUM;49>5|m`>)i`x0x*W#JGUo7zG_2>((*+{?4wd+1Xi7F?Cw8 z9tlMB-LQ^dc4;?W4?kP)%oUrg=pV@yij1sD)oV7#n)YTTb_)Y^{Apz|JJ zW}Du7IyX|SJHy^ zGPK3W;tQ3BDoV8q-L4tDpT5oiv~cNF`J+DljiJdx*(`XaNkE_3=j8=*-5j8w zv2P?Dj_xcRt)>`sibW=?UhT-4A%Tz4qwS*xd^KqY>f8RnyFkBOZ0M;FDmtUkP!QJrNpu_rpMXx~h9~#G>W;CQJwP`y>);qj>!l3T3kSAR-wU@DNzc*ZKJXZd&{!-1$ zK@n?vGLPkM6Q4Q6iLM{ztsg84jm(jwBnxd3*G<;_bn2My*OauB-aUx@n62#Onp7m?J~dw&rY#RZi+H!p1@)E;4=% zp2rnkS2AbzjJGI1{?_$O-CN*Rq|L52v z=4_BfnD_zufIBXZH~WQR7!_hrVLf8Fc_jQ}9wWe;+5PIeAGcVb zEYr5Sy#K?yd#d`n3prjZBBbXFeN@oJdXaf?`IozmI~^@^YbMxPKl=~Ae5QI{-mOSq zx5bQ=)%H{rSph<1(|o5Pa}coh+5*q`C#Z^a07mJTXp_9)7?tL&yX2NanybNBtfExd~^;XXT>)_by) z2NY_d2_(Q>F4nW%Nd5Dj8i4se>tOKIZ{GlhjV}!iq&M@MF2;-AlP`MU1&c6KVY-P} z0qtK4_XYtCy!zIMiIj<^p)(#p_CzOOyduT(aPe>^vQJpc{)bv}jR^+xD@^IaM*+us z&em1;cZ)3B7kKlVpGy(^@Vo!yse$K*S^E17sW1AogUc4ec2@6c6^bymnWk(O)(t$~ zPg=M_9OOBD%zJxv`03??1@}Yr4*+HSkehd(C|4~i7>@Z)OPygjU99i>HLe#a-qN*h zyOJRZBMVhVLQE9*B6+)(Vd;#sBxT4~*yorqpH?Skqc$I*~b|5D|f z^|dvGsC@fSO?v#$IQS{}EWCR;Aj{%$j>2|(h%z~9FTeLom&~LnD&W!FsKN<)?x#iw z(eeW6sdrg~^Q4h@A3fUnWvZi~F333v)bxca*j>-PsE>=6`tT4J_*5QbzGqyX6O0!F z-v{Gtyg#C$+;>cQ1w@(y1l$2aGDR4`2BScHq6NaeRQ#XoJQtJEOm$=uib#WU*(5#I za_i!del8)V8AnJ+$i3fgl2kG}iMFMY82s)%xnU+b-q%;-lV+s;I_g@1%8n^HR*vbf zy{XU!dT#A6oH(3T-$fkVPhFe0X+w9}uK3PqHO*o_;E#%%xRja<+e78*1$-11u|e9P zn{&l%SH2@rnvu^h1|ecGSgH#TgT=|x@R@Abef)MKJ=7kp9P?R?*`pW^?hh5O1${i4 z#UG2}&=onn-ZsWfo<*`m_$quaI@z!-T5w02t+?H``lXucTuQxbaZD1n^lN*oNh5<+ zd70#FM>@;vX=UHlFTkr73~zqj5q;N6V>Nrmp`jjz2wbLhkd8ng9}Y}wn4 zpZ-)ksvbT%_v%x8p(;g(BG-t;>2`%(nYkl;{h4;+^3?0*@F^L81F8{~ml~C8yk1Hw znNUoNA?&HJjTv*4{2*xa&dF^(aO+Mh*8462I!pot_?b=dhK?|S54}bVqrz|J+|0UF z_r2ts+p=#=8^#Zww9-Nxn94xn`;>71BAJzy$mO_>>+0B7QmMir;WkMnKA_DB&%c4v z=yhN#i*%pdJ<1}PZF+Z|iTCWW6TbkhshYy5Pp$;|%>d_^5_qnGCMte?bW1ZjeDVG%DHs~E# zX@Q{LhW9dqZhDWyA3m#LW2E@lUwJZ|zy#6}1u=dm6Z~E+gF+~LYm=>$PsUJQURrsa z))op#nx~`Jh4;2g@O6FL=f>4@Fvi@_NO3V!p!;R05-ouH@B?i{mZkD6KLx(MNd!K$l17=jRQ%1%-ud!S)GP_C3+m#tFDh?Q+Q+7!37$ttv8U zEQ_Oa-=4Uk0X7AbCgjWnhM-|wvB$R1o1<*LdmGFU4Y`-Xi0I_L9G0PWTgDQ2&btIO z3=f^3US7_msMSq{G1WLpcU6&@A+V25?zE^{%&EOvZtX)3uHN>G{%p<7xRF!X@4K9& zm18yKO07w31k1Yrjp9(Bi2+B-$cW+u5c%r->J54S$CA;_E!4X3vRy5clRuIb>|Xa0 zovxg#GrN}|kHqS6@|fmn(WW z0lWQ!DPAc=keVT3t(bXoc$l1ovv=oiRF&8P+Xx7rok||S12P!6qA^A=%mct>@&g$v ziCE!SV>A8g`F^XjZ*Q7#9l99s)~lYVglwa{YC&G}ievrZBbU2ptBy(ox&dF=a!qq5 zQ@wG*!!JK=r`_V@#oEm`Z?96`HXh;TWOy`#`z3LKs8NXCiB=-8-&)8%5H&A%ro{9W z;k@>EP)+Z~@S@GH@0Z~%$9y#CFZqiI&izxRD&u!sF6`c1Cvw-RedM1g#eX(rM5?`V z{Tc6ozVB`eQ7gQKqYQPFpOdnhd^`2_ic-h(+^EdaIWxv3T0m=hd>wj{9H|%UcOJQx zaBXZj{$o+F|XL~OD?3r(VNz0*4-KD<~ zJvpVdL^q~5KB#^fVg7jHJZpQ__Vh+icH6FopSq`Yjgy|F%uxQfc3Hg*%=NgYFL&pD zh~;^$vNvD(@`-~A?YGXRREXI1vn3+e&)p&{ixj4wm6P9-1+WF&Bbrml18J`5uzuaW zZ%t*h7)-ec;yj|+)>>A8E9tm4ouC*7uDfpHrMJPYK#P8`!Ixz3SBAcKbWTC6&TQ$K(h<|jb z?tj*%fF)f%lrB@?@^gl(zB2QPBN2U+X)Q4i#tW$tn;!ZM+qDN75h;nLPIl&|&gr!s zKDPy?-finG6!$+6F}oU6H>^5v$&B62cn9cIx;^uL;vRvKk3_~BkW2^Jy@V_l=}&H; z>Wi1qR^VIHHUfxgrphePo)elfw{)|{Jz`{lX32viiV~Pr^c;4@#d)*$W4w3tYU4vA za}dK9aTTq)axvBwcf<- zFyPj9(F0gT$=NppEFL(?gA&{==Z3@6Q^BS0^#Zv=LQm`TIB|dTY~-naasFjzVQuSW zI$S3tHrrQ3KXX_e$kx66B{K$B*sNY^&g;sYt=ztQTXE|!dGnmPU%oRM$L?^H>7};X zw4*D|w1WVtCH>-hbIf-gzxyVcV>XuI8SkKzlbEqf$1{PqmquB@c3EC}?-5TJ<-r@* z-rE88njoF?ge_Ch={tM06#mw{R_7Oql5+~Cg4h+VHx;ygcE6@IDZQ7Y9oCtMBqNa%d?)C+Y{rS3b z{${W_A;Um02F)8F-XYgdB`X0Qv4)@QF47}be9H6O42ct4V#P?Kb6>3eCJ#>m(jRYuZKQa zrAS`CTk55iv;iuH5tSY^L@ZO;6ZZQI;z<^Xp+zgi^9U!5YbcfpZPE}aXh?cTiSeb2TJ)w z&H3zpvEO!i`tj^Y7hNdxjhm}$U6YsRj15ytswbzJrId|0m2t|bBnEX@TpT_UPGgKG zB$3e@;J}zw-tlU?q&{;F5{W`ql6v<0%Muh|fmA;|RDc(@LvnOjVOqC~PQvn)`o{;3=PcL`R_K(p0UyMa~oMcbUEw{r#+406_9QacL7$T&f z%%lvlHIjGK$0Wvn_j)Ht>bH9AR#Sg#ih8S8APK7T3bWijn;p51wxqE2cct?KCz-_z zs~kx)GqaH;{fS=xR{?Go-M$~eYIZg!MBH__n(f<|t9UT&m;EL`IglW8C@%IiCu+iC zKNJ4bY$TBQ51g;G#hi|D{zymLeDvw*04PW0cyv|4C3U>lye}|2APA6>TSZk>!M1f` zF6@`79p-8Q0b)QxCZY76uMeIa4Fhh{+i&>-NH<9i%-5Cwn6J36&|mUV#{QSxqVJbT_96_ z8e{;Uh7o+XG*(iH(orZRrUJWqtDA-SXaJ&FX*jRdqM|oftX{dZOhWk&>%-LhfKh;$ z{~Cdh0STOC{bNUl51{rZbGmjcaxRtP9zliG&tcuxH(M6;@!1jF>!LC6khcd7+1dfC zd{app+Ji}$s&u=&?R-Y?8!X}Bb*n>_8?oT*x#eAFu)QN^uF*`7n zp-86T4C!y^pme>HJPl9_jyBT4u)1Y^g$}>Z2Z1}U3_pzRaS>TviD+D9cG~LXFdIM2 z>{6&~D(tf7za4weIA}Ee1~1m&!H3L{hcWU!GM6dFZ4UMLv+>jT1c%`O@4(MetZOyg z?xc*)(l+{W`JLi9y7CjH_K{QN@2xMcqup_8agVa4>>si~NFP98VJjz23z0L8UKyCV zN!1UfFMbA?C~l}|4wu1S83;ofF>)e9%)V|5+3*4Sx|PIO`jwww^R(DdlxNh5-2^gY zr!*6Q;x~5w%23mefzp*Ixof~db-1X}(p)zUr#dV`(?h2g<9$djT2FzP6fjfrMVXl6 z!@(KQJ2;-?pR#f#Q$T1O8pu$-K3Ue~Qa{O-i|J{sR=jFNqu$22+ea&5>_WT^m=Liu z>ra&BoEtoPKQsFrK4eLj$O~NAdlKU>un-lDJG_>w2M<5V87!>JQyh=0djWR811G`C zub*E|9i$~MmKwx|m^rlLYfxEHOT>Aj>Kfve3Pk^_WT z6xW|Z&c!f1FB);0_1(u1xZ(od`h&jQCAIC>LroL}hI)&zeg&qP<|dNoZfRAJm0hUE z2lE~1M4L73e(G~{yf!1*BZa=)#DUzQ5yQyBk({0|y9FAq{dn`y=dw1|hO7`$ieces z%s1`5fOv_`%CkjIB{gK9BZ&lrk+xl`-nm{xlH~f1I7QD;Z;u7%*Y5WbD%G`D9A>=E zV>_nw(?JL$-N?1C>{uWDT+svClm6&OxhKI&e3?= z3+$++M~K8Tck2yM9vqPWvffuk4|oWnhrs19?wzRtTq?L}j)t!eRmetw9+!8jXY(kx z5w%yo{+vDvKp1;z##E2M)ub^l_hUU2&}GcZONQtOLB6%n8s2=xcVcrwvmlZgF(j#S9<7@$c62d*sf^LTEmGN9iL*`Fq&Bw0 z74RZG5wm$d;xieBKF#9XyzENP4}^2iRqR=A%e@I6?!MduJRl4Sp61;uYMKtM&73c` zb$!hGE5ad)n2TdF0*1D5Q96KCTJB~xWJxg7EXv$pX>w#Oa>VOUK|q&EAL_qCxluqL z3e*o`h55DOeYw`VLbZBm%K#ZuyEr)0}Gg9&LmTKMkXn9pB!52libSqn}c^($q~vOVi8P!lOA+ zI_ANXeud63brx;C$+ueqOh+$v&er;~E1d(PQ{SHdkiRRc#Zw%Zo&sG+ZC0D!;9i-1 zg5^nB^&=?b6ISoQ1Aq1hGQ?>K{PkW75?b;qH6}`5@pyZfa39!!L1>rUlY5yYnI!od zH!WRUlZUym`4u@63bzc{XbYQOkUs{|Gs?&bGf-ujb#?rt^fR>&%H|g%_O2bQ45-J1 z_282s*pxcUbH%Eampx z+0T5Y;(qkuuR?*gMsGRvfZDu!C7zTDh!=@D=5mo;u|5M7&Le)A6~&*a9n&cB z6|&JNlk5eQ9=wa0|88YG>5?H!r3_FwTaA!u&)Fr{f`L_TiTknHXYLNX;)atk@e=}O z7RnfN3nPU(J$bXMi<|dqpDR^hxC>VP`toY!hpNP`Nhd)(h?p?Rbg1h9wI;U(zvLNK zcpsYj1CJC6B%2*>GNy^RGvlmOMV$VdcM1YUuX+f>pVfWBnaYF388CUA?vE=wmX^8) zD-Qazh$=ha91Nf)`BHO0;5gsfA3lbV>O z6gm9@^U*g%pHYCPMF{p#Y$EGyq^EU^2D)depVEl4%VA$DsL$z|1qg9Se&H8UD(`~2 zqvw{QSLc>&<(pym(GzVWroh^r%QkI~WEN&wGffKMF{^XpilQ zr5N5}Oc(=!4&Wfkr1kMUm&|q_q*?X+F>C5Me){PLmVaHpMQT!ZqY;lv_B^{A*h08w zhg2!8dZzR*gZlD)GTobk8ga6w=HMMIU+R_K=zzT<;h7*a2H4T$&>Nd)#?F?Ki+xt{ z=`HW)E~alM)()s|oO7Mu)I{N8_gBzpeFAcq&O&lvmcxR9&3KTzodV2q-Xku32rNtN z^7dLpv*xV6AiW+}SN&H+TZ>U}5&6&DydQX$nEfisPhGT#KW8?LZaGszYA(-|sQ4H# zwkd_xwH9pZQk~oy#>O{!dTKnI7Tx_4?ocYYC36=*sedSra~IH4lYse~{647kCmQ@C z<9i0{%*>`i*Q(Xb*@|s|bJgz_2esFkkKTW!9}J@Za)c$$7ExO+w!WO5j|9d6bcdUE zox+g;AXg~RN8f<_H9{}ks5}{Wi#?RXyJr4M4xHOaaMEXc;^@nBzv5#c`Cq4rMzz^- zcHPVV+*jmK$)aBRu}|moefi(K9@*KS8Xx)!l9hRNEQJu|I~kDpLXJVCb;$LI6qbUd zu9{kqf!F-~&CPGKE0eif>&Er7u^_^WxOt~4It?A3;#1W04 zZdyz9&}}QlaH=ny#vT7C(4EEpZQu38bn699>FtVoy8AZy^ZtkXlRk2;2S9Ef17L(d znu%FiF+emwm?cy_Y1RFFclv)B}z#*vhsym$7pe}LqEBI)>O!Qz?HGqJ@kpK(S*hXc#4|<>_Lz|ap1Icd#ox}K# zk4Rn(l(dw3_6)VEy1Ei1kT3<2Olu3I8kB;L(r#|NAi0JguMNnXkli8gCohln{{8z3 z|8rL=5FNs}Yz<=3ro0vc{I(2hZSRYp!%3)s(7bnG0D%S6XJkq-xK-wax08;jJQ@z^ zy7qFCsYAUVyi%d+^YG1D+)@c}GU%t;zBlcuL}?}{lED7NYbn!JP*+&g@|<3=!F+W8 z^{Gg;zYD-o3#rS>$}C%6%yIEJ9KrjpeFT+j~fB z0aj9~@h~~C;OHfGxS22e)XKu3NVWMty0|u>jmcnuM!#u5}8F01xW7yG;$Hp z%)j`gH+J0DmMCDM8q>V7P*G$Vkv}jbbaPT3m~p!G@M;lbZQ*JTRLVr%+S+mkaa${q z5?3ZqXOXqJ0q(W(@OEn57leJ;JT62QD*j-^n}o^`Dl4U04)UyGG60`fZG55;Y&}v6 z#`HYJpSr>ojr61C+DaqhS(KD`)^Scbz8lD?!jSO6#pHnV_R^>Hl+2L#S{UEqAJbP2 zi^Qr(%gY_N7(!FEYL=S>Co&m~MdF9rEdZuj)$hqxV*jj)`hnn+dnJ9IngT+jQ%h3H zlwP#kQZJKHDKneYByE0fah<=7a@B~T61Ezlqk{4`BuWAmTLY4hH(yG7-JjidwaN)} zqf-F&h|M|&0gAC~RjqFV0jcl3RZ^tXng^;NW}XmO{R?Z!O4!f}a` z+4#AomfOOeETPbx77K=+8xSEC`tzrzzUQ>Xqk!^lKc3%SZP&X_vHGh452ENGaGB{9 z$?b73wUgs_Kmm}uxUtP`+s136szO=A$_9aL3G4F$4`WKaw+3vl zt_u{tKI=Hai0jCrc0Ek<63i>D#F>RNtVD(Oe@B$EK4S^M-zsidi? zG0F4OSX|R2+*edR(f$ZDtDAS{W>gVfFCOp89W&KaDX58p&+5!k-JYzy{Jlq@ay zJQlk4r)>KTJp|_23g|6w07AvWYNS^{p2Wea!dw$~l!wEbuHJ;0i+&4?3sy< zmX>Ae42VRdS%Y$rn0?HwRf-|2trNHX197epbcg=D`8T3^VJJEDwE7;eT zK-eAX>-Qsmy)w#Rj?T);$`Lp;G!2^rv6=g`L+xmbifQjZ9%W=?h_9a?H6Go0`202L zG@KuVl--$Z{UjVe`}X3TARowdf`;NM$;HEK`kFINk8c!=ASr(B(+_HIb-v-BG#FSL zonr}zxs!>iU>xB$lb%N!@)>7KHaG0E?x~_5zM8n)0Re?SNF)U{e=;vb3w=#v(=q)h z+9T4#vLE~53eL0^)AGvO2`Rb)28itf#B_B;;*wUi^gtcYnF=J&r)y2Sv42di^u!Ai zFo4<*^-&b7UAPk+esKgWrJdHAvclQUomk=$%wRtLDSmMce2-u{p!8%;`V5p4w9A+= zn&>Vp3NPKrZ!Qe)-Q37CP>5i}6K%1EI{Fk)Z97fl?U&laBu_az82reW*18k|QY8rh z6)kd8-v`HULddPS91r^IAI#adRDXq-@e)@aMHn3ZK0?nr+J9*&S2c^z+1=M1_dPwc zHHf4xXphmdkJc_^fOGL`>0_!<5~Qq4>b$e>ofoFW<3MI3j+O(dHl#^rf9x7zKUP?rHE zdG7)J&R`YSZzeX;oB=MDByFU^=rJ!cbKBOU53?Jy7|RE!&!@0eV&ym+l{l6F=9fY& zmVDG{sv2DC!x|yF1B`aIwgiI~Qd|1Y{Pcx=*(T4ss zdD2P^0zYh5|3;R1K2w;kG?a;8@^=u4 z+KEE;U7!%WUGhj?Tjxd?2*c(*U*#|v+%3NfXJIW~h$!-q|B73f)n zgfhVZ;moQ1N~VW)W<4bWP!<1h^)Lq^|@BbXq-gC2EyIJp19bDaumCrIlzLZa?| zL|sv2aoXZc3xPX2$(}^F$#h-DQ)Iwep33{IM2MSU#%-{MW~mhQeK;B99Z9!VSMZcQ z$Gy+r@ArntBPD5&AJ*A)^QXS8W62qpIn>qX6dG{a6j8X42-ko9~g3gou6nU7@P*sZniiL>@e2^exO$IQ~ ziO*@(czT-z6!M(<^|%6GK2FuDE%^HDE|XQqLK;1wVt3LbtF6d0vm|eNb3qTt3p{Skpy^!Q9Lq)6edbOrV&yugu4IUg9jnUwQ)_{n}n7yh*@x=YAl?_=3T zm+`^p5v@L7(UT=xPr6Ut(7 zWc}KuUg}Sye>f4*?P=icB(D&yV8phY54Ody(`y7}GES%8W@@d>_0s`ZPT-ACGI_TM zWKZJuT(vqhonQVy4!u%YAG@m;BkGY;->RKNPbjYK-oavrS5t+30cEyIy1}<}_*Jlx zJ$q=wuS<-9Y;UU)9DZd-ZOTIs1tYX6u+!*3_Z3P9nWwN;bZHE>68BgJMIjI7v<_1x zJ)7~mg#@n5C+WdonBnXs!n;3LF~?r8IaMh8sV{cL3mdv&3GZ$B{PKYLQ)oYhY$Nwp zWH?<|^G}yKJ(6i;6t_39;Fn_e(%SVwYD(kZtWlJ*s@`cp%oATgXhDkln5)4&Ns*?J zG-iNH=PFUM#mMQ~iB@$ojTh?*v4YBS*?gYA1pqHuOZMXt-fDukcQqvfQFm-~9^3|U z7917?=AX>^So(Q0ChUFIw{gY0PZdCYw5Gq~HcTO*$CKa1V)sDDhP_~UFOGC4=BLRq z(7Z=cfO709j6JROqYwpjmr{gB%IB2)7-CcR#M&PZNA`iisszWR`o{W3%^1@+RlhE) z`^mKdaiTWPja-dS0r*DjE9rn-rP#sNNs=GR9Xi$HPgH1koy1!a9wQhs93y5f(Xb?a%p|_J0_C*|kSC>Y8Ken!aYC zF;~+o!a$G-jZLj}Yz@({{ay^2HS1DL!)syH@TkUkSni%t2A^#f6-$(yd-D3jZn86+ zfSB8?h5E`XFr3)R;~ma^xwBb^E>qSX0K$1SnixjoJr!V6b2rHc0yTGw7A7O$^u|CX z!AL%nm}Vllj;Fa4_RDX_<(#~m+09DlT(-1Vh*8YyW2~16>Ah9vGzV^-8V0^Hv%hRi zi&beBv%cYXmqGgBn_k+96L46`T;*5F8L(!Ml{$7nsO`^@li_o*B;I zFnapfC+CLfL$aoxMBnw#NQpJ7BVPGn8vZgG&P8T$XesBNe8=F4T&PtBvg0}*?rQyr zM4B{xh3~M_JOO*LU@Z30niaNUEQ# zCfyMivw+3l$AgJ7$LKC58-LU%bDq`I$fyE5`sexkM~8Mo?d#+a}Z zyX#UP;>T!P)HKhWu5hs5!X7N7mZQcKCGBBi$aURmK*_z85VF+9!wn1rZKGY;*L8Rx z+BIV5(b4Ke9m*@w`H0XWCOWak=65lc*o9z2W){tejvDBM<_K{IECyrL=@QFtN{w|g zqszh$4NZQc?W2;#IdPz_s2E){Botod8Lv(i>06Wlt<)I7#F3)xWd;6z*=kvqWI)>6 z!;=xp`7#I8ve{nDq&#oT z;*(W4#Nb~I*;0~8`BQ}F65pUCjXl+ZQ}sw7ov826g%s#GI17&9j((t*CwkrrBtPZ7 zh&#QDxKU%{2FbfDtJ#5MajV;`!GCZ@8Q?mwV(h)6o>L`R0hj5FHW{8?BhzcDeV0rN zlQB*78RZy}ZI?~5$5Q97cNBjzud*O+)!dJAjKfCe8r_D@c2&{Uvv{V3_bJ7l7cb91 z5j^EEqWb)L;^zo)_%~Ud{t-$ViK$SOx=@}pq0JVr@5i-9V5t6a0YWWCqdt3PT@OC- z*ZghjNn-{d?p|Bp+AVa({} z2&GC94t@%I&*&ZB~g-TM?Xk!EvARuLK%7+?qTiHU{c>9 zeFN2}p=X>*NK6VEgrk`=&2qCy-1AfJh2@Y`Rj$L7%nKu!j;!djdzk94Oo#ipAN$+d z*$urgc8tzWOA}1`9N^3DCdCyMk|K%N&C_O!tw!6VVagSuhAOQEHyhKAKnIKjF)Lth94#!mM!4?c&z zpHblxnPXhGa+jrxs!CEz$q2(LNaFqmrRME1H`a9#j;cylHdm`5XPsthJLaW()8~D8 ziSjUJTfg3s`m8JK83^X?5|)fkB{ypfyGzAWYg+-9f_q12R{d1-RK_GM{kFdA=ttt5 zuax#gT^0>`q{hDI4R_3m4?10Ejk&d$k5-IrhA)sT;`@UTRNh2Ke`tHLI-`aJNS+c=>po^wp`ZVKPBupS8<1=J z64zYn#hWLz!Q5Mr4m}WJhDWyyvw~4~M@gg)EsZX--Rdl|U_V=bm6@2C`exINC+3)C zSV4-rAgn4Wq1VIo36U!8Z*xMCk0swk6pHgZVma0)3`ntfnE9t8DuGg%#^ITzt^1tf zpq~baHcL(5mU~-UtzF@S($CEJVGWMVJ3^!Go@1_7;m0bzwLbnG&;jYI@j%JD#-thE zyyYUqgz!ACs&UQrlt&N$+~ZCIR(2wY?WJIm{DvGBQ!MFxTspR|)=T4+Dbmf;yR7^y ze2Jt)v+C+I6+j}p^JI;u-08%)?|YfoE_OZcli|vYPqqc)%_L=C!r}lKwgIXgCn9~O zs!O>tP$PFr3aFI|K<+1?u9NO@8;%RdDB(&7A@TdNZT>-tudJo_BQn953$rN#* z3RGgREZ{RT<=3yzGgoWq-EK*g1veY_mEHwm6A#`XgIADx<3Z5osOhhWBjp3+4| zg)6F-WCMr&HHb4kqRcQ{1nQaG-xa#eqSiKYy`H=-dj5Hho7f->==HBn zdgLPDpx$EX}w_2MDp zCP+vInG@m5VG#z;- zgh46JaU$rJe+7Y0A&-&YaDLtajWb5lzGOPT6p^>ZpsNT6m&t}=x`T%ue~y&FAir;H z{Do~1$PTiAY_x14`5B0l=q1n==34`I>h>q!MhO5?Rrq6OYETQ8&=Y*ZWdE-^eze-) z6CpBMCrQXb3C6SsUGZ^@7G)m%nvWPfT|W3ewVLC<>d7q%-i_=EzPRv3G+~i2o?ZKX z1C;&arw~mot%&7i(~loNwp&)quyMurgaU?(S3ZN=Ocqx60x$Y+QPO~(O)atoa|)9N zjM8G|%OPZUGA_CckAZ;V!a_z+W}AJmY;4mk_Dd8Dr|*}m$U(dX;o!B0U!F*-huB8%fcQtkO#JAY}f2G41cm9ksZN~=DR96oM^mXJ;i?I3?p>~};L^hTpJSGO0 zo{>@ZINS}(#leAne0*F@LxXq>R07VAzq4Qkc?)Wt#>3(8jpjSG+F+y|L6f?bUu{dt z(B5D=qbQv}dj!LL^jfHZHVHSXt&*^q75L-?ZHrb`R*zX(2c++*6Uw+QrSETSJbn4{ zoeiSFWreO0l&ei4T1=Af&#g4;p@6_R(-QSd8DQDj*;4>(qiZa&)gvW71G2)QXCWX) z^-Z7}VYv4%b1+rzAmjUKm0p69e1tw|P^>jqZgH$S=>&5%_{oc!n%;gK>GLjY+8gN$ z*rcf)gXTIhx~z=0E1&Mvm+VBjpwqkE)*w{e}+8{6$|C5=uL1PXqeORZATsO<2i#Vd{^!>Ht=u2m`l_0V5!}4c^mUi zMA4Lw=aNNN*Fs)>pSjVR=p$*~#C2}*m^H*DaaLv9a1j=DippT~k@I1k{(D=baJv|3 z;-hMY!Nv}<{{Usy)1YKyMHG2-nWvG`E+j2!%CgaDN8ihe$CzpSi6)M%<0xXeQf%YE zM=_D>l(0_auNsK|@#(++TtWi3do-ix|7zubwDrG!(uRRWCWWb21mt&M694b7U}t2% zdJ$|~{r#T*{hm+?^ueRBvKK(Y@UId(e}D6LEb8BH4%W;gux1E5CrXh0_wTR2AFlp> z+y8tYmH_MmrpdPEe>do_-uu@-2^~S>miF#u8~xMG0o{sBXb@K6@#Nng`>(cQ3WCNt zp9T$c{%0+Yzuz3>Z2;DcRBB52-9J4!aLO`4;~M;)t|Kef{`)JK5V=qu*=H;KbL0LF z7yMJt{{LbB|HJ<8)BgYQ)lR2?P889#6!c>gSCIVwv}{e|f`%-g0si@H{dx4z%AvQc z?%R`#J6iXP8B2f{`tM5(_$R(7!3j^v!h-s9i - + - + - + - + @@ -47,17 +47,17 @@ - + - + - + - + diff --git a/mailing_list/index.html b/mailing_list/index.html index 01115f28d5..000fc565a6 100644 --- a/mailing_list/index.html +++ b/mailing_list/index.html @@ -22,9 +22,9 @@ - + - + @@ -37,9 +37,9 @@ - + - + diff --git a/main.a3902645.js b/main.9870bffd.js similarity index 82% rename from main.a3902645.js rename to main.9870bffd.js index 9eb986c5d6..443e8fd34e 100644 --- a/main.a3902645.js +++ b/main.9870bffd.js @@ -1,2 +1,2 @@ -/*! For license information please see main.a3902645.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[267],[function(e,t,n){"use strict";e.exports=n(98)},function(e,t,n){"use strict";function o(){return(o=Object.assign||function(e){for(var t=1;t=0;p--){var f=a[p];"."===f?i(a,p):".."===f?(i(a,p),d++):d&&(i(a,p),d--)}if(!s)for(;d--;d)a.unshift("..");!s||""===a[0]||a[0]&&r(a[0])||a.unshift("");var g=a.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function u(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,o){return e(t,n[o])}));if("object"==typeof t||"object"==typeof n){var o=u(t),r=u(n);return o!==t||r!==n?e(o,r):Object.keys(Object.assign({},t,n)).every((function(o){return e(t[o],n[o])}))}return!1},s=n(4);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,o=e.hash,r=t||"/";return n&&"?"!==n&&(r+="?"===n.charAt(0)?n:"?"+n),o&&"#"!==o&&(r+="#"===o.charAt(0)?o:"#"+o),r}function m(e,t,n,r){var i;"string"==typeof e?(i=function(e){var t=e||"/",n="",o="",r=t.indexOf("#");-1!==r&&(o=t.substr(r),t=t.substr(0,r));var i=t.indexOf("?");return-1!==i&&(n=t.substr(i),t=t.substr(0,i)),{pathname:t,search:"?"===n?"":n,hash:"#"===o?"":o}}(e)).state=t:(void 0===(i=Object(o.a)({},e)).pathname&&(i.pathname=""),i.search?"?"!==i.search.charAt(0)&&(i.search="?"+i.search):i.search="",i.hash?"#"!==i.hash.charAt(0)&&(i.hash="#"+i.hash):i.hash="",void 0!==t&&void 0===i.state&&(i.state=t));try{i.pathname=decodeURI(i.pathname)}catch(u){throw u instanceof URIError?new URIError('Pathname "'+i.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):u}return n&&(i.key=n),r?i.pathname?"/"!==i.pathname.charAt(0)&&(i.pathname=a(i.pathname,r.pathname)):i.pathname=r.pathname:i.pathname||(i.pathname="/"),i}function h(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,o,r){if(null!=e){var i="function"==typeof e?e(t,n):e;"string"==typeof i?"function"==typeof o?o(i,r):r(!0):r(!1!==i)}else r(!0)},appendListener:function(e){var n=!0;function o(){n&&e.apply(void 0,arguments)}return t.push(o),function(){n=!1,t=t.filter((function(e){return e!==o}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),o=0;ot?n.splice(t,n.length-t,o):n.push(o),d({action:"PUSH",location:o,index:t,entries:n})}}))},replace:function(e,t){var o=m(e,t,p(),w.location);c.confirmTransitionTo(o,"REPLACE",n,(function(e){e&&(w.entries[w.index]=o,d({action:"REPLACE",location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t=0||(r[n]=e[n]);return r}n.d(t,"a",(function(){return o}))},function(e,t,n){e.exports=!n(14)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t,n){var o=n(28),r=n(57);e.exports=n(10)?function(e,t,n){return o.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var o=n(5),r=n(17),i=n(11),a=n(16),u=n(30),l=function(e,t,n){var s,c,d,p,f=e&l.F,g=e&l.G,m=e&l.S,h=e&l.P,b=e&l.B,v=g?o:m?o[t]||(o[t]={}):(o[t]||{}).prototype,y=g?r:r[t]||(r[t]={}),w=y.prototype||(y.prototype={});for(s in g&&(n=t),n)d=((c=!f&&v&&void 0!==v[s])?v:n)[s],p=b&&c?u(d,o):h&&"function"==typeof d?u(Function.call,d):d,v&&a(v,s,d,e&l.U),y[s]!=d&&i(y,s,p),h&&w[s]!=d&&(w[s]=d)};o.core=r,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){e.exports=n(110)()},function(e,t,n){var o=n(5),r=n(11),i=n(31),a=n(40)("src"),u=n(104),l=(""+u).split("toString");n(17).inspectSource=function(e){return u.call(e)},(e.exports=function(e,t,n,u){var s="function"==typeof n;s&&(i(n,"name")||r(n,"name",t)),e[t]!==n&&(s&&(i(n,a)||r(n,a,e[t]?""+e[t]:l.join(String(t)))),e===o?e[t]=n:u?e[t]?e[t]=n:r(e,t,n):(delete e[t],r(e,t,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||u.call(this)}))},function(e,t){var n=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";t.a={plugins:["plugin-image-zoom","posthog-docusaurus",["@docusaurus/plugin-content-docs",{sidebarPath:"/home/runner/work/documentation/documentation/website/sidebars.js"}],["@docusaurus/plugin-content-blog",{feedOptions:{type:"all",copyright:"Copyright \xa9 2023 Qovery, Inc.",baseUrl:""}}],"/home/runner/work/documentation/documentation/website/plugins/guides",["@docusaurus/plugin-content-pages",{}],["/home/runner/work/documentation/documentation/website/plugins/sitemap",{}]],themes:[["@docusaurus/theme-classic",{customCss:"/home/runner/work/documentation/documentation/website/src/css/custom.css"}],"@docusaurus/theme-search-algolia"],customFields:{metadata:{cloud_providers:[{dark_logo_path:"/img/logos/aws_white.svg",logo_path:"/img/logos/aws.svg",name:"aws"},{dark_logo_path:"/img/logos/digitalocean_white.svg",logo_path:"/img/logos/digitalocean.svg",name:"digital_ocean"},{dark_logo_path:"/img/logos/scaleway_white.svg",logo_path:"/img/logos/scaleway.svg",name:"scaleway"},{dark_logo_path:"/img/logos/gcp_white.svg",logo_path:"/img/logos/gcp.svg",name:"gcp"},{dark_logo_path:"/img/logos/azure_white.svg",logo_path:"/img/logos/azure.svg",name:"azure"}],databases:[{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"mysql"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"postgresql"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"mongodb"}],event_types:[],frameworks:[{dark_logo_path:"/img/logos/hasura_white.svg",logo_path:"/img/logos/hasura.svg",name:"hasura"},{dark_logo_path:"/img/logos/laravel.svg",logo_path:"/img/logos/laravel.svg",name:"laravel"},{dark_logo_path:"/img/logos/springboot.svg",logo_path:"/img/logos/springboot.svg",name:"springboot"},{dark_logo_path:"/img/logos/nodejs.svg",logo_path:"/img/logos/nodejs.svg",name:"nodejs"},{dark_logo_path:"/img/logos/flask_white.svg",logo_path:"/img/logos/flask.svg",name:"flask"},{dark_logo_path:"/img/logos/jhipster.svg",logo_path:"/img/logos/jhipster.svg",name:"jhipster"},{dark_logo_path:"/img/logos/gin.svg",logo_path:"/img/logos/gin.svg",name:"gin"},{dark_logo_path:"/img/logos/rails.svg",logo_path:"/img/logos/rails.svg",name:"rails"},{dark_logo_path:"/img/logos/django.svg",logo_path:"/img/logos/django.svg",name:"django"},{dark_logo_path:"/img/logos/deno.svg",logo_path:"/img/logos/deno.svg",name:"deno"},{dark_logo_path:"/img/logos/strapi.svg",logo_path:"/img/logos/strapi.svg",name:"strapi"},{dark_logo_path:"/img/logos/nuxtjs.svg",logo_path:"/img/logos/nuxtjs.svg",name:"nuxtjs"},{dark_logo_path:"/img/logos/discordpy.svg",logo_path:"/img/logos/discordpy.svg",name:"discordpy"},{dark_logo_path:"/img/logos/sinatra.svg",logo_path:"/img/logos/sinatra.svg",name:"sinatra"},{dark_logo_path:"/img/logos/meilisearch.svg",logo_path:"/img/logos/meilisearch.svg",name:"meilisearch"}],guides:{"getting-started":{children:{},description:"Take Qovery from zero to production in less than 10 minutes.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/create-a-database",last_modified_on:null,path:"website/guides/getting-started/create-a-database.md",series_position:null,title:"Create a database"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/setting-custom-domain",last_modified_on:null,path:"website/guides/getting-started/setting-custom-domain.md",series_position:null,title:"Custom domain"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/debugging",last_modified_on:null,path:"website/guides/getting-started/debugging.md",series_position:null,title:"Debugging"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/managing-environment-variables",last_modified_on:null,path:"website/guides/getting-started/managing-environment-variables.md",series_position:null,title:"Environment variables"},{author_github:"https://github.com/evoxmusic",description:null,id:"/getting-started/deploy-your-first-application",last_modified_on:null,path:"website/guides/getting-started/deploy-your-first-application.md",series_position:null,title:"Hello World. Deploy your first application."}],name:"getting-started",series:!0,title:"Getting Started"},"cloud-provider":{children:{},description:"Install Qovery on your favorite cloud provider.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/cloud-provider/guide-amazon-web-services",last_modified_on:null,path:"website/guides/cloud-provider/guide-amazon-web-services.md",series_position:null,title:"Install Qovery on your Amazon Web Services account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/cloud-provider/guide-microsoft-azure",last_modified_on:null,path:"website/guides/cloud-provider/guide-microsoft-azure.md",series_position:null,title:"Install Qovery on your Microsoft Azure account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/cloud-provider/guide-scaleway",last_modified_on:null,path:"website/guides/cloud-provider/guide-scaleway.md",series_position:null,title:"Install Qovery on your Scaleway account"},{author_github:"https://github.com/evoxmusic",description:null,id:"/cloud-provider/guide-google-cloud-platform",last_modified_on:null,path:"website/guides/cloud-provider/guide-google-cloud-platform.md",series_position:null,title:"Install Qovery your Google Cloud Platform account"}],name:"cloud-provider",series:!1,title:"Cloud Providers"},provider:{children:{},description:"Install Qovery on one of our supported providers.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/provider/guide-kubernetes",last_modified_on:null,path:"website/guides/provider/guide-kubernetes.md",series_position:null,title:"Install Qovery on your Kubernetes cluster"}],name:"provider",series:!1,title:"Providers"},advanced:{children:{},description:"Go beyond the basics, become a Qovery pro, and extract the full potential of Qovery.",guides:[{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/continuous-integration",last_modified_on:null,path:"website/guides/advanced/continuous-integration.md",series_position:null,title:"Continuous Integration"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/costs-control",last_modified_on:null,path:"website/guides/advanced/costs-control.md",series_position:null,title:"Costs Control"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-api-gateway",last_modified_on:null,path:"website/guides/advanced/deploy-api-gateway.md",series_position:null,title:"Deploy API Gateway"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-aws-services",last_modified_on:null,path:"website/guides/advanced/deploy-aws-services.md",series_position:null,title:"Deploy AWS Services"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-external-services",last_modified_on:null,path:"website/guides/advanced/deploy-external-services.md",series_position:null,title:"Deploy External Services"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/deploy-frontend",last_modified_on:null,path:"website/guides/advanced/deploy-frontend.md",series_position:null,title:"Deploy Frontend App"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/helm-chart",last_modified_on:null,path:"website/guides/advanced/helm-chart.md",series_position:null,title:"Helm Charts"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/advanced/microservices",last_modified_on:null,path:"website/guides/advanced/microservices.md",series_position:null,title:"Microservices"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/migration",last_modified_on:null,path:"website/guides/advanced/migration.md",series_position:null,title:"Migration"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/monitoring",last_modified_on:null,path:"website/guides/advanced/monitoring.md",series_position:null,title:"Monitoring"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/advanced/monorepository",last_modified_on:null,path:"website/guides/advanced/monorepository.md",series_position:null,title:"Mono repository"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/use-preview-environments",last_modified_on:null,path:"website/guides/advanced/use-preview-environments.md",series_position:null,title:"Preview Environments"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/production",last_modified_on:null,path:"website/guides/advanced/production.md",series_position:null,title:"Production"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/seed-database",last_modified_on:null,path:"website/guides/advanced/seed-database.md",series_position:null,title:"Seed Database"},{author_github:"https://github.com/evoxmusic",description:null,id:"/advanced/terraform",last_modified_on:null,path:"website/guides/advanced/terraform.md",series_position:null,title:"Terraform"}],name:"advanced",series:!1,title:"Advanced"},tutorial:{children:{},description:"Additional step-by-step resources to leverage even more Qovery. ",guides:[{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws",last_modified_on:null,path:"website/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws.md",series_position:null,title:"Blazingly fast Preview Environments for NextJS, NodeJS, and MongoDB on AWS"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/build-e2e-testing-ephemeral-environments",last_modified_on:null,path:"website/guides/tutorial/build-e2e-testing-ephemeral-environments.md",series_position:null,title:"Build E2E Testing Ephemeral Environments with GitHub Actions and Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-a-playground-environment-on-aws",last_modified_on:null,path:"website/guides/tutorial/create-a-playground-environment-on-aws.md",series_position:null,title:"Create a Playground Environment on AWS"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-a-blazingly-fast-api-in-rust-part-1",last_modified_on:null,path:"website/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1.md",series_position:null,title:"Create a blazingly fast REST API in Rust (Part 1/2)"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/create-your-staging-environment-from-your-production-environment-on-aws",last_modified_on:null,path:"website/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws.md",series_position:null,title:"Create your Staging environment from your Production environment on AWS"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/generate-qovery-api-client",last_modified_on:null,path:"website/guides/tutorial/generate-qovery-api-client.md",series_position:null,title:"Creating API clients using OpenAPI Tools"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/customizing-preview-url-with-qovery-cli",last_modified_on:null,path:"website/guides/tutorial/customizing-preview-url-with-qovery-cli.md",series_position:null,title:"Customizing Preview URL with Qovery CLI"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/deploy-rails-with-postgresql-and-sidekiq",last_modified_on:null,path:"website/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq.md",series_position:null,title:"Deploy Rails with PostgreSQL and Sidekiq"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/deploy-temporal-on-kubernetes",last_modified_on:null,path:"website/guides/tutorial/deploy-temporal-on-kubernetes.md",series_position:null,title:"Deploy Temporal on Kubernetes"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/getting-started-with-preview-environments-on-aws-for-beginners",last_modified_on:null,path:"website/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners.md",series_position:null,title:"Getting Started with Preview Environments on AWS"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/grafana-install",last_modified_on:null,path:"website/guides/tutorial/grafana-install.md",series_position:null,title:"Grafana setup with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources",last_modified_on:null,path:"website/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources.md",series_position:null,title:"How To Use Lifecycle Job To Deploy Any Kind Of Resources"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 1"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 2"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3",last_modified_on:null,path:"website/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3.md",series_position:null,title:"How to Build a Cloud Version of Your Open Source Software - A Case Study with AppWrite - Part 3"},{author_github:"https://github.com/benjaminch",description:null,id:"/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster",last_modified_on:null,path:"website/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster.md",series_position:null,title:"How to activate SSO to connect to your EKS cluster"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws",last_modified_on:null,path:"website/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws.md",series_position:null,title:"How to connect to a managed MongoDB instance on AWS"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl",last_modified_on:null,path:"website/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl.md",series_position:null,title:"How to connect to your EKS cluster with kubectl"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-create-an-rds-instance-through-aws-console",last_modified_on:null,path:"website/guides/tutorial/how-to-create-an-rds-instance-through-aws-console.md",series_position:null,title:"How to create an RDS instance through the AWS console"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/how-to-deploy-helm-charts",last_modified_on:null,path:"website/guides/tutorial/how-to-deploy-helm-charts.md",series_position:null,title:"How to deploy Helm charts"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease",last_modified_on:null,path:"website/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease.md",series_position:null,title:"How to deploy a Rust REST API application on AWS with ease"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-integrate-qovery-with-github-actions",last_modified_on:null,path:"website/guides/tutorial/how-to-integrate-qovery-with-github-actions.md",series_position:null,title:"How to integrate Qovery with GitHub Actions"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/how-to-run-commands-at-application-startup",last_modified_on:null,path:"website/guides/tutorial/how-to-run-commands-at-application-startup.md",series_position:null,title:"How to run commands before the application starts"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/data-seeding-in-postgres",last_modified_on:null,path:"website/guides/tutorial/data-seeding-in-postgres.md",series_position:null,title:"How to seed a Postgres database on a dev environment"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery",last_modified_on:null,path:"website/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery.md",series_position:null,title:"How to use CloudFront with a React frontend application on Qovery"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/github-organization-repository-access",last_modified_on:null,path:"website/guides/tutorial/github-organization-repository-access.md",series_position:null,title:"How to use Github Organizations with Qovery"},{author_github:"https://github.com/MacLikorne",description:null,id:"/tutorial/how-to-write-a-dockerfile",last_modified_on:null,path:"website/guides/tutorial/how-to-write-a-dockerfile.md",series_position:null,title:"How to write a Dockerfile"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/import-your-environment-variables-with-the-qovery-cli",last_modified_on:null,path:"website/guides/tutorial/import-your-environment-variables-with-the-qovery-cli.md",series_position:null,title:"Import your environment variables with the Qovery CLI"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/cloudwatch-integration",last_modified_on:null,path:"website/guides/tutorial/cloudwatch-integration.md",series_position:null,title:"Integrate your application logs to Cloudwatch"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/kubernetes-observability-and-monitoring-with-datadog",last_modified_on:null,path:"website/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog.md",series_position:null,title:"Kubernetes observability and monitoring with Datadog"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/managing-env-variables-in-create-react-app",last_modified_on:null,path:"website/guides/tutorial/managing-env-variables-in-create-react-app.md",series_position:null,title:"Managing Environment Variables in React (create-react-app)"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/migrate-your-application-from-heroku-to-aws",last_modified_on:null,path:"website/guides/tutorial/migrate-your-application-from-heroku-to-aws.md",series_position:null,title:"Migrate your application from Heroku to AWS"},{author_github:"https://github.com/jul-dan",description:null,id:"/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery",last_modified_on:null,path:"website/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery.md",series_position:null,title:"Setting up Cloudflare and Custom Domain on Qovery"},{author_github:"https://github.com/l0ck3",description:null,id:"/tutorial/aws-vpc-peering-with-qovery",last_modified_on:null,path:"website/guides/tutorial/aws-vpc-peering-with-qovery.md",series_position:null,title:"Setup VPC peering on AWS with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/url-shortener-api-with-kotlin",last_modified_on:null,path:"website/guides/tutorial/url-shortener-api-with-kotlin.md",series_position:null,title:"URL Shortener API with Kotlin (Part 1/2)"},{author_github:"https://github.com/deimosfr",description:null,id:"/tutorial/use-aws-iam-roles-with-qovery",last_modified_on:null,path:"website/guides/tutorial/use-aws-iam-roles-with-qovery.md",series_position:null,title:"Use AWS IAM roles with Qovery"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/use-an-api-gateway-in-front-of-multiple-services",last_modified_on:null,path:"website/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services.md",series_position:null,title:"Use an API gateway in front of multiple services"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/aws-sqs-lambda-with-qovery",last_modified_on:null,path:"website/guides/tutorial/aws-sqs-lambda-with-qovery.md",series_position:null,title:"Using Amazon SQS and Lambda on Qovery"},{author_github:"https://github.com/pjeziorowski",description:null,id:"/tutorial/working-with-git-submodules",last_modified_on:null,path:"website/guides/tutorial/working-with-git-submodules.md",series_position:null,title:"Working with Git Submodules"},{author_github:"https://github.com/evoxmusic",description:null,id:"/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes",last_modified_on:null,path:"website/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes.md",series_position:null,title:"Zero to Hero - How to deploy your apps on AWS in 30 minutes"}],name:"tutorial",series:!1,title:"Tutorial"},engineering:{children:{},description:"We share our engineering learning with all of you. ",guides:[],name:"engineering",series:!1,title:"Engineering"}},highlights:[],installation:{},languages:[{dark_logo_path:"/img/logos/php.svg",logo_path:"/img/logos/php.svg",name:"php"},{dark_logo_path:"/img/logos/kotlin.svg",logo_path:"/img/logos/kotlin.svg",name:"kotlin"},{dark_logo_path:"/img/logos/java.svg",logo_path:"/img/logos/java.svg",name:"java"},{dark_logo_path:"/img/logos/javascript.svg",logo_path:"/img/logos/javascript.svg",name:"javascript"},{dark_logo_path:"/img/logos/python.svg",logo_path:"/img/logos/python.svg",name:"python"},{dark_logo_path:"/img/logos/rust_white.svg",logo_path:"/img/logos/rust.svg",name:"rust"},{dark_logo_path:"/img/logos/go.svg",logo_path:"/img/logos/go.svg",name:"go"},{dark_logo_path:"/img/logos/ruby.svg",logo_path:"/img/logos/ruby.svg",name:"ruby"},{dark_logo_path:"/img/logos/scala.svg",logo_path:"/img/logos/scala.svg",name:"scala"}],latest_highlight:{},latest_post:{},latest_release:{},post_tags:[],posts:[],providers:[{dark_logo_path:"/img/logos/kubernetes_white.svg",logo_path:"/img/logos/kubernetes.svg",name:"kubernetes"}],releases:{},sinks:{},sources:{},team:[{avatar:"https://github.com/evoxmusic.png",bio:'Romaric is a Software Engineer, and CEO at Qovery. He has 10+ years of experience in R&D. From the Ad-Tech to the financial industry, he has deep expertise in highly-reliable and performant systems.\n',github:"https://github.com/evoxmusic",id:"romaric",keybase:"https://keybase.io/evoxmusic",name:"Romaric P."},{avatar:"https://github.com/deimosfr.png",bio:'Pierre is an SRE, and CTO of Qovery. He has 15+ years of experience in R&D. From the financial to the Ad-Tech industry, he has a strong knowledge in distributed and highly-reliable systems. He\'s also the MariaDB High Performance book author.\n',github:"https://github.com/deimosfr",id:"pierre",keybase:"https://keybase.io/pierre",name:"Pierre M."},{avatar:"https://github.com/pjeziorowski.png",bio:'Patryk is an experienced Software Engineer, and a Backend Developer at Qovery. ',github:"https://github.com/pjeziorowski",id:"patryk",keybase:"https://keybase.io/patryk",name:"Patryk J."},{avatar:"https://github.com/maclikorne.png",bio:'Enzo is a Backend Developer at Qovery. ',github:"https://github.com/MacLikorne",id:"enzo",keybase:"https://keybase.io/enzo",name:"Enzo R."},{avatar:"https://github.com/l0ck3.png",bio:'Yann is a Developer Experience Engineer at Qovery. He has 15+ years of experience in development and SRE.\n',github:"https://github.com/l0ck3",id:"yann",keybase:"https://keybase.io/l0ck3",name:"Yann I."},{avatar:"https://github.com/sileht.png",bio:'Mehdi is Senior DevOps Engineer at Qovery, with 15+ years of software development and managing infrastructures, Co-founder of Mergify, active member of non-profit Tetaneutral.net ISP and Hosting provider, and he also likes to dance on crazy swing rhythm.\n',github:"https://github.com/sileht",id:"mehdi",keybase:"https://keybase.io/mehdi",name:"Mehdi A."},{avatar:"https://github.com/Stun3R.png",bio:'Thibaut is an experienced developer, CTO of Shelt.in and active Qovery contributor. ',github:"https://github.com/Stun3R",id:"thibaut_david",keybase:"https://keybase.io/Stun3R",name:"Thibaut David"},{avatar:"https://github.com/Aggis15.png",bio:"Angelos is a self-taught programmer using Python, Qovery ambassador and contributor. ",github:"https://github.com/Aggis15",id:"Aggis15",keybase:"https://keybase.io/Aggis15",name:"Angelos Rinas"},{avatar:"https://github.com/ilmiont.png",bio:"James Walker is the founder of Heron Web, a UK-based digital agency providing bespoke software development services to SMEs. He has experience managing complete end-to-end web development workflows with DevOps, CI/CD, Docker, and Kubernetes.\n",github:"https://github.com/ilmiont",id:"james_walker",keybase:"https://keybase.io/ilmiont",name:"James Walker"},{avatar:"https://github.com/Qovery.png",bio:"Dhiraj Kumar has 10+ years of experience in Python and Machine learning. I specialize in Data analytics and Machine learning using python. My Primary Expertise includes Python, Flask, Django, Pandas, NumPy, SciKit-Learn, NLP, Docker, Machine Learning, Deep Learning, Chatbot, NLP, Spark, AWS, C#, and Azure\n",github:"https://github.com/dhiraj_kumar",id:"dhiraj_kumar",keybase:"https://keybase.io/dhiraj_kumar",name:"Dhiraj Kumar"},{avatar:"https://github.com/Qovery.png",bio:"Shingai Zivuku is a softwage engineer passionated by the cloud.\n",github:"https://github.com/shingai_zivuku",id:"shingai_zivuku",keybase:"https://keybase.io/shingai_zivuku",name:"Shingai Zivuku"},{avatar:"https://github.com/benjaminch.png",bio:'Benjamin is a senior Backend Developer at Qovery.',github:"https://github.com/benjaminch",id:"benjaminch",keybase:"https://keybase.io/benjaminch",name:"Benjamin Chastanier"},{avatar:"https://github.com/jul-dan.png",bio:'Julien is a Technical Product Manager at Qovery.',github:"https://github.com/jul-dan",id:"jul-dan",keybase:"https://keybase.io/jul-dan",name:"Julien Dan"}],technologies:[{dark_logo_path:"/img/logos/kubernetes_white.svg",logo_path:"/img/logos/kubernetes.svg",name:"kubernetes"},{dark_logo_path:"/img/logos/helm_white.svg",logo_path:"/img/logos/helm.svg",name:"helm"},{dark_logo_path:"/img/logos/docker.svg",logo_path:"/img/logos/docker.svg",name:"docker"},{dark_logo_path:"/img/logos/kotlin.svg",logo_path:"/img/logos/kotlin.svg",name:"kotlin"},{dark_logo_path:"/img/logos/qovery.svg",logo_path:"/img/logos/qovery.svg",name:"qovery"},{dark_logo_path:"/img/logos/posthog.svg",logo_path:"/img/logos/posthog.svg",name:"posthog"},{dark_logo_path:"/img/logos/terraform.svg",logo_path:"/img/logos/terraform.svg",name:"terraform"},{dark_logo_path:"/img/logos/github.svg",logo_path:"/img/logos/github.png",name:"github"}],transforms:{}}},themeConfig:{disableDarkMode:!1,navbar:{hideOnScroll:!0,logo:{alt:"Qovery",src:"img/logo-light.svg",srcDark:"img/logo-dark.svg",url:"https://www.qovery.com"},links:[{to:"guides/",label:"Guides",position:"left"},{to:"docs/",label:"Docs",position:"left"},{to:"guides/tutorial",label:"Tutorials",position:"left"},{href:"https://discuss.qovery.com",label:"Forum",position:"left"},{href:"https://start.qovery.com",label:"Web Console",position:"right"},{href:"https://www.qovery.com",label:"Home",position:"right"},{href:"https://github.com/Qovery",label:"GitHub",position:"right"}]},image:"img/open-graph.png",prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["hcl","rust"]},footer:{links:[{title:"Resources",items:[{label:"Documentation",to:"docs"},{label:"Guides",to:"guides"},{label:"Tutorials",to:"guides/tutorial"},{label:"Engineering",to:"guides/engineering"},{label:"Pricing",to:"https://www.qovery.com/pricing"},{label:"Enterprise",to:"https://www.qovery.com/enterprise"},{label:"API",to:"https://api-doc.qovery.com"},{label:"Github",to:"https://github.com/Qovery"}]},{title:"Community",items:[{label:"Discord",to:"https://discord.qovery.com"},{label:"Forum",to:"https://community.qovery.com"},{label:"Community call",to:"https://www.qovery.com/community-call"},{label:"Goodies",to:"https://shop.qovery.com"},{label:"Roadmap",to:"https://roadmap.qovery.com"},{label:"Replibyte",to:"https://github.com/Qovery/replibyte"}]},{title:"Company",items:[{label:"Blog",to:"https://www.qovery.com/blog"},{label:"Jobs",to:"https://jobs.qovery.com"},{label:"Team",to:"https://www.qovery.com/team"},{label:"Investors",to:"https://www.qovery.com/investors"},{label:"Contact",to:"https://www.qovery.com/contact"}]}],copyright:"\xa9 2023 DESIGNED BY QOVERY | PROUD SILVER MEMBER OF CNCF AND LINUX FOUNDATION | QOVERY BY BIRDSIGHT - ALL RIGHTS RESERVED"},algolia:{appId:"FT65SBJ2DA",apiKey:"02604e8b2e0918e90edd1d9eb8e30f5e",indexName:"qovery",algoliaOptions:{}},googleAnalytics:{trackingId:"UA-129773960-5"},posthog:{apiKey:"phc_IgdG1K2GveDUte1gJ6hlwNbFHCv9nViWETUyLMU7ciq",appUrl:"https://phprox.qovery.com",enableInDevelopment:!1},imageZoom:{selector:"img"}},title:"Qovery",tagline:"Deploy On-demand Environments on AWS, Remarkably Fast",url:"https://hub.qovery.com",baseUrl:"/",favicon:"img/logo-square.svg",organizationName:"Qovery",projectName:"documentation",presets:[],scripts:["/js/intercom.js",{src:"https://www.googletagmanager.com/gtag/js?id=UA-129773960-5",async:!0},"/js/ga.js"],stylesheets:["https://fonts.googleapis.com/css?family=Ubuntu|Roboto|Source+Code+Pro","https://at-ui.github.io/feather-font/css/iconfont.css"]}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return l}));var o=n(3),r=n(1),i=n(0),a=n.n(i);function u(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var r=e.path?Object(o.f)(t,e):n.length?n[n.length-1].match:o.c.computeRootMatch(t);return r&&(n.push({route:e,match:r}),e.routes&&u(e.routes,t,n)),r})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.a.createElement(o.d,n,e.map((function(e,n){return a.a.createElement(o.b,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render(Object(r.a)({},n,{},t,{route:e})):a.a.createElement(e.component,Object(r.a)({},n,t,{route:e}))}})}))):null}},function(e,t){var n=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:n,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:n&&"IntersectionObserver"in window,canUseViewport:n&&!!window.screen};e.exports=o},function(e,t,n){"use strict";var o=n(36),r={};r[n(2)("toStringTag")]="z",r+""!="[object z]"&&n(16)(Object.prototype,"toString",(function(){return"[object "+o(this)+"]"}),!0)},function(e,t,n){"use strict";var o=n(74),r=n(88),i=n(24),a=n(33);e.exports=n(61)(Array,"Array",(function(e,t){this._t=a(e),this._i=0,this._k=t}),(function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,r(1)):r(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports={}},function(e,t,n){var o=n(107),r=n(65);e.exports=Object.keys||function(e){return o(e,r)}},function(e,t,n){var o=n(35),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},function(e,t,n){var o=n(34);e.exports=function(e){return Object(o(e))}},function(e,t,n){var o=n(8),r=n(86),i=n(87),a=Object.defineProperty;t.f=n(10)?Object.defineProperty:function(e,t,n){if(o(e),t=i(t,!0),o(n),r)try{return a(e,t,n)}catch(u){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){for(var o=n(22),r=n(25),i=n(16),a=n(5),u=n(11),l=n(24),s=n(2),c=s("iterator"),d=s("toStringTag"),p=l.Array,f={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},g=r(f),m=0;m0?o:n)(e)}},function(e,t,n){var o=n(23),r=n(2)("toStringTag"),i="Arguments"==o(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(n){}}(t=Object(e),r))?n:i?o(t):"Object"==(a=o(t))&&"function"==typeof t.callee?"Arguments":a}},function(e){e.exports=JSON.parse('{"/":{"component":"c4f5d8e4"},"/community":{"component":"672ba3d6"},"/components":{"component":"54e7632e"},"/contact":{"component":"83e9e333"},"/docs":{"component":"25b7c3f2"},"/guides":{"component":"c6d06197","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"df1c18d8"},{"content":"8f02216a"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"a960914c"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"5751c945"},{"content":"228c86a3"},{"content":"d64bf575"},{"content":"3036b36b"},{"content":"280c5e92"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"dea3d534"},{"content":"6ce627d6"},{"content":"e5b9b0aa"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"05049f86"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"49d2885e"},"/guides/advanced":{"component":"d9deea5f","items":[{"content":"1a39f24c"},{"content":"da253275"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"8f02216a"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"05049f86"}],"metadata":"3e1d77c1"},"/guides/advanced/continuous-integration":{"component":"1c13b173","content":"03d003d1"},"/guides/advanced/costs-control":{"component":"1c13b173","content":"a8a9c166"},"/guides/advanced/deploy-api-gateway":{"component":"1c13b173","content":"b7d53051"},"/guides/advanced/deploy-aws-services":{"component":"1c13b173","content":"5385e737"},"/guides/advanced/deploy-external-services":{"component":"1c13b173","content":"e7d0ec68"},"/guides/advanced/deploy-frontend":{"component":"1c13b173","content":"1dd2c233"},"/guides/advanced/helm-chart":{"component":"1c13b173","content":"c24a85bb"},"/guides/advanced/microservices":{"component":"1c13b173","content":"66bbed7b"},"/guides/advanced/migration":{"component":"1c13b173","content":"10c2e3e6"},"/guides/advanced/monitoring":{"component":"1c13b173","content":"18415bef"},"/guides/advanced/monorepository":{"component":"1c13b173","content":"f756422c"},"/guides/advanced/production":{"component":"1c13b173","content":"93701b40"},"/guides/advanced/seed-database":{"component":"1c13b173","content":"2309a9c8"},"/guides/advanced/terraform":{"component":"1c13b173","content":"9c8ed74f"},"/guides/advanced/use-preview-environments":{"component":"1c13b173","content":"8bfd1931"},"/guides/cloud-provider":{"component":"d9deea5f","items":[{"content":"5751c945"},{"content":"d64bf575"},{"content":"3036b36b"},{"content":"280c5e92"}],"metadata":"4ac9ee63"},"/guides/cloud-provider/guide-amazon-web-services":{"component":"1c13b173","content":"454f50a3"},"/guides/cloud-provider/guide-google-cloud-platform":{"component":"1c13b173","content":"fe264ce1"},"/guides/cloud-provider/guide-microsoft-azure":{"component":"1c13b173","content":"d0db1526"},"/guides/cloud-provider/guide-scaleway":{"component":"1c13b173","content":"ff053ed0"},"/guides/getting-started":{"component":"d9deea5f","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"}],"metadata":"0e2fb061"},"/guides/getting-started/create-a-database":{"component":"1c13b173","content":"24e60f8a"},"/guides/getting-started/debugging":{"component":"1c13b173","content":"6504a542"},"/guides/getting-started/deploy-your-first-application":{"component":"1c13b173","content":"cc9be38a"},"/guides/getting-started/managing-environment-variables":{"component":"1c13b173","content":"b7280cb5"},"/guides/getting-started/setting-custom-domain":{"component":"1c13b173","content":"c0594016"},"/guides/provider":{"component":"d9deea5f","items":[{"content":"228c86a3"}],"metadata":"998e75d2"},"/guides/provider/guide-kubernetes":{"component":"1c13b173","content":"41961c76"},"/guides/tags":{"component":"3116c1fa","tags":"a81fb19d"},"/guides/tags/cloud-provider-aws":{"component":"004ec9e5","items":[{"content":"a156f6a6"},{"content":"3e6b1f84"},{"content":"1b633bfd"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"a1fea8fb"},{"content":"5751c945"},{"content":"6ce627d6"},{"content":"c8223350"},{"content":"cbb976f4"},{"content":"0c18cf89"}],"metadata":"b795af1c"},"/guides/tags/cloud-provider-azure":{"component":"004ec9e5","items":[{"content":"d64bf575"}],"metadata":"4505e7dd"},"/guides/tags/cloud-provider-gcp":{"component":"004ec9e5","items":[{"content":"280c5e92"}],"metadata":"d24a1a4d"},"/guides/tags/cloud-provider-scaleway":{"component":"004ec9e5","items":[{"content":"3036b36b"}],"metadata":"83c60db1"},"/guides/tags/database-postgresql":{"component":"004ec9e5","items":[{"content":"50bab564"},{"content":"2cb76395"},{"content":"f7098925"}],"metadata":"4a111132"},"/guides/tags/framework-rails":{"component":"004ec9e5","items":[{"content":"50bab564"}],"metadata":"a264e41a"},"/guides/tags/language-javascript":{"component":"004ec9e5","items":[{"content":"498daee8"},{"content":"072d4c63"}],"metadata":"cb05c8fa"},"/guides/tags/language-kotlin":{"component":"004ec9e5","items":[{"content":"f7098925"}],"metadata":"dbe0f891"},"/guides/tags/language-ruby":{"component":"004ec9e5","items":[{"content":"50bab564"}],"metadata":"f7aa8e39"},"/guides/tags/language-rust":{"component":"004ec9e5","items":[{"content":"89caf623"},{"content":"b565c464"}],"metadata":"2e212509"},"/guides/tags/provider-kubernetes":{"component":"004ec9e5","items":[{"content":"228c86a3"}],"metadata":"0c52d983"},"/guides/tags/technology-docker":{"component":"004ec9e5","items":[{"content":"bbfbe73c"}],"metadata":"d4b6ce89"},"/guides/tags/technology-github":{"component":"004ec9e5","items":[{"content":"40ec3bc1"}],"metadata":"60ad046d"},"/guides/tags/technology-helm":{"component":"004ec9e5","items":[{"content":"8f02216a"}],"metadata":"49dea187"},"/guides/tags/technology-qovery":{"component":"004ec9e5","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"56c0a343"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"5e5fefd2"},{"content":"36676680"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"df1c18d8"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"a960914c"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"ba43933d"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"f3d8c143"}],"metadata":"4c0b3d74"},"/guides/tags/technology-terraform":{"component":"004ec9e5","items":[{"content":"05049f86"}],"metadata":"63ea0c72"},"/guides/tags/type-guide":{"component":"004ec9e5","items":[{"content":"d2397242"},{"content":"44b423be"},{"content":"e4310ee0"},{"content":"0578cd49"},{"content":"48764d63"},{"content":"1a39f24c"},{"content":"da253275"},{"content":"5e5fefd2"},{"content":"3e6b1f84"},{"content":"36676680"},{"content":"498daee8"},{"content":"8f02216a"},{"content":"5751c945"},{"content":"228c86a3"},{"content":"d64bf575"},{"content":"3036b36b"},{"content":"280c5e92"},{"content":"dea3d534"},{"content":"e5b9b0aa"},{"content":"9ecfa6fe"},{"content":"16c36934"},{"content":"16976906"},{"content":"68c0e7f9"},{"content":"e8b0321f"},{"content":"05049f86"}],"metadata":"f11e9a8e"},"/guides/tags/type-tutorial":{"component":"004ec9e5","items":[{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"df1c18d8"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"a960914c"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"6ce627d6"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"bf22200e"},"/guides/tutorial":{"component":"d9deea5f","items":[{"content":"a156f6a6"},{"content":"56c0a343"},{"content":"89caf623"},{"content":"967beaa8"},{"content":"1a6d3985"},{"content":"ff0cde69"},{"content":"cbcbf0e3"},{"content":"50bab564"},{"content":"2cb76395"},{"content":"3088ad98"},{"content":"df1c18d8"},{"content":"1b633bfd"},{"content":"bc592dc7"},{"content":"acaf40e9"},{"content":"5b95bed2"},{"content":"3986a7a9"},{"content":"de0a75d9"},{"content":"bdd6d8c6"},{"content":"b565c464"},{"content":"a960914c"},{"content":"40ec3bc1"},{"content":"fb1d0a83"},{"content":"9107e302"},{"content":"a1fea8fb"},{"content":"e06f2af5"},{"content":"8d146bfd"},{"content":"bbfbe73c"},{"content":"60296d59"},{"content":"e1becc8e"},{"content":"b5eab6bb"},{"content":"072d4c63"},{"content":"6ce627d6"},{"content":"ba43933d"},{"content":"c8223350"},{"content":"f7098925"},{"content":"7952d159"},{"content":"c0ab55e0"},{"content":"cbb976f4"},{"content":"f3d8c143"},{"content":"0c18cf89"}],"metadata":"af9ec14b"},"/guides/tutorial/aws-sqs-lambda-with-qovery":{"component":"1c13b173","content":"bbedfc29"},"/guides/tutorial/aws-vpc-peering-with-qovery":{"component":"1c13b173","content":"e9c994cf"},"/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws":{"component":"1c13b173","content":"94a00d4e"},"/guides/tutorial/build-e2e-testing-ephemeral-environments":{"component":"1c13b173","content":"2121549d"},"/guides/tutorial/cloudwatch-integration":{"component":"1c13b173","content":"83a41d86"},"/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1":{"component":"1c13b173","content":"db372ba8"},"/guides/tutorial/create-a-playground-environment-on-aws":{"component":"1c13b173","content":"2ea1d02e"},"/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws":{"component":"1c13b173","content":"410a9ba0"},"/guides/tutorial/customizing-preview-url-with-qovery-cli":{"component":"1c13b173","content":"b76eb9a9"},"/guides/tutorial/data-seeding-in-postgres":{"component":"1c13b173","content":"4592dbe6"},"/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq":{"component":"1c13b173","content":"a3cf753a"},"/guides/tutorial/deploy-temporal-on-kubernetes":{"component":"1c13b173","content":"49a59b02"},"/guides/tutorial/generate-qovery-api-client":{"component":"1c13b173","content":"a4401f0f"},"/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners":{"component":"1c13b173","content":"1a3e0044"},"/guides/tutorial/github-organization-repository-access":{"component":"1c13b173","content":"55af4c9e"},"/guides/tutorial/grafana-install":{"component":"1c13b173","content":"5b8d4026"},"/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster":{"component":"1c13b173","content":"06e8d299"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1":{"component":"1c13b173","content":"10dee872"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2":{"component":"1c13b173","content":"a4c8ecc0"},"/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3":{"component":"1c13b173","content":"b74d0aaa"},"/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws":{"component":"1c13b173","content":"eb0c7ce5"},"/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl":{"component":"1c13b173","content":"7aa59ca3"},"/guides/tutorial/how-to-create-an-rds-instance-through-aws-console":{"component":"1c13b173","content":"e4768112"},"/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease":{"component":"1c13b173","content":"3da71a70"},"/guides/tutorial/how-to-deploy-helm-charts":{"component":"1c13b173","content":"4fed1128"},"/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes":{"component":"1c13b173","content":"97f5d064"},"/guides/tutorial/how-to-integrate-qovery-with-github-actions":{"component":"1c13b173","content":"c7bfb1d3"},"/guides/tutorial/how-to-run-commands-at-application-startup":{"component":"1c13b173","content":"1d3be599"},"/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery":{"component":"1c13b173","content":"311fe203"},"/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources":{"component":"1c13b173","content":"6b7a52aa"},"/guides/tutorial/how-to-write-a-dockerfile":{"component":"1c13b173","content":"a9994e72"},"/guides/tutorial/import-your-environment-variables-with-the-qovery-cli":{"component":"1c13b173","content":"bb89e1a0"},"/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog":{"component":"1c13b173","content":"b479fc9a"},"/guides/tutorial/managing-env-variables-in-create-react-app":{"component":"1c13b173","content":"a4459aa8"},"/guides/tutorial/migrate-your-application-from-heroku-to-aws":{"component":"1c13b173","content":"03dbc155"},"/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery":{"component":"1c13b173","content":"e5653b8d"},"/guides/tutorial/url-shortener-api-with-kotlin":{"component":"1c13b173","content":"ab8f5b83"},"/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services":{"component":"1c13b173","content":"35d9179e"},"/guides/tutorial/use-aws-iam-roles-with-qovery":{"component":"1c13b173","content":"5b5f8b70"},"/guides/tutorial/working-with-git-submodules":{"component":"1c13b173","content":"f26e55ec"},"/mailing_list":{"component":"48912b2c"},"/docs/:route":{"component":"1be78505","docsMetadata":"20ac7829"},"/docs/getting-started":{"component":"17896441","content":"d589d3a7"},"/docs/getting-started/basic-concepts":{"component":"17896441","content":"d85dc1ef"},"/docs/getting-started/deploy-my-app":{"component":"17896441","content":"4354960d"},"/docs/getting-started/how-qovery-works":{"component":"17896441","content":"cb2208c1"},"/docs/getting-started/install-qovery":{"component":"17896441","content":"1a1dfe25"},"/docs/getting-started/what-is-qovery":{"component":"17896441","content":"68b95634"},"/docs/getting-started/whats-next":{"component":"17896441","content":"543e268a"},"/docs/security-and-compliance":{"component":"17896441","content":"fcb698a1"},"/docs/security-and-compliance/backup-and-restore":{"component":"17896441","content":"b98931a2"},"/docs/security-and-compliance/encryption":{"component":"17896441","content":"2486bcfc"},"/docs/security-and-compliance/gdpr":{"component":"17896441","content":"7278678a"},"/docs/security-and-compliance/soc2":{"component":"17896441","content":"cf490432"},"/docs/useful-resources/faq":{"component":"17896441","content":"59157ba2"},"/docs/useful-resources/help-and-support":{"component":"17896441","content":"d2075f7f"},"/docs/using-qovery":{"component":"17896441","content":"56cfbe62"},"/docs/using-qovery/audit-logs":{"component":"17896441","content":"b8490823"},"/docs/using-qovery/configuration":{"component":"17896441","content":"fc376fea"},"/docs/using-qovery/configuration/advanced-settings":{"component":"17896441","content":"4f6caeac"},"/docs/using-qovery/configuration/application":{"component":"17896441","content":"8d5726d6"},"/docs/using-qovery/configuration/application-health-checks":{"component":"17896441","content":"91473650"},"/docs/using-qovery/configuration/cloud-service-provider":{"component":"17896441","content":"33b1fe0f"},"/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services":{"component":"17896441","content":"43a5f55b"},"/docs/using-qovery/configuration/cloud-service-provider/digital-ocean":{"component":"17896441","content":"0806b243"},"/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform":{"component":"17896441","content":"9ab61bc5"},"/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure":{"component":"17896441","content":"e61780f0"},"/docs/using-qovery/configuration/cloud-service-provider/other-csps":{"component":"17896441","content":"b8d420d8"},"/docs/using-qovery/configuration/cloud-service-provider/scaleway":{"component":"17896441","content":"d3437d81"},"/docs/using-qovery/configuration/cluster-advanced-settings":{"component":"17896441","content":"2f1afd92"},"/docs/using-qovery/configuration/clusters":{"component":"17896441","content":"dc00a797"},"/docs/using-qovery/configuration/cronjob":{"component":"17896441","content":"54ad54c7"},"/docs/using-qovery/configuration/database":{"component":"17896441","content":"9feef5a0"},"/docs/using-qovery/configuration/database/mongodb":{"component":"17896441","content":"9ddfc3dc"},"/docs/using-qovery/configuration/database/mysql":{"component":"17896441","content":"accdb2b4"},"/docs/using-qovery/configuration/database/postgresql":{"component":"17896441","content":"baf9cc25"},"/docs/using-qovery/configuration/database/redis":{"component":"17896441","content":"c536ba8c"},"/docs/using-qovery/configuration/deployment-rule":{"component":"17896441","content":"db96bb7d"},"/docs/using-qovery/configuration/environment":{"component":"17896441","content":"a4a09dfe"},"/docs/using-qovery/configuration/environment-variable":{"component":"17896441","content":"07c2f310"},"/docs/using-qovery/configuration/helm":{"component":"17896441","content":"02ec211a"},"/docs/using-qovery/configuration/lifecycle-job":{"component":"17896441","content":"16557ade"},"/docs/using-qovery/configuration/object-storage":{"component":"17896441","content":"9d3c5a68"},"/docs/using-qovery/configuration/organization":{"component":"17896441","content":"ff91a867"},"/docs/using-qovery/configuration/organization/api-token":{"component":"17896441","content":"1d187ae3"},"/docs/using-qovery/configuration/organization/container-registry":{"component":"17896441","content":"6b0e113a"},"/docs/using-qovery/configuration/organization/git-repository-access":{"component":"17896441","content":"9406f053"},"/docs/using-qovery/configuration/organization/helm-repository":{"component":"17896441","content":"2737c3be"},"/docs/using-qovery/configuration/organization/members-rbac":{"component":"17896441","content":"b2880863"},"/docs/using-qovery/configuration/project":{"component":"17896441","content":"bd10520b"},"/docs/using-qovery/configuration/provider":{"component":"17896441","content":"89de14d0"},"/docs/using-qovery/configuration/provider/kubernetes":{"component":"17896441","content":"30e307eb"},"/docs/using-qovery/configuration/service-health-checks":{"component":"17896441","content":"073aa0b0"},"/docs/using-qovery/configuration/user-account":{"component":"17896441","content":"376f4c3b"},"/docs/using-qovery/deployment":{"component":"17896441","content":"8ca6d3cf"},"/docs/using-qovery/deployment/deploying-with-auto-deploy":{"component":"17896441","content":"39686ad9"},"/docs/using-qovery/deployment/deploying-with-ci-cd":{"component":"17896441","content":"36b4c04d"},"/docs/using-qovery/deployment/deployment-actions":{"component":"17896441","content":"8ae34d0a"},"/docs/using-qovery/deployment/deployment-history":{"component":"17896441","content":"47a329cb"},"/docs/using-qovery/deployment/deployment-pipeline":{"component":"17896441","content":"55ef6d6a"},"/docs/using-qovery/deployment/deployment-strategies":{"component":"17896441","content":"b79e7411"},"/docs/using-qovery/deployment/image-mirroring":{"component":"17896441","content":"6308ca27"},"/docs/using-qovery/deployment/logs":{"component":"17896441","content":"6ebd4d49"},"/docs/using-qovery/deployment/running-and-deployment-statuses":{"component":"17896441","content":"e3c664e0"},"/docs/using-qovery/integration":{"component":"17896441","content":"8d1c77c1"},"/docs/using-qovery/integration/api-integration":{"component":"17896441","content":"d28d5470"},"/docs/using-qovery/integration/container-registry":{"component":"17896441","content":"7f79072b"},"/docs/using-qovery/integration/continuous-integration":{"component":"17896441","content":"1772e35f"},"/docs/using-qovery/integration/continuous-integration/circle-ci":{"component":"17896441","content":"1aa86e56"},"/docs/using-qovery/integration/continuous-integration/github-actions":{"component":"17896441","content":"3a11bd48"},"/docs/using-qovery/integration/continuous-integration/gitlab-ci":{"component":"17896441","content":"120e882c"},"/docs/using-qovery/integration/continuous-integration/jenkins":{"component":"17896441","content":"4dcdbf34"},"/docs/using-qovery/integration/git-repository":{"component":"17896441","content":"2a88660b"},"/docs/using-qovery/integration/helm-repository":{"component":"17896441","content":"8bd1b610"},"/docs/using-qovery/integration/monitoring":{"component":"17896441","content":"592d28ca"},"/docs/using-qovery/integration/monitoring/datadog":{"component":"17896441","content":"d471c358"},"/docs/using-qovery/integration/monitoring/new-relic":{"component":"17896441","content":"e1e0a511"},"/docs/using-qovery/integration/secret-manager":{"component":"17896441","content":"888595cd"},"/docs/using-qovery/integration/secret-manager/aws-secrets-manager":{"component":"17896441","content":"dab3a2be"},"/docs/using-qovery/integration/secret-manager/doppler":{"component":"17896441","content":"5e60e078"},"/docs/using-qovery/integration/slack":{"component":"17896441","content":"40a919e7"},"/docs/using-qovery/integration/terraform":{"component":"17896441","content":"deef6d59"},"/docs/using-qovery/integration/webhook":{"component":"17896441","content":"7df50433"},"/docs/using-qovery/interface":{"component":"17896441","content":"3a03b8f9"},"/docs/using-qovery/interface/cli":{"component":"17896441","content":"d9a4c8ef"},"/docs/using-qovery/interface/rest-api":{"component":"17896441","content":"c3f02c14"},"/docs/using-qovery/interface/terraform-interface":{"component":"17896441","content":"f0f90e68"},"/docs/using-qovery/interface/web-interface":{"component":"17896441","content":"58379094"},"/docs/using-qovery/maintenance":{"component":"17896441","content":"ac2c90fd"},"/docs/using-qovery/troubleshoot":{"component":"17896441","content":"b4dda200"},"/docs/using-qovery/troubleshoot/application-troubleshoot":{"component":"17896441","content":"fcd9bd5b"},"/docs/using-qovery/troubleshoot/cluster-troubleshoot":{"component":"17896441","content":"3cfde410"},"/docs/using-qovery/troubleshoot/database-troubleshoot":{"component":"17896441","content":"10ff7003"},"/docs/using-qovery/troubleshoot/lifecycle-troubleshoot":{"component":"17896441","content":"ca4f5154"}}')},function(e,t,n){var o,r;void 0===(r="function"==typeof(o=function(){var e,t,n={version:"0.2.0"},o=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'

      '};function r(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(o[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=r(e,o.minimum,1),n.status=1===e?null:e;var l=n.render(!t),s=l.querySelector(o.barSelector),c=o.speed,d=o.easing;return l.offsetWidth,a((function(t){""===o.positionUsing&&(o.positionUsing=n.getPositioningCSS()),u(s,function(e,t,n){var r;return(r="translate3d"===o.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===o.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,r}(e,c,d)),1===e?(u(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){u(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),o.trickleSpeed)};return o.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*r(Math.random()*t,.1,.95)),t=r(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*o.trickleRate)},e=0,t=0,n.promise=function(o){return o&&"resolved"!==o.state()?(0===t&&n.start(),e++,t++,o.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");s(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=o.template;var r,a=t.querySelector(o.barSelector),l=e?"-100":i(n.status||0),c=document.querySelector(o.parent);return u(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),o.showSpinner||(r=t.querySelector(o.spinnerSelector))&&p(r),c!=document.body&&s(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(o.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var a=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),u=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var o,r=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);r--;)if((o=e[r]+i)in n)return o;return t}(n))}function o(e,t,o){t=n(t),e.style[t]=o}return function(e,t){var n,r,i=arguments;if(2==i.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,i[1],i[2])}}();function l(e,t){return("string"==typeof e?e:d(e)).indexOf(" "+t+" ")>=0}function s(e,t){var n=d(e),o=n+t;l(n,t)||(e.className=o.substring(1))}function c(e,t){var n,o=d(e);l(e,t)&&(n=o.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?o.call(t,n,t,e):o)||(e.exports=r)},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return w}));var o=n(3);n.d(t,"c",(function(){return o.a})),n.d(t,"d",(function(){return o.f})),n.d(t,"e",(function(){return o.g})),n.d(t,"f",(function(){return o.h}));var r=n(6),i=n(0),a=n.n(i),u=n(7),l=(n(15),n(1)),s=n(9),c=n(4),d=function(e){function t(){for(var t,n=arguments.length,o=new Array(n),r=0;r1&&u.call(o[0],n,(function(){for(r=1;re.length)return;if(!(k instanceof l)){if(m&&y!=t.length-1){if(p.lastIndex=w,!(P=p.exec(e)))break;for(var x=P.index+(g?P[1].length:0),E=P.index+P[0].length,_=y,S=w,T=t.length;_=(S+=t[_].length)&&(++y,w=S);if(t[y]instanceof l)continue;C=_-y,k=e.slice(w,S),P.index-=w}else{p.lastIndex=0;var P=p.exec(k),C=1}if(P){g&&(h=P[1]?P[1].length:0),E=(x=P.index+h)+(P=P[0].slice(h)).length;var O=k.slice(0,x),A=k.slice(E),q=[y,C];O&&(++y,w+=O.length,q.push(O));var R=new l(s,f?r.tokenize(P,f):P,b,P,m);if(q.push(R),A&&q.push(A),Array.prototype.splice.apply(t,q),1!=C&&r.matchGrammar(e,t,n,y,w,!0,s),a)break}else if(a)break}}}}},hooks:{add:function(){}},tokenize:function(e,t,n){var o=[e],i=t.rest;if(i){for(var a in i)t[a]=i[a];delete t.rest}return r.matchGrammar(e,o,t,0,0,!1),o}},(i=r.Token=function(e,t,n,o,r){this.type=e,this.content=t,this.alias=n,this.length=0|(o||"").length,this.greedy=!!r}).stringify=function(e,t,n){if("string"==typeof e)return e;if("Array"===r.util.type(e))return e.map((function(n){return i.stringify(n,t,e)})).join("");var o={type:e.type,content:i.stringify(e.content,t,n),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:n};if(e.alias){var a="Array"===r.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(o.classes,a)}var u=Object.keys(o.attributes).map((function(e){return e+'="'+(o.attributes[e]||"").replace(/"/g,""")+'"'})).join(" ");return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+(u?" "+u:"")+">"+o.content+""},r);a.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:n}};o["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:o},a.languages.insertBefore("markup","cdata",r)}}),a.languages.xml=a.languages.extend("markup",{}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],r=n.variable[1].inside,i=0;i=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{"class-name":{pattern:/(\b(?:enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),a.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete a.languages.c.boolean,a.languages.cpp=a.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),a.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(a),a.languages.css.selector={pattern:a.languages.css.selector,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-:.\w]+/,id:/#[-:.\w]+/,attribute:{pattern:/\[(?:[^[\]"']|("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1)*\]/,greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)[-*\w\xA0-\uFFFF]*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},attribute:{pattern:/^(\s*)[-\w\xA0-\uFFFF]+/,lookbehind:!0},value:[/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,{pattern:/(=\s*)[-\w\xA0-\uFFFF]+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],punctuation:/[()]/}},a.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*/i,lookbehind:!0}}),a.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:/#[\da-f]{3,8}/i,entity:/\\[\da-f]{1,8}/i,unit:{pattern:/(\d)(?:%|[a-z]+)/,lookbehind:!0},number:/-?[\d.]+/}),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}}}),a.languages.markup&&a.languages.markup.tag.addInlined("script","javascript"),a.languages.js=a.languages.javascript,function(e){var t=e.util.clone(e.languages.javascript);e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=/<\/?(?:[\w.:-]+\s*(?:\s+(?:[\w.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s{'">=]+|\{(?:\{(?:\{[^}]*\}|[^{}])*\}|[^{}])+\}))?|\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}))*\s*\/?)?>/i,e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}/,inside:{punctuation:/\.{3}|[{}.]/,"attr-value":/\w+/}}},e.languages.jsx.tag),e.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{(?:\{[^}]*\}|[^}])*\}|[^}])+\})/i,inside:{"script-punctuation":{pattern:/^=(?={)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag);var n=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(n).join(""):""},o=function(t){for(var r=[],i=0;i0&&r[r.length-1].tagName===n(a.content[0].content[1])&&r.pop():"/>"===a.content[a.content.length-1].content||r.push({tagName:n(a.content[0].content[1]),openedBraces:0}):r.length>0&&"punctuation"===a.type&&"{"===a.content?r[r.length-1].openedBraces++:r.length>0&&r[r.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?r[r.length-1].openedBraces--:u=!0),(u||"string"==typeof a)&&r.length>0&&0===r[r.length-1].openedBraces){var l=n(a);i0&&("string"==typeof t[i-1]||"plain-text"===t[i-1].type)&&(l=n(t[i-1])+l,t.splice(i-1,1),i--),t[i]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&o(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||o(e.tokens)}))}(a),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){"string"==typeof t&&(t=[t]),t.forEach((function(t){!function(t,n){var o=e.languages[t];if(o){var r=o["doc-comment"];if(!r){var i={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,alias:"comment"}};r=(o=e.languages.insertBefore(t,"comment",i))["doc-comment"]}if(r instanceof RegExp&&(r=o["doc-comment"]={pattern:r}),Array.isArray(r))for(var a=0,u=r.length;a>>?=?|->|([-+&|])\2|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":n,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(a),function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,o,r,i){if(n.language===o){var a=n.tokenStack=[];n.code=n.code.replace(r,(function(e){if("function"==typeof i&&!i(e))return e;for(var r,u=a.length;-1!==n.code.indexOf(r=t(o,u));)++u;return a[u]=e,r})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,o){if(n.language===o&&n.tokenStack){n.grammar=e.languages[o];var r=0,i=Object.keys(n.tokenStack);!function a(u){for(var l=0;l=i.length);l++){var s=u[l];if("string"==typeof s||s.content&&"string"==typeof s.content){var c=i[r],d=n.tokenStack[c],p="string"==typeof s?s:s.content,f=t(o,c),g=p.indexOf(f);if(g>-1){++r;var m=p.substring(0,g),h=new e.Token(o,e.tokenize(d,n.grammar),"language-"+o,d),b=p.substring(g+f.length),v=[];m&&v.push.apply(v,a([m])),v.push(h),b&&v.push.apply(v,a([b])),"string"==typeof s?u.splice.apply(u,[l,1].concat(v)):s.content=v}}else s.content&&a(s.content)}return u}(n.tokens)}}}})}(a),function(e){e.languages.php=e.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,boolean:{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),e.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),e.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),e.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var t={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:t}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:t}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(a),function(e){var t=e.languages.javascript,n=/{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})+}/.source,o="(@(?:param|arg|argument|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(o+/[$\w\xA0-\uFFFF.]+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(o+/\[[$\w\xA0-\uFFFF.]+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{punctuation:/[.,:?=<>|{}()[\]]/}},{pattern:/(@(?:augments|extends|class|interface|memberof!?|this)\s+)[A-Z]\w*(?:\.[A-Z]\w*)*/,lookbehind:!0,inside:{punctuation:/\./}}],example:{pattern:/(@example\s+)[^@]+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^(\s*(?:\*\s*)?).+$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(a),a.languages.actionscript=a.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),a.languages.actionscript["class-name"].alias="function",a.languages.markup&&a.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:a.languages.markup}}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},rest:e.languages.javascript}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:/(\.\s*)#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*/,lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],n=0;n))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:type|opaque|declare|Class)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:await|Diff|Exact|Keys|ObjMap|PropertyType|Shape|Record|Supertype|Subtype|Enum)\b(?!\$)/,lookbehind:!0})}(a),a.languages.n4js=a.languages.extend("javascript",{keyword:/\b(?:any|Array|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),a.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),a.languages.n4jsd=a.languages.n4js,a.languages.typescript=a.languages.extend("javascript",{keyword:/\b(?:abstract|as|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),a.languages.ts=a.languages.typescript,function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,o=t.inside.interpolation,r=o.inside["interpolation-punctuation"],i=o.pattern.source;function a(t,o){if(e.languages[t])return{pattern:RegExp("((?:"+o+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function u(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,o){var r={code:t,grammar:n,language:o};return e.hooks.run("before-tokenize",r),r.tokens=e.tokenize(r.code,r.grammar),e.hooks.run("after-tokenize",r),r.tokens}function s(t){var n={};n["interpolation-punctuation"]=r;var i=e.tokenize(t,n);if(3===i.length){var a=[1,1];a.push.apply(a,l(i[1],e.languages.javascript,"javascript")),i.splice.apply(i,a)}return new e.Token("interpolation",i,o.alias,t)}function c(t,n,o){var r=e.tokenize(t,{interpolation:{pattern:RegExp(i),lookbehind:!0}}),a=0,c={},d=l(r.map((function(e){if("string"==typeof e)return e;for(var n,r=e.content;-1!==t.indexOf(n=u(a++,o)););return c[n]=r,n})).join(""),n,o),p=Object.keys(c);return a=0,function e(t){for(var n=0;n=p.length)return;var o=t[n];if("string"==typeof o||"string"==typeof o.content){var r=p[a],i="string"==typeof o?o:o.content,u=i.indexOf(r);if(-1!==u){++a;var l=i.substring(0,u),d=s(c[r]),f=i.substring(u+r.length),g=[];if(l&&g.push(l),g.push(d),f){var m=[f];e(m),g.push.apply(g,m)}"string"==typeof o?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):o.content=g}}else{var h=o.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(o,d,"language-"+o,t)}e.languages.javascript["template-string"]=[a("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),a("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),a("svg",/\bsvg/.source),a("markdown",/\b(?:md|markdown)/.source),a("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var o=0,r=n.length;o/g,t),n&&(e=e+"|"+e.replace(/_/g,"\\*")),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var o=/(?:\\.|``.+?``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\r?\n|\r)|$)/.source.replace(/__/g,o),i=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\r?\n|\r)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+i+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+i+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(o),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(o),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/(^[ \t]*(?:\r?\n|\r))(?: {4}|\t).+(?:(?:\r?\n|\r)(?: {4}|\t).+)*/m,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\r?\n|\r))[\s\S]+?(?=(?:\r?\n|\r)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\r?\n|\r)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/__(?:(?!_)|_(?:(?!_))+_)+__/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/_(?:(?!_)|__(?:(?!_))+__)+_/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+?\2/.source,!1),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[(?:(?!\]))+\])/.source,!1),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,o=t.length;n",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var o=t[n],r=[];/^\w+$/.test(n)||r.push(/\w+/.exec(n)[0]),"diff"===n&&r.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+o+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete a.languages.go["class-name"],function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/i,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:true|false)\b/,block:{pattern:/^(\s*~?\s*)[#\/]\S+?(?=\s*~?\s*$|\s)/i,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")}))}(a),a.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-]+?(?:\([^{}]+\)|[^(){};])*?(?=\s*\{)/i,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\([^{}]*\)|[^{};@])*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-]+.*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{keyword:/\b(?:asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,string:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*\.?[\d_]*(?:e[+-]?[\d_]+)?)/i,type:{pattern:/\B['`]\w*/,alias:"variable"},directive:{pattern:/\B#\w+/,alias:"function"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|prefix|private|rec|then|sig|struct|to|try|type|val|value|virtual|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lxor|lsl|lsr|mod|nor|or)\b/,punctuation:/[(){}\[\]|_.,:;]/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/i,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{comment:{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),a.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t={url:/url\((["']?).*?\1\)/i,string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s+|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,number:/\b\d+(?:\.\d+)?%?/,boolean:/\b(?:true|false)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.+|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^{|}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={comment:{pattern:/(^|[^\\])(\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},"atrule-declaration":{pattern:/(^\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:(?:\{[^}]*\}|.+)|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t]+.+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)[^{\r\n]*(?:;|[^{\r\n,](?=$)(?!(\r?\n|\r)(?:\{|\2[ \t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t]+)))/m,lookbehind:!0,inside:{interpolation:t.interpolation,punctuation:/[{},]/}},func:t.func,string:t.string,interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(a);var u=a.util.clone(a.languages.typescript);a.languages.tsx=a.languages.extend("jsx",u),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^_`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/},a.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},a.languages.yml=a.languages.yaml,t.a=a},function(e,t,n){var o=n(23);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==o(e)?e.split(""):Object(e)}},function(e,t,n){"use strict";var o=n(36),r=RegExp.prototype.exec;e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==o(e))throw new TypeError("RegExp#exec called on incompatible receiver");return r.call(e,t)}},function(e,t,n){"use strict";n(103);var o=n(16),r=n(11),i=n(14),a=n(34),u=n(2),l=n(45),s=u("species"),c=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),d=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var p=u(e),f=!i((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),g=f?!i((function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[s]=function(){return n}),n[p](""),!t})):void 0;if(!f||!g||"replace"===e&&!c||"split"===e&&!d){var m=/./[p],h=n(a,p,""[e],(function(e,t,n,o,r){return t.exec===l?f&&!r?{done:!0,value:m.call(t,n,o)}:{done:!0,value:e.call(n,t,o)}:{done:!1}})),b=h[0],v=h[1];o(String.prototype,e,b),r(RegExp.prototype,p,2==t?function(e,t){return v.call(e,this,t)}:function(e){return v.call(e,this)})}}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var o,r,i,a,u=n(44),l=n(5),s=n(30),c=n(36),d=n(12),p=n(13),f=n(32),g=n(80),m=n(81),h=n(63),b=n(70).set,v=n(122)(),y=n(71),w=n(123),k=n(124),x=n(125),E=l.TypeError,_=l.process,S=_&&_.versions,T=S&&S.v8||"",P=l.Promise,C="process"==c(_),O=function(){},A=r=y.f,q=!!function(){try{var e=P.resolve(1),t=(e.constructor={})[n(2)("species")]=function(e){e(O,O)};return(C||"function"==typeof PromiseRejectionEvent)&&e.then(O)instanceof t&&0!==T.indexOf("6.6")&&-1===k.indexOf("Chrome/66")}catch(o){}}(),R=function(e){var t;return!(!p(e)||"function"!=typeof(t=e.then))&&t},N=function(e,t){if(!e._n){e._n=!0;var n=e._c;v((function(){for(var o=e._v,r=1==e._s,i=0,a=function(t){var n,i,a,u=r?t.ok:t.fail,l=t.resolve,s=t.reject,c=t.domain;try{u?(r||(2==e._h&&j(e),e._h=1),!0===u?n=o:(c&&c.enter(),n=u(o),c&&(c.exit(),a=!0)),n===t.promise?s(E("Promise-chain cycle")):(i=R(n))?i.call(n,l,s):l(n)):s(o)}catch(d){c&&!a&&c.exit(),s(d)}};n.length>i;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&I(e)}))}},I=function(e){b.call(l,(function(){var t,n,o,r=e._v,i=z(e);if(i&&(t=w((function(){C?_.emit("unhandledRejection",r,e):(n=l.onunhandledrejection)?n({promise:e,reason:r}):(o=l.console)&&o.error&&o.error("Unhandled promise rejection",r)})),e._h=C||z(e)?2:1),e._a=void 0,i&&t.e)throw t.v}))},z=function(e){return 1!==e._h&&0===(e._a||e._c).length},j=function(e){b.call(l,(function(){var t;C?_.emit("rejectionHandled",e):(t=l.onrejectionhandled)&&t({promise:e,reason:e._v})}))},L=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),N(t,!0))},F=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw E("Promise can't be resolved itself");(t=R(e))?v((function(){var o={_w:n,_d:!1};try{t.call(e,s(F,o,1),s(L,o,1))}catch(r){L.call(o,r)}})):(n._v=e,n._s=1,N(n,!1))}catch(o){L.call({_w:n,_d:!1},o)}}};q||(P=function(e){g(this,P,"Promise","_h"),f(e),o.call(this);try{e(s(F,this,1),s(L,this,1))}catch(t){L.call(this,t)}},(o=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(82)(P.prototype,{then:function(e,t){var n=A(h(this,P));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=C?_.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&N(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new o;this.promise=e,this.resolve=s(F,e,1),this.reject=s(L,e,1)},y.f=A=function(e){return e===P||e===a?new i(e):r(e)}),d(d.G+d.W+d.F*!q,{Promise:P}),n(41)(P,"Promise"),n(94)("Promise"),a=n(17).Promise,d(d.S+d.F*!q,"Promise",{reject:function(e){var t=A(this);return(0,t.reject)(e),t.promise}}),d(d.S+d.F*(u||!q),"Promise",{resolve:function(e){return x(u&&this===a?P:this,e)}}),d(d.S+d.F*!(q&&n(83)((function(e){P.all(e).catch(O)}))),"Promise",{all:function(e){var t=this,n=A(t),o=n.resolve,r=n.reject,i=w((function(){var n=[],i=0,a=1;m(e,!1,(function(e){var u=i++,l=!1;n.push(void 0),a++,t.resolve(e).then((function(e){l||(l=!0,n[u]=e,--a||o(n))}),r)})),--a||o(n)}));return i.e&&r(i.v),n.promise},race:function(e){var t=this,n=A(t),o=n.reject,r=w((function(){m(e,!1,(function(e){t.resolve(e).then(n.resolve,o)}))}));return r.e&&o(r.v),n.promise}})},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(99)},function(e,t,n){"use strict";var o=n(64)(!0);e.exports=function(e,t,n){return t+(n?o(e,t).length:1)}},function(e,t,n){"use strict";var o=n(44),r=n(12),i=n(16),a=n(11),u=n(24),l=n(105),s=n(41),c=n(108),d=n(2)("iterator"),p=!([].keys&&"next"in[].keys()),f=function(){return this};e.exports=function(e,t,n,g,m,h,b){l(n,t,g);var v,y,w,k=function(e){if(!p&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",E="values"==m,_=!1,S=e.prototype,T=S[d]||S["@@iterator"]||m&&S[m],P=T||k(m),C=m?E?k("entries"):P:void 0,O="Array"==t&&S.entries||T;if(O&&(w=c(O.call(new e)))!==Object.prototype&&w.next&&(s(w,x,!0),o||"function"==typeof w[d]||a(w,d,f)),E&&T&&"values"!==T.name&&(_=!0,P=function(){return T.call(this)}),o&&!b||!p&&!_&&S[d]||a(S,d,P),u[t]=P,u[x]=f,m)if(v={values:E?P:k("values"),keys:h?P:k("keys"),entries:C},b)for(y in v)y in S||i(S,y,v[y]);else r(r.P+r.F*(p||_),t,v);return v}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var o=n(8),r=n(32),i=n(2)("species");e.exports=function(e,t){var n,a=o(e).constructor;return void 0===a||null==(n=o(a)[i])?t:r(n)}},function(e,t,n){var o=n(35),r=n(34);e.exports=function(e){return function(t,n){var i,a,u=String(r(t)),l=o(n),s=u.length;return l<0||l>=s?e?"":void 0:(i=u.charCodeAt(l))<55296||i>56319||l+1===s||(a=u.charCodeAt(l+1))<56320||a>57343?e?u.charAt(l):i:e?u.slice(l,l+2):a-56320+(i-55296<<10)+65536}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var o=n(5).document;e.exports=o&&o.documentElement},function(e,t,n){"use strict";var o=n(19);t.a=o.b},function(e,t,n){"use strict";e.exports=n(113)},function(e,t,n){"use strict";var o=n(0),r=n.n(o);t.a=r.a.createContext({})},function(e,t,n){var o,r,i,a=n(30),u=n(121),l=n(66),s=n(46),c=n(5),d=c.process,p=c.setImmediate,f=c.clearImmediate,g=c.MessageChannel,m=c.Dispatch,h=0,b={},v=function(){var e=+this;if(b.hasOwnProperty(e)){var t=b[e];delete b[e],t()}},y=function(e){v.call(e.data)};p&&f||(p=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return b[++h]=function(){u("function"==typeof e?e:Function(e),t)},o(h),h},f=function(e){delete b[e]},"process"==n(23)(d)?o=function(e){d.nextTick(a(v,e,1))}:m&&m.now?o=function(e){m.now(a(v,e,1))}:g?(i=(r=new g).port2,r.port1.onmessage=y,o=a(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(o=function(e){c.postMessage(e+"","*")},c.addEventListener("message",y,!1)):o="onreadystatechange"in s("script")?function(e){l.appendChild(s("script")).onreadystatechange=function(){l.removeChild(this),v.call(e)}}:function(e){setTimeout(a(v,e,1),0)}),e.exports={set:p,clear:f}},function(e,t,n){"use strict";var o=n(32);function r(e){var t,n;this.promise=new e((function(e,o){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=o})),this.resolve=o(t),this.reject=o(n)}e.exports.f=function(e){return new r(e)}},function(e,t,n){"use strict";(function(t){var n="__global_unique_id__";e.exports=function(){return t[n]=(t[n]||0)+1}}).call(this,n(76))},function(e,t,n){"use strict";var o=n(68),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function l(e){return o.isMemo(e)?a:u[e.$$typeof]||r}u[o.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[o.Memo]=a;var s=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,o){if("string"!=typeof n){if(g){var r=f(n);r&&r!==g&&e(t,r,o)}var a=c(n);d&&(a=a.concat(d(n)));for(var u=l(t),m=l(n),h=0;h]*>)/g,f=/\$([$&`']|\d\d?)/g;n(56)("replace",2,(function(e,t,n,g){return[function(o,r){var i=e(this),a=null==o?void 0:o[t];return void 0!==a?a.call(o,i,r):n.call(String(i),o,r)},function(e,t){var r=g(n,e,this,t);if(r.done)return r.value;var d=o(e),p=String(this),f="function"==typeof t;f||(t=String(t));var h=d.global;if(h){var b=d.unicode;d.lastIndex=0}for(var v=[];;){var y=l(d,p);if(null===y)break;if(v.push(y),!h)break;""===String(y[0])&&(d.lastIndex=u(p,i(d.lastIndex),b))}for(var w,k="",x=0,E=0;E=x&&(k+=p.slice(x,S)+A,x=S+_.length)}return k+p.slice(x)}];function m(e,t,o,i,a,u){var l=o+e.length,s=i.length,c=f;return void 0!==a&&(a=r(a),c=p),n.call(u,c,(function(n,r){var u;switch(r.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,o);case"'":return t.slice(l);case"<":u=a[r.slice(1,-1)];break;default:var c=+r;if(0===c)return n;if(c>s){var p=d(c/10);return 0===p?n:p<=s?void 0===i[p-1]?r.charAt(1):i[p-1]+r.charAt(1):n}u=i[c-1]}return void 0===u?"":u}))}}))},function(e,t,n){"use strict";var o=n(95),r=n(8),i=n(63),a=n(60),u=n(26),l=n(55),s=n(45),c=n(14),d=Math.min,p=[].push,f="length",g=!c((function(){RegExp(4294967295,"y")}));n(56)("split",2,(function(e,t,n,c){var m;return m="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[f]||2!="ab".split(/(?:ab)*/)[f]||4!=".".split(/(.?)(.?)/)[f]||".".split(/()()/)[f]>1||"".split(/.?/)[f]?function(e,t){var r=String(this);if(void 0===e&&0===t)return[];if(!o(e))return n.call(r,e,t);for(var i,a,u,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),d=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,c+"g");(i=s.call(m,r))&&!((a=m.lastIndex)>d&&(l.push(r.slice(d,i.index)),i[f]>1&&i.index=g));)m.lastIndex===i.index&&m.lastIndex++;return d===r[f]?!u&&m.test("")||l.push(""):l.push(r.slice(d)),l[f]>g?l.slice(0,g):l}:"0".split(void 0,0)[f]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,o){var r=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,r,o):m.call(String(r),n,o)},function(e,t){var o=c(m,e,this,t,m!==n);if(o.done)return o.value;var s=r(e),p=String(this),f=i(s,RegExp),h=s.unicode,b=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(g?"y":"g"),v=new f(g?s:"^(?:"+s.source+")",b),y=void 0===t?4294967295:t>>>0;if(0===y)return[];if(0===p.length)return null===l(v,p)?[p]:[];for(var w=0,k=0,x=[];k=t.length?{value:void 0,done:!0}:(e=o(t,n),this._i+=e.length,{value:e,done:!1})}))},function(e,t){e.exports=function(e,t,n,o){if(!(e instanceof t)||void 0!==o&&o in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){var o=n(30),r=n(91),i=n(92),a=n(8),u=n(26),l=n(93),s={},c={};(t=e.exports=function(e,t,n,d,p){var f,g,m,h,b=p?function(){return e}:l(e),v=o(n,d,t?2:1),y=0;if("function"!=typeof b)throw TypeError(e+" is not iterable!");if(i(b)){for(f=u(e.length);f>y;y++)if((h=t?v(a(g=e[y])[0],g[1]):v(e[y]))===s||h===c)return h}else for(m=b.call(e);!(g=m.next()).done;)if((h=r(m,v,g.value,t))===s||h===c)return h}).BREAK=s,t.RETURN=c},function(e,t,n){var o=n(16);e.exports=function(e,t,n){for(var r in t)o(e,r,t[r],n);return e}},function(e,t,n){var o=n(2)("iterator"),r=!1;try{var i=[7][o]();i.return=function(){r=!0},Array.from(i,(function(){throw 2}))}catch(a){}e.exports=function(e,t){if(!t&&!r)return!1;var n=!1;try{var i=[7],u=i[o]();u.next=function(){return{done:n=!0}},i[o]=function(){return u},e(i)}catch(a){}return n}},function(e,t,n){var o=n(12);o(o.S+o.F,"Object",{assign:n(126)})},function(e,t,n){var o=n(12),r=n(129)(!1);o(o.S,"Object",{values:function(e){return r(e)}})},function(e,t,n){e.exports=!n(10)&&!n(14)((function(){return 7!=Object.defineProperty(n(46)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){var o=n(13);e.exports=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){var o=n(8),r=n(106),i=n(65),a=n(47)("IE_PROTO"),u=function(){},l=function(){var e,t=n(46)("iframe"),o=i.length;for(t.style.display="none",n(66).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("