From 160424c052b2d594823600c473bcb09d46b188c8 Mon Sep 17 00:00:00 2001 From: ravisuhag Date: Thu, 18 Jul 2024 03:15:11 +0000 Subject: [PATCH] Deploy website - based on 3e5bc0aa1762ae2b1540a953ec822ab4ba052f2b --- 404.html | 10 +++++----- assets/css/styles.4f2077d4.css | 1 - assets/css/styles.9e2d6806.css | 1 + assets/js/010df87a.2ea3a143.js | 1 - assets/js/010df87a.51dd0c94.js | 1 + assets/js/03be7dae.20ba7227.js | 1 - assets/js/03be7dae.333685c4.js | 1 + assets/js/0dffb83e.0b9a3148.js | 1 - assets/js/0dffb83e.5a4e105c.js | 1 + assets/js/1425879c.4c1a0589.js | 1 + assets/js/1425879c.b1efae2f.js | 1 - assets/js/17896441.0e6dd5ea.js | 1 - assets/js/17896441.bb502102.js | 1 + assets/js/1be78505.82e067b7.js | 1 - assets/js/1be78505.888097e5.js | 1 + assets/js/338d3fa8.055812d0.js | 1 - assets/js/338d3fa8.ec9de5f8.js | 1 + assets/js/3585ba8f.2a60ee12.js | 1 - assets/js/3585ba8f.467414d2.js | 1 + assets/js/553.217c3e29.js | 1 + assets/js/58175526.77dae5db.js | 1 - assets/js/58175526.7fd1ba94.js | 1 + assets/js/774.5bdaf5ba.js | 1 + assets/js/7de6ea50.0ccc31f4.js | 1 + assets/js/7de6ea50.7dfb24c3.js | 1 - assets/js/7ff2cdfe.11388b0e.js | 1 + assets/js/7ff2cdfe.60ecf897.js | 1 - assets/js/8070e160.6c0f6636.js | 1 + assets/js/8070e160.f765828c.js | 1 - assets/js/8a1416ba.19537c66.js | 1 + assets/js/8a1416ba.ac09958b.js | 1 - assets/js/935f2afb.01815371.js | 1 + assets/js/935f2afb.8601da9a.js | 1 - assets/js/972.7d6af76f.js | 1 - assets/js/a09c2993.e261a802.js | 1 + assets/js/a09c2993.f32be3e9.js | 1 - assets/js/c5e4a08a.5a0c4a86.js | 1 + assets/js/c5e4a08a.7f8ec798.js | 1 - assets/js/caaf7770.1f2988c7.js | 1 + assets/js/caaf7770.85207c38.js | 1 - assets/js/d9e16301.16abe1ad.js | 1 + assets/js/d9e16301.fae6ae96.js | 1 - assets/js/f3275a05.0ac1d642.js | 1 + assets/js/f3275a05.a35654d9.js | 1 - assets/js/fadecd94.40fd13e7.js | 1 - assets/js/fadecd94.e09f5515.js | 1 + assets/js/fc49bffc.f6068783.js | 1 + assets/js/fc49bffc.fbdb3aa2.js | 1 - assets/js/main.3588fb71.js | 2 ++ ...js.LICENSE.txt => main.3588fb71.js.LICENSE.txt} | 0 assets/js/main.6c7acd83.js | 2 -- assets/js/runtime~main.585d3520.js | 1 + assets/js/runtime~main.e2e12cec.js | 1 - concepts/architecture/index.html | 12 ++++++------ concepts/structure/index.html | 13 +++++++------ contribute/contribution/index.html | 12 ++++++------ contribute/development/index.html | 12 ++++++------ contribute/release/index.html | 12 ++++++------ guides/deployment/index.html | 13 +++++++------ guides/monitoring/index.html | 13 +++++++------ guides/overview/index.html | 12 ++++++------ guides/publishing/index.html | 12 ++++++------ guides/troubleshooting/index.html | 12 ++++++------ index.html | 12 ++++++------ quickstart/index.html | 12 ++++++------ reference/benchmarks/index.html | 12 ++++++------ reference/configurations/index.html | 14 +++++++------- reference/metrics/index.html | 12 ++++++------ roadmap/index.html | 12 ++++++------ support/index.html | 12 ++++++------ 70 files changed, 138 insertions(+), 134 deletions(-) delete mode 100644 assets/css/styles.4f2077d4.css create mode 100644 assets/css/styles.9e2d6806.css delete mode 100644 assets/js/010df87a.2ea3a143.js create mode 100644 assets/js/010df87a.51dd0c94.js delete mode 100644 assets/js/03be7dae.20ba7227.js create mode 100644 assets/js/03be7dae.333685c4.js delete mode 100644 assets/js/0dffb83e.0b9a3148.js create mode 100644 assets/js/0dffb83e.5a4e105c.js create mode 100644 assets/js/1425879c.4c1a0589.js delete mode 100644 assets/js/1425879c.b1efae2f.js delete mode 100644 assets/js/17896441.0e6dd5ea.js create mode 100644 assets/js/17896441.bb502102.js delete mode 100644 assets/js/1be78505.82e067b7.js create mode 100644 assets/js/1be78505.888097e5.js delete mode 100644 assets/js/338d3fa8.055812d0.js create mode 100644 assets/js/338d3fa8.ec9de5f8.js delete mode 100644 assets/js/3585ba8f.2a60ee12.js create mode 100644 assets/js/3585ba8f.467414d2.js create mode 100644 assets/js/553.217c3e29.js delete mode 100644 assets/js/58175526.77dae5db.js create mode 100644 assets/js/58175526.7fd1ba94.js create mode 100644 assets/js/774.5bdaf5ba.js create mode 100644 assets/js/7de6ea50.0ccc31f4.js delete mode 100644 assets/js/7de6ea50.7dfb24c3.js create mode 100644 assets/js/7ff2cdfe.11388b0e.js delete mode 100644 assets/js/7ff2cdfe.60ecf897.js create mode 100644 assets/js/8070e160.6c0f6636.js delete mode 100644 assets/js/8070e160.f765828c.js create mode 100644 assets/js/8a1416ba.19537c66.js delete mode 100644 assets/js/8a1416ba.ac09958b.js create mode 100644 assets/js/935f2afb.01815371.js delete mode 100644 assets/js/935f2afb.8601da9a.js delete mode 100644 assets/js/972.7d6af76f.js create mode 100644 assets/js/a09c2993.e261a802.js delete mode 100644 assets/js/a09c2993.f32be3e9.js create mode 100644 assets/js/c5e4a08a.5a0c4a86.js delete mode 100644 assets/js/c5e4a08a.7f8ec798.js create mode 100644 assets/js/caaf7770.1f2988c7.js delete mode 100644 assets/js/caaf7770.85207c38.js create mode 100644 assets/js/d9e16301.16abe1ad.js delete mode 100644 assets/js/d9e16301.fae6ae96.js create mode 100644 assets/js/f3275a05.0ac1d642.js delete mode 100644 assets/js/f3275a05.a35654d9.js delete mode 100644 assets/js/fadecd94.40fd13e7.js create mode 100644 assets/js/fadecd94.e09f5515.js create mode 100644 assets/js/fc49bffc.f6068783.js delete mode 100644 assets/js/fc49bffc.fbdb3aa2.js create mode 100644 assets/js/main.3588fb71.js rename assets/js/{main.6c7acd83.js.LICENSE.txt => main.3588fb71.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.6c7acd83.js create mode 100644 assets/js/runtime~main.585d3520.js delete mode 100644 assets/js/runtime~main.e2e12cec.js diff --git a/404.html b/404.html index 0c2b1392..3579fd4c 100644 --- a/404.html +++ b/404.html @@ -7,14 +7,14 @@ -Page Not Found | Raccoon - - +Page Not Found | Raccoon + +
Skip to main content

Page Not Found

We could not find what you were looking for.

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/assets/css/styles.4f2077d4.css b/assets/css/styles.4f2077d4.css deleted file mode 100644 index 5b7c331e..00000000 --- a/assets/css/styles.4f2077d4.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}html[data-theme=dark],html[data-theme=light]{--main-bg-color:var(--ifm-color-primary);--light-bg-color:transparent}pre,table{overflow:auto}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,.2),0 2px 4px 0 rgba(0,0,0,.1);--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:rgba(0,0,0,.03);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#4d4dcb;--ifm-color-primary-dark:#3939c3;--ifm-color-primary-darker:#3636b8;--ifm-color-primary-darkest:#2c2c98;--ifm-color-primary-light:#6363d1;--ifm-color-primary-lighter:#6e6ed4;--ifm-color-primary-lightest:#8e8ede;--ifm-code-font-size:80%;--ifm-font-family-base:"Inter",sans-serif;--ifm-table-cell-padding:0.5rem;--ifm-table-stripe-background:none;--ifm-table-border-color:var(--ifm-color-emphasis-200);--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-breadcrumb-item-background-active:none;--ifm-breadcrumb-spacing:0;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:transparent;--docusaurus-collapse-button-bg-hover:rgba(0,0,0,.1);--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base)}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead{text-align:left}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight);color:var(--ifm-color-gray-700);font-weight:400}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:rgba(53,120,229,.15);--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:rgba(235,237,240,.15);--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:rgba(0,164,0,.15);--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:rgba(84,199,236,.15);--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:rgba(255,186,0,.15);--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:rgba(250,56,62,.15);--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child,.theme-doc-sidebar-item-category{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(0);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Adtb article>:first-child,.docItemContainer_Adtb header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal);padding-left:0}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.docsWrapper_BCFX,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:-webkit-sticky;position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:hsla(0,0%,100%,.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,.5);color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:hsla(0,0%,100%,.05);--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input:-ms-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,.05);--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:hsla(0,0%,100%,.1);--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:hsla(0,0%,100%,.07);--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--ifm-table-stripe-background:none;--dark-bg-color:#131313}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:rgba(0,0,0,.1);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}html[data-theme=dark] .docusaurus-highlight-code-line{background-color:rgba(0,0,0,.3)}html[data-theme=light]{--dark-bg-color:#f8f6f0}.container,.menu{margin-top:1rem}.menu{font-size:90%}.menu__link{font-weight:400}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/1rem 1rem}.menu__link--sublist-caret{color:var(--ifm-color-grey-darkest)!important;font-weight:600}.markdown h1{font-size:2.5rem}.markdown h2{font-size:1.7rem}.markdown h3{font-size:1.4rem}.theme-code-block{box-shadow:none!important}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-200)}.pagination-nav__sublabel{font-size:60%}.pagination-nav__label{font-size:80%;font-weight:400}table{border-collapse:collapse;margin-bottom:var(--ifm-spacing-vertical);display:table;font-size:85%;width:100%}table code{font-size:95%}.tabs__item,pre,table th{font-size:80%}table td,table th{border:0;padding:.8rem .3rem}table thead tr{border-top:none}table thead tr,tbody{border-bottom:1px solid var(--ifm-table-border-color)}code{border:none;border-radius:0}.col{padding:0 3em}.table-of-contents__left-border{border-left:0}.navbar{box-shadow:0 1px 1px 0 rgba(0,0,0,.08)}.tabs{border-bottom:1px solid var(--ifm-color-emphasis-100)}.tabs__item{border-bottom-width:1px;padding:.7rem 1rem}.theme-doc-footer .col{padding:1rem}.navbar-item-github:hover{opacity:.7}.navbar-item-github:before{align-items:center;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;content:"";display:flex;height:20px;justify-items:center;margin-right:.5rem;width:20px}html[data-theme=dark] .navbar-item-github:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 50% no-repeat}.header-slack-link:hover{opacity:.6}.header-slack-link:before{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPEAAADvCAYAAAAjFzLiAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA9GVYSWZNTQAqAAAACAAHARIAAwAAAAEAAQAAARoABQAAAAEAAABiARsABQAAAAEAAABqASgAAwAAAAEAAgAAATEAAgAAACQAAAByATIAAgAAABQAAACWh2kABAAAAAEAAACqAAAAAAAAAEgAAAABAAAASAAAAAFBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoTWFjaW50b3NoKQAyMDE4OjEyOjE0IDA5OjM4OjM5AAAEkAQAAgAAABQAAADgoAEAAwAAAAEAAQAAoAIABAAAAAEAAADxoAMABAAAAAEAAADvAAAAADIwMTg6MTI6MTQgMDk6Mzc6MjcA26ZdyAAAAAlwSFlzAAALEwAACxMBAJqcGAAACGNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6YTA4Yjg4ZTAtZDYyYS00NDA0LWI1YjItNmQ4YTU5MTE1OWZlPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmEwOGI4OGUwLWQ2MmEtNDQwNC1iNWIyLTZkOGE1OTExNTlmZTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmEwOGI4OGUwLWQ2MmEtNDQwNC1iNWIyLTZkOGE1OTExNTlmZTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0xMi0xNFQwOTozNzoyNy0wODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDphMDhiODhlMC1kNjJhLTQ0MDQtYjViMi02ZDhhNTkxMTU5ZmU8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0xMi0xNFQwOTozODozOS0wODowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTgtMTItMTRUMDk6Mzg6Mzk8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxOC0xMi0xNFQwOTozNzoyNzwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj41MDA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NTAwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoB5zTbAAAcc0lEQVR4Ae1dabRdRZV+ISRhCCFAQAhkIANjmOchEmYZFtqAdDc0CIvu/oEiP0RpkYbViEgrtIJEWpQh7RIFlQZpGe0mBkkgTDInjC9ASJiDCYQw9vdx3/UNOffcM1TV2XXPt9f63rv3nhr2/nbtc+rUqarT1SURA2JADIgBMSAGxIAYEANiQAyIATEgBsSAGBADETIwKEKdLau8OpQj1gAmASOBD4GmLMSHl4H3gOXA+0DMsiaUp62DgW2B1YCPAQo/zwdeBVYAy4C+XOCrxAUDq7ooRGV8ygBPiOsAo3r+T8D/gUHMhk28CbzW8x//ohQG7rrABgBtor3DgE8ACn9j0DLQlwCLgLcBiWMGdCUuT+j2KGJXYGdgN2AKsAqQJgziR4BZwIPAHIBXrBiEdtLGqcCewBZAO2Hw3gvMBh4A7gFeByRioFIGDkXtlwBsjLz6lAGD+JvARMCq0N6fAn8BytjKvHcDpwNjAYkYCM4Ar0DXALz3K9uYB+bnPeS5wFqAFdkPilwP+LD3MZR7FsBuuEQMeGeA4wdscC6uvAODd+B3djkP9m5RegW09zvAW8BA/Vx/523F/oBEDHhjYDJKvgVw3XjTymPwnO3NovSCt8Hhu4A0/Vwf4zjBGelq6agYKMbADsj2MOC60WYt70eomyO8oWRvVPQCkFU/l+nYZf8hMBSQiAEnDByEUhYDLhtqkbJugg5rO7EovZAjcZiPvoro6DLPtdBBjz/TfaWjGRjYCmk48OKycZYp6zLo4nMAiI/Hug3Zeyl0GQJIxEAhBtZHrnlAmaDzkfeiQta0zzQBSV40aO9326uuFGIgmYEb8LOPICxbJu8Zj0lWudSvoQftsvLwEazSqHUp19Yz84kwO2sjqyIdB53GOXTNacbtfRb6refQXhXV4QxsDPsWAlUEZ546eX/sQjZDIRYGstrZfh701BRhFx6vQRn/DhvbNSgLx5dCTz4KKivTUYAFe9rpsBx6ZpmjXZYP5Y+cgTHQP8RsrHYNNuvxGSX53gn53wCy1ld1Op5wJAkMrJLwW11/4oDRuhEZvy90LXN1OjAye4+AvqMi8k8wVRXEDap5v3UUENN9F3sOBzTUz/13JHJ8IXeuajNsiOoZyJIBDCiIG4RwPfCWA7iJ4SsXSRSZAMKuNCd3xCScwfW3MSkcSlcFcYNpBgOvTrHJZ6FwkZMPT1oxyhQovU6MivvUWUHcYHdHnyR7LHsEyh6ds3wuLtguZx4ryYdDkdh6EN65UxB3dbFhbOqdaX8VbJ+zaAb9LjnzWEm+FhRREA/whoK4saFbzEvf8nYveQ8dYkXUgKbm5CsHHmPV3QkBSYUoiBuPadZLIieS3zjrileorMKgj/H+v2nf5s0P+t9gQEHcGN2Nee0qr6yDczRo2ponfY6igyRdLUgtEVWiIO7dAC4it/VTlSubOJsqq+RJm7XMkOlor6QPAwrixlVJPPRpFPoYFwNqvF1d78Jlsb9OJa5WJ22dMqAgbmxJ87ZTVlWYGAjIgIK4sREeV/NIxECUDCiIGwNbC6L0npQWA2BAQdxoBo+rNYiBWBlQEDc8dwv+6b441lZcc70VxI0GcD/+PV/ztiDzI2VAQdzruJ/3ftQnMRAPAwriXl/NwEe+e1ciBqJiQEHc6y4+ZuJLtCViICoGFMT93fU9fH2p/0/6JgZsM6Ag7u+fV/H1jP4/6ZsYsM2Agnhl/1yHnzTItTIv+sUoAwrilR3zIX46E3hg5UP6RQzYY0BBnOwT3hd/BViUfFi/igE7DCiIW/viHhziZuUK5NYc6YgBBhTE6U7gTK7DgSfTk+moGKiOAQVxe+4fRJLDgN+3T6oUYiA8AwribJxzXvXfAV8HlmbLolRiIAwDCuLsPC9D0gsBvgLlCoCj2BIxUDkDCuL8LpiHLKcAfPPClcDrQJUBHfP2s6BOUpaBmPdbLmt7mfzcWI8bCZwMbAAcCfB9v1sDfEPBGsDqwBDAt+hE7Jth4+UriMs7iFM1/7MHLG0rYDzAdx5NAvjqEV97PfNk8RCwApDUlAEFsXvHP4EiCYkYCMKAumJBaFYlYsAfAwpif9yqZDEQhAEFcRCaVYkY8MeAgtgftypZDARhQEEchGZVIgb8MaAg9setShYDQRhQEAehWZWIAX8MKIj9cauSxUAQBhTEQWhWJWLAHwMKYn/cqmQxEIQB39Mut4MVXLo3DtgE4HxiziWuo3D+dDfwMvAIwN1CtGMISIhEuNBlSg82w3+26dWApnBRzFPAEmAucC/wJuBdXAcxl8Vxid5JwG7AGGBdIMRqHlQTjbwDTfnKmIXAjcB1wDPAx4DEDgPrQxWuUPsbYHOAK9SIVj3YQ3GMwjdsMoDp02sB+phLVk3LWtDui8BMgAbwqiNk44CBS4ffABwCcGWST9kLhcfsmzt8ktNTNpeUXgq8BPAKW4Yv5n8BmA5sBZgUNopZQBlDlbeXv9+Byx08elpB3Jpcdpm/DbCn5KNNLke55wAbAyZkFLS4APBhbN3L5NX564CPXTsUxCA2QdgLmguEaHvcHebgBB2C/jQZtd0FhDC4znVcA443cuxZBfHKhJ5eUVs+f2VVwvyyB6rhKFydgyuk7XydjMtAVhD3j5PLKm7LP0L9a/ZXye83Pi5aDIRsxKqrq4t7X/MRnQtREPeyyMEmC+2LI9hBhM98nwYsGF1HHe4F9+OBsqIgbjDI7YcttaOLyzq2Xf4RSMB3E1kyuo66/Bo+GNrOWW2OK4i7uk412pbPaOO7UocvN2p0HQP5W6U82dVV9yDmJKT3jLZnzhfYr6R/E7MfhV/5fKuOAWPR5tfgC45NFJU6B/FwkPa/gEW/NnXiUx/qmVlaTR9rFsDCzgX6zhFtHtP/ahjg83lOSHA9ZbYaa8LW+kVU5+VK59CMvVHWaXnKaxfEnANtdqpYHkM7LC0bIhukJDsDvCCVvRXJXlu5lCcj+/pZi0gL4nVQyD9lLUjpgjLAq/CxQWuMvzLyNTESMzaFnl/KqmtaEH8OhWyTtSClC87AvqiR97eS9gzwpPeV9slMpeBJh3O520pSEA9CLi4dZBBL7DLAWT4H2lXPlGZToQ2XEsYkXASzYxaFk4KYS+E2Bg7IUoDSVMoAGyef4UvSGTgCh8s+X0+vwc9RTnFuK0lBPBK5xgKj2+ZWgqoZ2BMKbFm1EsbrZ8+SPMUo1JubEKQ+iUgK4t2RiQ/EJfYZ4KM/DoJIWjPwGRxyuYCkdU3uj+yEIjcE2DtuKUlBPB6px7XMoQPWGFCPKd0jHJFODYL07JUe5RMiInWeRtJlehIy6exeqe9yVU5/DQY+ypWrPol5a5hrBpQxaiZAH87merWVXklBzAX/41tl0O/mGKCvOFLNjfckKzPAXiWftsQq7GlxrndLSepOM0Nqppal6UAVDNCHSX6sQheLdfJZa8z8vA/9iZYSs3EtjarZAe7Hxe6WJJmB1ABIzhLXr0lBzN84LC+Jg4G6+aqO9ibF6V9bZ9LBD3BUgyR/pcj8B94Lr8ihJa9MMV+5385hayck/RBGMCZbSlIQP43UT7XMoQPWGKCv8oxhvIX0i6wZkUOf+TnSdkJSxmOqzUmj093IVLcuS8zOXphT+WVIzyAenTOfheTsQcR8AirC4evIlPrkIelKPAeZ5hapTXkqYeDFnLXySsyze4yyFEo/GaPiBXXmFZjPh99Jy58UxMz4GMC+uMQ2Awug3uM5VVyB9HfmzGMlORv03VaUCaDHbNSxGOD2WC0lKYjpZHbRuEWqxDYDt0G97gIq3oc8qV20AmWGyPInVJLaoEMoEbCOWair7cU0KYg5EsZ3rN4cUFlVVYyBolelJ1Adz/IxCUfVb4xJ4ZK6cudLvv2jrSQFcTMTz/J1G85v2h7D/0eh5O0FFWVv678L5q0qG+/jb62q8grq5QmLJ9u2khbEPAvwnbkSmwzcArV4v1RU7kDGZ4tmriDfL1FnnkdpFajorErO06C9meZrpAUxNfpp1oKYWBKMgZdR09Ula3se+WeULCNUdp6srgpVmYF6/gc68CSbSdoFMe+5Ls9UkhKFZOASVObiUctPUE7e0e2QdjbrOgcfeOKqg7C38QPXhm6IAvko4xPBBAccoR0GuJLDURC7bVb9OxO6DQWKygXIaNW2JL3OLWpou3wHIUFztUxSxfotTEN5A37Ytp2zChw/H3ks+pATWcYVsKdvlpiCeA4U97qBwVmowKKj66TTCX1bp8PPvNL9n0H/8j1gZSWWIOYJa4uyxrbLz/nUFwF1ChpLtp7WzkElj2+M/H804l92779c0p5m9hiCmDPR9mgq7Ps/z9iXAZYad6frwtsY3wHcbDdj8GEmUCWnfIbtKoBRVJf1IO6GjkdS0ZDClU9nAyS7SmfXoW7OnDsVCCljURknkVTBL2cpneLYWMtB3A1bg12Bk3g9GT++AFTh7DrU+RS43T+J+AC/DUEdHOx6FwjF9VzU9VnAtVgNYj4L3ty1sUXKoxLXA6EcXYd6+JyQkzAyv9oSaX3JMSj4fsAn71xmNx3go0wfYi2IeXL+hg9Dy5b5DyjgD4BPZ3d62bz3vQk4ArAkfOTxbwAnl7j2wW9R5mGAT7ESxBy84njSBJ/Gli2bXbCjAc7w4vNM1w7v1PLmgSvO0DkEsCybQrl/BniiYW+hqD94MqC9nGQSQqoO4rtg5DeBnX0ZO8hTwduj3MnAXgCV52AJH2G0m+aJJB0tHAxcBHAFEoOXa7YfAp4DYpHVoCj9OwXYD9gMYFeY/h0otPdpgDazWz4b4DTP54FQwq6668GyVrrz4sWVf7SVa7YfAR4A+Ls38RXEfRVeH19GAMOBNYEQdaIac8Ir11JgGfB6z2f8i1qGQft1APqW/4cCfYUbD7wF0GaOtFch41DpJgEq5rNt2soT1yvAckAiBsSAGBADYkAMiAExIAbEgBgQA2JADIgBMSAGxIAYEANiQAyIATEgBsSAGBADYkAMiAExIAbEgBgQAx3FQMgpkIPBnO9pl5yb/SHwDsBVQVUKpyDS3qYenHbJaYidKqvDsIHTLjvV1iS7OO2S00uDi88g3gDWTAE4d7U5f3U0PrNONmgfwpVUiwGu1+Sk+5DCBR8TAc4V3xrggoCNgPeBps3d+LwQ4JpS6skVPZxHHaPQVtpJP9O/mwGcI+/LtyjarPDiwTnT9Cv9OR9YADwO0P9exXUQM4gOAA4E9gB2B0ILr8I7AFw941vYgA8DdgNo8wQgj8xG4luA+4Db8mSsKO1GqPdgYFeA9k4CJMkMcDEElyHeAdwJMKBNC4P3NIAKs/vIs3FVeAl18yrhUxis3wbuB1zYyVuAG4EvARaFV9nvAw8BLuytWxm8Ks8ApgImhTtRzAGsOMZ3EH8NtrLb5MvemSjbkrPPhD7PerTXF48Wy2VX+3KA669NyEhocRXANbKWCPMVxFvCTvY0Qtj6Guo5H6hSdkLls4AQ9tatDt7qHV+lc1n3LsDDgEXyfQTxMbD1hQrs/T3qHAuElhNRIfeEsujfTtGJmwZcCHBjheAyDTV2A1bJdB3EX4atJLwqe/+MuqcAoYRjG7xHr8reutV7KbheO5RzWQ9HJN8FLBPtMogZwB8ZsJd7NbE771sYwJZ926m63QzeuXeZd9kRNXCUzTqRroL4BGO2PgZ9fO4VxROWdd92sn4/Bv+uH/miyF7haNpzQAwkughinrA4u8qavb6eJe9l0FZr3IfQ5yz4wZv8F0oOYYSLOsoGMXdtfMKwvec69vIYlBfLCdpF+7BcBsci9nHs30+LOxZ/LRs+ULcyQczuzEXG7f0Y+k0FXMmVKGggh/peHScc/9jAlXNZDu/BngRicmqZIGZw8Gxo3d6Z0JGz5MrK4SjAwsCddb5D63dOHseu0ibxMTi+RZs0nXSYs7EGR2DQPtCRvikj7HVwMKtdGyhTh/IWY+B4ZJuUNWuaAznZ/aSsBXVAOg5m7R+RHcdB11VL6MvHhTHZW8LU6LJOhMZHZ9U6LYj3RiEhJxlk1dlXun9EwcN9Fe6h3Gkok6PKRYVdaRdd8qL1K186A0fh8LrpSRpHk4KYvw0FMp8JslRkPA0ftE8zruNA9bgIv+gAF8c6Dh1YoL6bYmBnaJPJv0lBzAZNJ7O7VRc5CIZuGqGxvJoWmbK3G/KxyyaxzcCuWdRLCuLPICMbNJ+X1kV4wgoy7c0xoVxptG3OMjmgtWfOPEpeDQP0E0/SqWMfSUG8DTLlbRjVmOiu1snuigpaEp07KmeN7IZPyplHyathgO+B5mzJNdOqbxXEdRrQWgsEcSQ+VsnrK/a06naSjtW3XLPPwa3UXmLSZZpd6XGxWl1Ab17JhhfIZyXLaCjCLjInJGQR2spAlsTBALdGGgy80krdpCsxL99mtg9ppbjD33nC4hkvVhkLxdmbyCojkJBdakkcDLBtpo5PJQVxHKa505JXsZiF+sduQ8z8+9adPazUXlYnBjEbdCfa5buxqPxIGUhq7LxPTrpXjsVEnrW4iEGSzECSz5NT6lcLDNBfqT5LOrgEmYhYhZvHL4pV+QB6k5/3A9SjKtww8AGKIVpKUhA/j9TdLXPYP7AUKr5nX83KNFyGmglJHAw8DTWfSlM1KYjnIcP8tEzGjz1jXL+q1XsDCjxatRKqPxMDK5BqIfB6WuqkIKaDY3Uy74e5H7akNQO8VdKJrjU/lo7wCvwmkHr7kxTE3cjEzNwGJjbhvcPs2JQOrC938ngwcJ2qrhgDc5GNm/gvT8ueFMS8X3oJuC8to9FjNPh+o7pZUuteKJPaMCwpW2NdGIM86aZKUhDz0s1L+A2pOW0e/A3U4uirJJ0B3i7dlp5ERytm4C3UPyuLDklB3Mz3O3yILSBmNJXX/1QGeKK+PTWFDlbNwK+hwJNZlEgLYo5Q/zJLIUbS/BZ6/NmILjGo8SsoyccXEnsM8OJ5bVa10oKYffHLAXatY5ALYlDSkI7srl1tSB+p0svAzfh4Z+/X9E9pQcycvLG+Jr0IE0evgBYa0MrviovFW37SPOfgM+EfAHxcmknaBTELORuw/EjiRej3PSoqyc0Au23nArGNfeQ2NKIMl0DXOXn0zRLE7HadA1icysgu/zeApwBJMQZuQrYLi2VVLscM3Iryvuu4zH7FnYFvvMRbwrf6aVjsy77IxqmIluzKowvvn9YuZnq/XHykmKdepXXL12PgP8heb+cZcvR06OJiMbyCGERCRgK8Eig4w3PAweNtgGDyH6ipakdf5tBaBXEvmSPw8Q8G/Ft1+wpZP28F2QaDy5moMaShfev6jmNrFcT9CV0LX6+v0L99fd3pnx8Hz1v2pz/st6NR3StAKKIXo64TAdeiIF6ZUW6RyqcSoXxbx3o42WbcytSH/2UCquSEEN9O4JzoLTyZpyBuTSy54eMO3/6tU/l8JHoSsAZgRoZAk4OBWcBSwJVDuJqK3Y3DgNUBX6IgTmeWI99fBXjvxseMrvxbp3L4KPQ14AKAWwybFW5wPQ34GfAcwCDM6yg2Eubl444DgBAb9imIQXQG4ej1ccAdwALgAyCvf+uWnoHL9e2nA2MAL+IySHi2mdkDbnbN4DgE2AxgA+DIJzEIoDNZ99sAn9EuAZ4AOM2Tq6feBCS2GKCPftGD0fj/eYA9ML5mhP4dBfBemr6tm7BNs/1zyiRnvy0C7gduB3g74lVYeQgZjko2ATYCmkE8DJ8XAtwqpsoF6vuift5zszHGKLdA6b8HeEKsStjlngzwJF3HIObMxxXA0wADmQEdTFxeidOUZtd6Xg/S0ulYnAzwBMIrj6QCBngGkYgBMRAxAwriiJ0n1cUAGVAQqx2IgcgZUBBH7kCpLwYUxGoDYiByBhTEkTtQ6osBBbHagBiInAEFceQOlPpiQEGsNiAGImcg1IytyGnqKPU5v3k8wAUMvmQoCuZ7sTgvXuKZAQWxZ4INFs+9nG4EPvaoG3t4nEvM6baLAc4p5uKWu4FngaBzi1FfR4uCuKPdm2gc12ZzIUoomYKKDgBOBrjCh6vVrgC4cIMBLinJgO6JSxIYYfaqroLsYq8D7AVcCTwEnAKMAyQlGFAQlyBPWUsxsCFyTwf+BJwAcFMJSQEGFMQFSFMWpwxwnfmMHkx0WnJNClMQ18TREZh5HHTk2yy4SYMkBwMK4hxkKal3BriVE0fOD/JeUwdVoCDuIGd2iCncvP46gPuzSTIwoCDOQJKSBGeAe3ZdA+wZvOYIK1QQR+i0mqjMHTQvBrizpiSFAQVxCjk6VDkDO0ODf6lcC+MKKIiNO0jqdZ0KDjTQldIQFMQp5OiQGQbOhyY+X+VjxtAiiiiIi7CmPKEZ2AkVHh260ljqUxDH4inp+VVQoKmZCe1AQZxAin4yycB20GqqSc0qVkpBXLEDVH1mBoYg5Rcyp65RQgVxjZzdAaYe2AE2ODdBQeycUhXokYH1UPZWHsuPsmgFcZRuq63S3FRAUzEHuF9BPIAQfTXNwFBop2mYA1ykIB5AiL6aZ2Bz8xoGVlBBHJhwVVeagTGlS+iwAhTEHebQGpjDrXAlfRhQEHd1DerDR4wfY9c/L+d1s7ctPwpiv5uot3WAgwTcBP4TB+XEUoTPTe9j4aCfngrirq5FYGRpP1bi+kL9uSl7VuFbGWIOhJezGlqXdArirq6X4Oy/ROzwhdA9z4bwDOKYA4H2SvowoCBuXMXe7sNJbB8X5FR4CdLnzZOzCm/JP0TJ3d5Kj7RgBXHDcXw/UIzCbvEzORV/C+kfzJnHSnKebO+xoowVPRTEDU/chn/vWnFKDj0eQNrHc6RnUgb+XTnzWEn+HBR5zIoyVvRQEDc8cSf+vWHFKTn0mF1Qb/Y83sxRj5Wk90KROo3EZ+JdQdygiV3M2zMxZicRXxJ+a0F15iHfDQXzVpWNA3Izqqpc9cbBwDSo+R7AM30M+CP0XA0oKlxgz651DLZSx5nAIEAiBloywAYyC4ilUfPdvmWEr0u5G4jF3mPKGKu89WHgoEga9VzoyVedlJWjUAC75dYDmSebYWWNVf76MHAVTLXeqA906A7eG1u3d3eH9qqoGjAwFjZyVpDVhn21Yx9sjvI47dSqvXwfk0QM5GbgaOSw2Kj5jJRb1LiW41GgRXvnQK8yg3eueVJ5kTHwr9DXUsPuhj47euTwHGP28oQ1waO9KromDPwQdloIZM4mm+aZc75d4TLAgr0vQI+pnu1V8TVhYBXYeR5QZcN+EfV/LhDfHAH+fsX2zkf92tEykMPrVM2ZMHYJEDqY2aD3qIBo3kpUMdjFxQ18XYtEDHhh4BCU+hAQKpB/jrp8DGJlJefzSPhIIHvfRz2XA5yAIhEDXhlYF6XzPtnnVYonihO8WpG98FFI+hOAO4f4Onndh7I56UQiBoIysA9q+zGwHHDVuB9GWV8DNgSsyb5Q6ApgGeDKXj4+4utK1wckYqAyBjiT6Ayg6Bzk15D3VwDnBY8BrMsuUJD2zgSKBDMn0fwMOBbYAJA4YECrQhyQiCJ4NRkNTAa2Bjg4MxFYFWBjb8pifOgGHgX4HJQjzwuAFUBMsh6UHQ9sCnDgbRxA2/vaOwTfae/8HrDb/DLAhf1cPSVxxABJl5RngBvtsWHykdQawAhgMNC3UePrpztrduP/8wAbMxfmc1AnNlkKhfkslzaz+8//DNq+9vL7IqBp67P4zHxMKxEDYkAMiAExIAbEgBgQA2JADIgBMSAGxEBpBv4faIKzn44X65IAAAAASUVORK5CYII=") 0 0/cover;content:"";display:flex;height:19px;width:19px}html[data-theme=dark] .header-slack-link:before{filter:invert(100%)}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#docusaurus-base-url-issue-banner-container,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px;line-height:0;padding:0}.announcementBarContent_xLdY{flex:1 1 auto;font-size:85%;padding:5px 0;text-align:center}.announcementBarContent_xLdY a{color:inherit;text-decoration:underline}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_lCJq{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.main-wrapper{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}.iconEdit_eYIM{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:.5rem;font-size:90%;padding:.3rem .5rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vbeJ{font-size:smaller;font-style:italic;margin-top:.2rem}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:-webkit-sticky;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;-ms-user-select:none;user-select:none}.hash-link:before{content:"#"}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.breadcrumbHomeIcon_OVgt{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity .2s ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;padding:0 var(--ifm-pre-padding);position:-webkit-sticky;position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:.15s;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:transparent transparent transparent var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:hsla(0,0%,100%,.05);--docusaurus-collapse-button-bg-hover:hsla(0,0%,100%,.1)}.collapseSidebarButton_PEFL,.docSidebarContainer_b6E3,.sidebarLogo_isFc{display:none}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vbeJ{text-align:right}.docItemCol_GujU{max-width:75%!important}.tocMobile_aoJ5{display:none}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:-webkit-sticky;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:-webkit-sticky;position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;position:-webkit-sticky;position:sticky;top:0;transition:background-color var(--ifm-transition-fast) ease}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_aoJ5{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.9e2d6806.css b/assets/css/styles.9e2d6806.css new file mode 100644 index 00000000..7965e559 --- /dev/null +++ b/assets/css/styles.9e2d6806.css @@ -0,0 +1 @@ +@import url(https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}html[data-theme=dark],html[data-theme=light]{--main-bg-color:var(--ifm-color-primary);--light-bg-color:#0000}pre,table{overflow:auto}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#4d4dcb;--ifm-color-primary-dark:#3939c3;--ifm-color-primary-darker:#3636b8;--ifm-color-primary-darkest:#2c2c98;--ifm-color-primary-light:#6363d1;--ifm-color-primary-lighter:#6e6ed4;--ifm-color-primary-lightest:#8e8ede;--ifm-code-font-size:80%;--ifm-font-family-base:"Inter",sans-serif;--ifm-table-cell-padding:0.5rem;--ifm-table-stripe-background:none;--ifm-table-border-color:var(--ifm-color-emphasis-200);--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-breadcrumb-item-background-active:none;--ifm-breadcrumb-spacing:0;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base)}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead{text-align:left}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight);color:var(--ifm-color-gray-700);font-weight:400}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_tbUL,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{-webkit-text-decoration-color:var(--ifm-alert-border-color);text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child,.theme-doc-sidebar-item-category{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(0);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Adtb article>:first-child,.docItemContainer_Adtb header+*,.footer__item{margin-top:0}.admonitionContent_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal);padding-left:0}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-timing-function:ease-in-out;top:0;left:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter);content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.docsWrapper_BCFX,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--ifm-table-stripe-background:none;--dark-bg-color:#131313}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:#0000001a;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}html[data-theme=dark] .docusaurus-highlight-code-line{background-color:#0000004d}html[data-theme=light]{--dark-bg-color:#f8f6f0}.container,.menu{margin-top:1rem}.menu{font-size:90%}.menu__link{font-weight:400}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/1rem 1rem}.menu__link--sublist-caret{color:var(--ifm-color-grey-darkest)!important;font-weight:600}.markdown h1{font-size:2.5rem}.markdown h2{font-size:1.7rem}.markdown h3{font-size:1.4rem}.theme-code-block{box-shadow:none!important}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-200)}.pagination-nav__sublabel{font-size:60%}.pagination-nav__label{font-size:80%;font-weight:400}table{border-collapse:collapse;margin-bottom:var(--ifm-spacing-vertical);display:table;font-size:85%;width:100%}table code{font-size:95%}.tabs__item,pre,table th{font-size:80%}table td,table th{border:0;padding:.8rem .3rem}table thead tr{border-top:none}table thead tr,tbody{border-bottom:1px solid var(--ifm-table-border-color)}code{border:none;border-radius:0}.col{padding:0 3em}.table-of-contents__left-border{border-left:0}.navbar{box-shadow:0 1px 1px 0 #00000014}.tabs{border-bottom:1px solid var(--ifm-color-emphasis-100)}.tabs__item{border-bottom-width:1px;padding:.7rem 1rem}.theme-doc-footer .col{padding:1rem}.navbar-item-github:hover{opacity:.7}.navbar-item-github:before{align-items:center;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;content:"";display:flex;height:20px;justify-items:center;margin-right:.5rem;width:20px}html[data-theme=dark] .navbar-item-github:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 50% no-repeat}.header-slack-link:hover{opacity:.6}.header-slack-link:before{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPEAAADvCAYAAAAjFzLiAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA9GVYSWZNTQAqAAAACAAHARIAAwAAAAEAAQAAARoABQAAAAEAAABiARsABQAAAAEAAABqASgAAwAAAAEAAgAAATEAAgAAACQAAAByATIAAgAAABQAAACWh2kABAAAAAEAAACqAAAAAAAAAEgAAAABAAAASAAAAAFBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoTWFjaW50b3NoKQAyMDE4OjEyOjE0IDA5OjM4OjM5AAAEkAQAAgAAABQAAADgoAEAAwAAAAEAAQAAoAIABAAAAAEAAADxoAMABAAAAAEAAADvAAAAADIwMTg6MTI6MTQgMDk6Mzc6MjcA26ZdyAAAAAlwSFlzAAALEwAACxMBAJqcGAAACGNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6YTA4Yjg4ZTAtZDYyYS00NDA0LWI1YjItNmQ4YTU5MTE1OWZlPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmEwOGI4OGUwLWQ2MmEtNDQwNC1iNWIyLTZkOGE1OTExNTlmZTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmEwOGI4OGUwLWQ2MmEtNDQwNC1iNWIyLTZkOGE1OTExNTlmZTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0xMi0xNFQwOTozNzoyNy0wODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDphMDhiODhlMC1kNjJhLTQ0MDQtYjViMi02ZDhhNTkxMTU5ZmU8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0xMi0xNFQwOTozODozOS0wODowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTgtMTItMTRUMDk6Mzg6Mzk8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxOC0xMi0xNFQwOTozNzoyNzwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj41MDA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NTAwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoB5zTbAAAcc0lEQVR4Ae1dabRdRZV+ISRhCCFAQAhkIANjmOchEmYZFtqAdDc0CIvu/oEiP0RpkYbViEgrtIJEWpQh7RIFlQZpGe0mBkkgTDInjC9ASJiDCYQw9vdx3/UNOffcM1TV2XXPt9f63rv3nhr2/nbtc+rUqarT1SURA2JADIgBMSAGxIAYEANiQAyIATEgBsSAGBADETIwKEKdLau8OpQj1gAmASOBD4GmLMSHl4H3gOXA+0DMsiaUp62DgW2B1YCPAQo/zwdeBVYAy4C+XOCrxAUDq7ooRGV8ygBPiOsAo3r+T8D/gUHMhk28CbzW8x//ohQG7rrABgBtor3DgE8ACn9j0DLQlwCLgLcBiWMGdCUuT+j2KGJXYGdgN2AKsAqQJgziR4BZwIPAHIBXrBiEdtLGqcCewBZAO2Hw3gvMBh4A7gFeByRioFIGDkXtlwBsjLz6lAGD+JvARMCq0N6fAn8BytjKvHcDpwNjAYkYCM4Ar0DXALz3K9uYB+bnPeS5wFqAFdkPilwP+LD3MZR7FsBuuEQMeGeA4wdscC6uvAODd+B3djkP9m5RegW09zvAW8BA/Vx/523F/oBEDHhjYDJKvgVw3XjTymPwnO3NovSCt8Hhu4A0/Vwf4zjBGelq6agYKMbADsj2MOC60WYt70eomyO8oWRvVPQCkFU/l+nYZf8hMBSQiAEnDByEUhYDLhtqkbJugg5rO7EovZAjcZiPvoro6DLPtdBBjz/TfaWjGRjYCmk48OKycZYp6zLo4nMAiI/Hug3Zeyl0GQJIxEAhBtZHrnlAmaDzkfeiQta0zzQBSV40aO9326uuFGIgmYEb8LOPICxbJu8Zj0lWudSvoQftsvLwEazSqHUp19Yz84kwO2sjqyIdB53GOXTNacbtfRb6refQXhXV4QxsDPsWAlUEZ546eX/sQjZDIRYGstrZfh701BRhFx6vQRn/DhvbNSgLx5dCTz4KKivTUYAFe9rpsBx6ZpmjXZYP5Y+cgTHQP8RsrHYNNuvxGSX53gn53wCy1ld1Op5wJAkMrJLwW11/4oDRuhEZvy90LXN1OjAye4+AvqMi8k8wVRXEDap5v3UUENN9F3sOBzTUz/13JHJ8IXeuajNsiOoZyJIBDCiIG4RwPfCWA7iJ4SsXSRSZAMKuNCd3xCScwfW3MSkcSlcFcYNpBgOvTrHJZ6FwkZMPT1oxyhQovU6MivvUWUHcYHdHnyR7LHsEyh6ds3wuLtguZx4ryYdDkdh6EN65UxB3dbFhbOqdaX8VbJ+zaAb9LjnzWEm+FhRREA/whoK4saFbzEvf8nYveQ8dYkXUgKbm5CsHHmPV3QkBSYUoiBuPadZLIieS3zjrileorMKgj/H+v2nf5s0P+t9gQEHcGN2Nee0qr6yDczRo2ponfY6igyRdLUgtEVWiIO7dAC4it/VTlSubOJsqq+RJm7XMkOlor6QPAwrixlVJPPRpFPoYFwNqvF1d78Jlsb9OJa5WJ22dMqAgbmxJ87ZTVlWYGAjIgIK4sREeV/NIxECUDCiIGwNbC6L0npQWA2BAQdxoBo+rNYiBWBlQEDc8dwv+6b441lZcc70VxI0GcD/+PV/ztiDzI2VAQdzruJ/3ftQnMRAPAwriXl/NwEe+e1ciBqJiQEHc6y4+ZuJLtCViICoGFMT93fU9fH2p/0/6JgZsM6Ag7u+fV/H1jP4/6ZsYsM2Agnhl/1yHnzTItTIv+sUoAwrilR3zIX46E3hg5UP6RQzYY0BBnOwT3hd/BViUfFi/igE7DCiIW/viHhziZuUK5NYc6YgBBhTE6U7gTK7DgSfTk+moGKiOAQVxe+4fRJLDgN+3T6oUYiA8AwribJxzXvXfAV8HlmbLolRiIAwDCuLsPC9D0gsBvgLlCoCj2BIxUDkDCuL8LpiHLKcAfPPClcDrQJUBHfP2s6BOUpaBmPdbLmt7mfzcWI8bCZwMbAAcCfB9v1sDfEPBGsDqwBDAt+hE7Jth4+UriMs7iFM1/7MHLG0rYDzAdx5NAvjqEV97PfNk8RCwApDUlAEFsXvHP4EiCYkYCMKAumJBaFYlYsAfAwpif9yqZDEQhAEFcRCaVYkY8MeAgtgftypZDARhQEEchGZVIgb8MaAg9setShYDQRhQEAehWZWIAX8MKIj9cauSxUAQBhTEQWhWJWLAHwMKYn/cqmQxEIQB39Mut4MVXLo3DtgE4HxiziWuo3D+dDfwMvAIwN1CtGMISIhEuNBlSg82w3+26dWApnBRzFPAEmAucC/wJuBdXAcxl8Vxid5JwG7AGGBdIMRqHlQTjbwDTfnKmIXAjcB1wDPAx4DEDgPrQxWuUPsbYHOAK9SIVj3YQ3GMwjdsMoDp02sB+phLVk3LWtDui8BMgAbwqiNk44CBS4ffABwCcGWST9kLhcfsmzt8ktNTNpeUXgq8BPAKW4Yv5n8BmA5sBZgUNopZQBlDlbeXv9+Byx08elpB3Jpcdpm/DbCn5KNNLke55wAbAyZkFLS4APBhbN3L5NX564CPXTsUxCA2QdgLmguEaHvcHebgBB2C/jQZtd0FhDC4znVcA443cuxZBfHKhJ5eUVs+f2VVwvyyB6rhKFydgyuk7XydjMtAVhD3j5PLKm7LP0L9a/ZXye83Pi5aDIRsxKqrq4t7X/MRnQtREPeyyMEmC+2LI9hBhM98nwYsGF1HHe4F9+OBsqIgbjDI7YcttaOLyzq2Xf4RSMB3E1kyuo66/Bo+GNrOWW2OK4i7uk412pbPaOO7UocvN2p0HQP5W6U82dVV9yDmJKT3jLZnzhfYr6R/E7MfhV/5fKuOAWPR5tfgC45NFJU6B/FwkPa/gEW/NnXiUx/qmVlaTR9rFsDCzgX6zhFtHtP/ahjg83lOSHA9ZbYaa8LW+kVU5+VK59CMvVHWaXnKaxfEnANtdqpYHkM7LC0bIhukJDsDvCCVvRXJXlu5lCcj+/pZi0gL4nVQyD9lLUjpgjLAq/CxQWuMvzLyNTESMzaFnl/KqmtaEH8OhWyTtSClC87AvqiR97eS9gzwpPeV9slMpeBJh3O520pSEA9CLi4dZBBL7DLAWT4H2lXPlGZToQ2XEsYkXASzYxaFk4KYS+E2Bg7IUoDSVMoAGyef4UvSGTgCh8s+X0+vwc9RTnFuK0lBPBK5xgKj2+ZWgqoZ2BMKbFm1EsbrZ8+SPMUo1JubEKQ+iUgK4t2RiQ/EJfYZ4KM/DoJIWjPwGRxyuYCkdU3uj+yEIjcE2DtuKUlBPB6px7XMoQPWGFCPKd0jHJFODYL07JUe5RMiInWeRtJlehIy6exeqe9yVU5/DQY+ypWrPol5a5hrBpQxaiZAH87merWVXklBzAX/41tl0O/mGKCvOFLNjfckKzPAXiWftsQq7GlxrndLSepOM0Nqppal6UAVDNCHSX6sQheLdfJZa8z8vA/9iZYSs3EtjarZAe7Hxe6WJJmB1ABIzhLXr0lBzN84LC+Jg4G6+aqO9ibF6V9bZ9LBD3BUgyR/pcj8B94Lr8ihJa9MMV+5385hayck/RBGMCZbSlIQP43UT7XMoQPWGKCv8oxhvIX0i6wZkUOf+TnSdkJSxmOqzUmj093IVLcuS8zOXphT+WVIzyAenTOfheTsQcR8AirC4evIlPrkIelKPAeZ5hapTXkqYeDFnLXySsyze4yyFEo/GaPiBXXmFZjPh99Jy58UxMz4GMC+uMQ2Awug3uM5VVyB9HfmzGMlORv03VaUCaDHbNSxGOD2WC0lKYjpZHbRuEWqxDYDt0G97gIq3oc8qV20AmWGyPInVJLaoEMoEbCOWair7cU0KYg5EsZ3rN4cUFlVVYyBolelJ1Adz/IxCUfVb4xJ4ZK6cudLvv2jrSQFcTMTz/J1G85v2h7D/0eh5O0FFWVv678L5q0qG+/jb62q8grq5QmLJ9u2khbEPAvwnbkSmwzcArV4v1RU7kDGZ4tmriDfL1FnnkdpFajorErO06C9meZrpAUxNfpp1oKYWBKMgZdR09Ula3se+WeULCNUdp6srgpVmYF6/gc68CSbSdoFMe+5Ls9UkhKFZOASVObiUctPUE7e0e2QdjbrOgcfeOKqg7C38QPXhm6IAvko4xPBBAccoR0GuJLDURC7bVb9OxO6DQWKygXIaNW2JL3OLWpou3wHIUFztUxSxfotTEN5A37Ytp2zChw/H3ks+pATWcYVsKdvlpiCeA4U97qBwVmowKKj66TTCX1bp8PPvNL9n0H/8j1gZSWWIOYJa4uyxrbLz/nUFwF1ChpLtp7WzkElj2+M/H804l92779c0p5m9hiCmDPR9mgq7Ps/z9iXAZYad6frwtsY3wHcbDdj8GEmUCWnfIbtKoBRVJf1IO6GjkdS0ZDClU9nAyS7SmfXoW7OnDsVCCljURknkVTBL2cpneLYWMtB3A1bg12Bk3g9GT++AFTh7DrU+RS43T+J+AC/DUEdHOx6FwjF9VzU9VnAtVgNYj4L3ty1sUXKoxLXA6EcXYd6+JyQkzAyv9oSaX3JMSj4fsAn71xmNx3go0wfYi2IeXL+hg9Dy5b5DyjgD4BPZ3d62bz3vQk4ArAkfOTxbwAnl7j2wW9R5mGAT7ESxBy84njSBJ/Gli2bXbCjAc7w4vNM1w7v1PLmgSvO0DkEsCybQrl/BniiYW+hqD94MqC9nGQSQqoO4rtg5DeBnX0ZO8hTwduj3MnAXgCV52AJH2G0m+aJJB0tHAxcBHAFEoOXa7YfAp4DYpHVoCj9OwXYD9gMYFeY/h0otPdpgDazWz4b4DTP54FQwq6668GyVrrz4sWVf7SVa7YfAR4A+Ls38RXEfRVeH19GAMOBNYEQdaIac8Ir11JgGfB6z2f8i1qGQft1APqW/4cCfYUbD7wF0GaOtFch41DpJgEq5rNt2soT1yvAckAiBsSAGBADYkAMiAExIAbEgBgQA2JADIgBMSAGxIAYEANiQAyIATEgBsSAGBADYkAMiAExIAbEgBgQAx3FQMgpkIPBnO9pl5yb/SHwDsBVQVUKpyDS3qYenHbJaYidKqvDsIHTLjvV1iS7OO2S00uDi88g3gDWTAE4d7U5f3U0PrNONmgfwpVUiwGu1+Sk+5DCBR8TAc4V3xrggoCNgPeBps3d+LwQ4JpS6skVPZxHHaPQVtpJP9O/mwGcI+/LtyjarPDiwTnT9Cv9OR9YADwO0P9exXUQM4gOAA4E9gB2B0ILr8I7AFw941vYgA8DdgNo8wQgj8xG4luA+4Db8mSsKO1GqPdgYFeA9k4CJMkMcDEElyHeAdwJMKBNC4P3NIAKs/vIs3FVeAl18yrhUxis3wbuB1zYyVuAG4EvARaFV9nvAw8BLuytWxm8Ks8ApgImhTtRzAGsOMZ3EH8NtrLb5MvemSjbkrPPhD7PerTXF48Wy2VX+3KA669NyEhocRXANbKWCPMVxFvCTvY0Qtj6Guo5H6hSdkLls4AQ9tatDt7qHV+lc1n3LsDDgEXyfQTxMbD1hQrs/T3qHAuElhNRIfeEsujfTtGJmwZcCHBjheAyDTV2A1bJdB3EX4atJLwqe/+MuqcAoYRjG7xHr8reutV7KbheO5RzWQ9HJN8FLBPtMogZwB8ZsJd7NbE771sYwJZ926m63QzeuXeZd9kRNXCUzTqRroL4BGO2PgZ9fO4VxROWdd92sn4/Bv+uH/miyF7haNpzQAwkughinrA4u8qavb6eJe9l0FZr3IfQ5yz4wZv8F0oOYYSLOsoGMXdtfMKwvec69vIYlBfLCdpF+7BcBsci9nHs30+LOxZ/LRs+ULcyQczuzEXG7f0Y+k0FXMmVKGggh/peHScc/9jAlXNZDu/BngRicmqZIGZw8Gxo3d6Z0JGz5MrK4SjAwsCddb5D63dOHseu0ibxMTi+RZs0nXSYs7EGR2DQPtCRvikj7HVwMKtdGyhTh/IWY+B4ZJuUNWuaAznZ/aSsBXVAOg5m7R+RHcdB11VL6MvHhTHZW8LU6LJOhMZHZ9U6LYj3RiEhJxlk1dlXun9EwcN9Fe6h3Gkok6PKRYVdaRdd8qL1K186A0fh8LrpSRpHk4KYvw0FMp8JslRkPA0ftE8zruNA9bgIv+gAF8c6Dh1YoL6bYmBnaJPJv0lBzAZNJ7O7VRc5CIZuGqGxvJoWmbK3G/KxyyaxzcCuWdRLCuLPICMbNJ+X1kV4wgoy7c0xoVxptG3OMjmgtWfOPEpeDQP0E0/SqWMfSUG8DTLlbRjVmOiu1snuigpaEp07KmeN7IZPyplHyathgO+B5mzJNdOqbxXEdRrQWgsEcSQ+VsnrK/a06naSjtW3XLPPwa3UXmLSZZpd6XGxWl1Ab17JhhfIZyXLaCjCLjInJGQR2spAlsTBALdGGgy80krdpCsxL99mtg9ppbjD33nC4hkvVhkLxdmbyCojkJBdakkcDLBtpo5PJQVxHKa505JXsZiF+sduQ8z8+9adPazUXlYnBjEbdCfa5buxqPxIGUhq7LxPTrpXjsVEnrW4iEGSzECSz5NT6lcLDNBfqT5LOrgEmYhYhZvHL4pV+QB6k5/3A9SjKtww8AGKIVpKUhA/j9TdLXPYP7AUKr5nX83KNFyGmglJHAw8DTWfSlM1KYjnIcP8tEzGjz1jXL+q1XsDCjxatRKqPxMDK5BqIfB6WuqkIKaDY3Uy74e5H7akNQO8VdKJrjU/lo7wCvwmkHr7kxTE3cjEzNwGJjbhvcPs2JQOrC938ngwcJ2qrhgDc5GNm/gvT8ueFMS8X3oJuC8to9FjNPh+o7pZUuteKJPaMCwpW2NdGIM86aZKUhDz0s1L+A2pOW0e/A3U4uirJJ0B3i7dlp5ERytm4C3UPyuLDklB3Mz3O3yILSBmNJXX/1QGeKK+PTWFDlbNwK+hwJNZlEgLYo5Q/zJLIUbS/BZ6/NmILjGo8SsoyccXEnsM8OJ5bVa10oKYffHLAXatY5ALYlDSkI7srl1tSB+p0svAzfh4Z+/X9E9pQcycvLG+Jr0IE0evgBYa0MrviovFW37SPOfgM+EfAHxcmknaBTELORuw/EjiRej3PSoqyc0Au23nArGNfeQ2NKIMl0DXOXn0zRLE7HadA1icysgu/zeApwBJMQZuQrYLi2VVLscM3Iryvuu4zH7FnYFvvMRbwrf6aVjsy77IxqmIluzKowvvn9YuZnq/XHykmKdepXXL12PgP8heb+cZcvR06OJiMbyCGERCRgK8Eig4w3PAweNtgGDyH6ipakdf5tBaBXEvmSPw8Q8G/Ft1+wpZP28F2QaDy5moMaShfev6jmNrFcT9CV0LX6+v0L99fd3pnx8Hz1v2pz/st6NR3StAKKIXo64TAdeiIF6ZUW6RyqcSoXxbx3o42WbcytSH/2UCquSEEN9O4JzoLTyZpyBuTSy54eMO3/6tU/l8JHoSsAZgRoZAk4OBWcBSwJVDuJqK3Y3DgNUBX6IgTmeWI99fBXjvxseMrvxbp3L4KPQ14AKAWwybFW5wPQ34GfAcwCDM6yg2Eubl444DgBAb9imIQXQG4ej1ccAdwALgAyCvf+uWnoHL9e2nA2MAL+IySHi2mdkDbnbN4DgE2AxgA+DIJzEIoDNZ99sAn9EuAZ4AOM2Tq6feBCS2GKCPftGD0fj/eYA9ML5mhP4dBfBemr6tm7BNs/1zyiRnvy0C7gduB3g74lVYeQgZjko2ATYCmkE8DJ8XAtwqpsoF6vuift5zszHGKLdA6b8HeEKsStjlngzwJF3HIObMxxXA0wADmQEdTFxeidOUZtd6Xg/S0ulYnAzwBMIrj6QCBngGkYgBMRAxAwriiJ0n1cUAGVAQqx2IgcgZUBBH7kCpLwYUxGoDYiByBhTEkTtQ6osBBbHagBiInAEFceQOlPpiQEGsNiAGImcg1IytyGnqKPU5v3k8wAUMvmQoCuZ7sTgvXuKZAQWxZ4INFs+9nG4EPvaoG3t4nEvM6baLAc4p5uKWu4FngaBzi1FfR4uCuKPdm2gc12ZzIUoomYKKDgBOBrjCh6vVrgC4cIMBLinJgO6JSxIYYfaqroLsYq8D7AVcCTwEnAKMAyQlGFAQlyBPWUsxsCFyTwf+BJwAcFMJSQEGFMQFSFMWpwxwnfmMHkx0WnJNClMQ18TREZh5HHTk2yy4SYMkBwMK4hxkKal3BriVE0fOD/JeUwdVoCDuIGd2iCncvP46gPuzSTIwoCDOQJKSBGeAe3ZdA+wZvOYIK1QQR+i0mqjMHTQvBrizpiSFAQVxCjk6VDkDO0ODf6lcC+MKKIiNO0jqdZ0KDjTQldIQFMQp5OiQGQbOhyY+X+VjxtAiiiiIi7CmPKEZ2AkVHh260ljqUxDH4inp+VVQoKmZCe1AQZxAin4yycB20GqqSc0qVkpBXLEDVH1mBoYg5Rcyp65RQgVxjZzdAaYe2AE2ODdBQeycUhXokYH1UPZWHsuPsmgFcZRuq63S3FRAUzEHuF9BPIAQfTXNwFBop2mYA1ykIB5AiL6aZ2Bz8xoGVlBBHJhwVVeagTGlS+iwAhTEHebQGpjDrXAlfRhQEHd1DerDR4wfY9c/L+d1s7ctPwpiv5uot3WAgwTcBP4TB+XEUoTPTe9j4aCfngrirq5FYGRpP1bi+kL9uSl7VuFbGWIOhJezGlqXdArirq6X4Oy/ROzwhdA9z4bwDOKYA4H2SvowoCBuXMXe7sNJbB8X5FR4CdLnzZOzCm/JP0TJ3d5Kj7RgBXHDcXw/UIzCbvEzORV/C+kfzJnHSnKebO+xoowVPRTEDU/chn/vWnFKDj0eQNrHc6RnUgb+XTnzWEn+HBR5zIoyVvRQEDc8cSf+vWHFKTn0mF1Qb/Y83sxRj5Wk90KROo3EZ+JdQdygiV3M2zMxZicRXxJ+a0F15iHfDQXzVpWNA3Izqqpc9cbBwDSo+R7AM30M+CP0XA0oKlxgz651DLZSx5nAIEAiBloywAYyC4ilUfPdvmWEr0u5G4jF3mPKGKu89WHgoEga9VzoyVedlJWjUAC75dYDmSebYWWNVf76MHAVTLXeqA906A7eG1u3d3eH9qqoGjAwFjZyVpDVhn21Yx9sjvI47dSqvXwfk0QM5GbgaOSw2Kj5jJRb1LiW41GgRXvnQK8yg3eueVJ5kTHwr9DXUsPuhj47euTwHGP28oQ1waO9KromDPwQdloIZM4mm+aZc75d4TLAgr0vQI+pnu1V8TVhYBXYeR5QZcN+EfV/LhDfHAH+fsX2zkf92tEykMPrVM2ZMHYJEDqY2aD3qIBo3kpUMdjFxQ18XYtEDHhh4BCU+hAQKpB/jrp8DGJlJefzSPhIIHvfRz2XA5yAIhEDXhlYF6XzPtnnVYonihO8WpG98FFI+hOAO4f4Onndh7I56UQiBoIysA9q+zGwHHDVuB9GWV8DNgSsyb5Q6ApgGeDKXj4+4utK1wckYqAyBjiT6Ayg6Bzk15D3VwDnBY8BrMsuUJD2zgSKBDMn0fwMOBbYAJA4YECrQhyQiCJ4NRkNTAa2Bjg4MxFYFWBjb8pifOgGHgX4HJQjzwuAFUBMsh6UHQ9sCnDgbRxA2/vaOwTfae/8HrDb/DLAhf1cPSVxxABJl5RngBvtsWHykdQawAhgMNC3UePrpztrduP/8wAbMxfmc1AnNlkKhfkslzaz+8//DNq+9vL7IqBp67P4zHxMKxEDYkAMiAExIAbEgBgQA2JADIgBMSAGxEBpBv4faIKzn44X65IAAAAASUVORK5CYII=") 0 0/cover;content:"";display:flex;height:19px;width:19px}html[data-theme=dark] .header-slack-link:before{filter:invert(100%)}.iconEdit_eYIM{margin-right:.3em;vertical-align:sub}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:.5rem;font-size:90%;padding:.3rem .5rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vbeJ{font-size:smaller;font-style:italic;margin-top:.2rem}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.breadcrumbHomeIcon_OVgt{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity .2s ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:.15s;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#docusaurus-base-url-issue-banner-container,.collapseSidebarButton_PEFL,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px;line-height:0;padding:0}.announcementBarContent_xLdY{flex:1 1 auto;font-size:85%;padding:5px 0;text-align:center}.announcementBarContent_xLdY a{color:inherit;text-decoration:underline}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_lCJq{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.main-wrapper{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg);position:sticky}.lastUpdated_vbeJ{text-align:right}.docItemCol_GujU{max-width:75%!important}.tocMobile_aoJ5{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;top:0;transition:background-color var(--ifm-transition-fast) ease}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_F8PC{padding:0 .3rem}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_aoJ5{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/010df87a.2ea3a143.js b/assets/js/010df87a.2ea3a143.js deleted file mode 100644 index 030bbb3f..00000000 --- a/assets/js/010df87a.2ea3a143.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[52],{3905:function(t,e,n){n.d(e,{Zo:function(){return c},kt:function(){return k}});var r=n(7294);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}function l(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function o(t){for(var e=1;e=0||(a[n]=t[n]);return a}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(a[n]=t[n])}return a}var u=r.createContext({}),p=function(t){var e=r.useContext(u),n=e;return t&&(n="function"==typeof t?t(e):o(o({},e),t)),n},c=function(t){var e=p(t.components);return r.createElement(u.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.createElement(r.Fragment,{},e)}},s=r.forwardRef((function(t,e){var n=t.components,a=t.mdxType,l=t.originalType,u=t.parentName,c=i(t,["components","mdxType","originalType","parentName"]),s=p(n),k=a,d=s["".concat(u,".").concat(k)]||s[k]||m[k]||l;return n?r.createElement(d,o(o({ref:e},c),{},{components:n})):r.createElement(d,o({ref:e},c))}));function k(t,e){var n=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var l=n.length,o=new Array(l);o[0]=s;var i={};for(var u in e)hasOwnProperty.call(e,u)&&(i[u]=e[u]);i.originalType=t,i.mdxType="string"==typeof t?t:a,o[1]=i;for(var p=2;p{t.d(n,{xA:()=>u,yg:()=>s});var r=t(6540);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function g(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var i=r.createContext({}),p=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):g(g({},n),e)),t},u=function(e){var n=p(e.components);return r.createElement(i.Provider,{value:n},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},y=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=p(t),y=a,s=m["".concat(i,".").concat(y)]||m[y]||c[y]||l;return t?r.createElement(s,g(g({ref:n},u),{},{components:t})):r.createElement(s,g({ref:n},u))}));function s(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,g=new Array(l);g[0]=y;var o={};for(var i in n)hasOwnProperty.call(n,i)&&(o[i]=n[i]);o.originalType=e,o[m]="string"==typeof e?e:a,g[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>g,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var r=t(8168),a=(t(6540),t(5680));const l={},g="Benchmarks",o={unversionedId:"reference/benchmarks",id:"reference/benchmarks",title:"Benchmarks",description:"This page contains performance benchmarks for raccoon.",source:"@site/docs/reference/benchmarks.md",sourceDirName:"reference",slug:"/reference/benchmarks",permalink:"/raccoon/reference/benchmarks",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/reference/benchmarks.md",tags:[],version:"current",frontMatter:{}},i={},p=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"WebSocket",id:"websocket",level:2},{value:"Setup",id:"setup",level:3},{value:"Result",id:"result",level:3}],u={toc:p},m="wrapper";function c(e){let{components:n,...t}=e;return(0,a.yg)(m,(0,r.A)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"benchmarks"},"Benchmarks"),(0,a.yg)("p",null,"This page contains performance benchmarks for raccoon."),(0,a.yg)("h2",{id:"table-of-contents"},"Table of Contents"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/benchmarks#websocket"},"Websocket"))),(0,a.yg)("h2",{id:"websocket"},"WebSocket"),(0,a.yg)("h3",{id:"setup"},"Setup"),(0,a.yg)("p",null,"Raccoon benchmarking was done using a client which creates multiple parallel connections to Raccoon in one go and then sends batches of events every 10 seconds.\nThis whole setup was deployed on a Kubernetes cluster running on GCP with one or multiple raccoon pods."),(0,a.yg)("h3",{id:"result"},"Result"),(0,a.yg)("p",null,"Following are the benchmarking results for various versions"),(0,a.yg)("table",null,(0,a.yg)("thead",{parentName:"table"},(0,a.yg)("tr",{parentName:"thead"},(0,a.yg)("th",{parentName:"tr",align:null},"Raccoon version"),(0,a.yg)("th",{parentName:"tr",align:null},"Duration"),(0,a.yg)("th",{parentName:"tr",align:null},"No. of Connections"),(0,a.yg)("th",{parentName:"tr",align:null},"No. of Raccoon Pods"),(0,a.yg)("th",{parentName:"tr",align:null},"No. of events/10s"),(0,a.yg)("th",{parentName:"tr",align:null},"Server Processing Latency(P95)"),(0,a.yg)("th",{parentName:"tr",align:null},"Server Processing Latency(Upper)"),(0,a.yg)("th",{parentName:"tr",align:null},"Workers Latency (mean p95)"),(0,a.yg)("th",{parentName:"tr",align:null},"Workers Latency (max upper)"),(0,a.yg)("th",{parentName:"tr",align:null},"Memory Used per pod"),(0,a.yg)("th",{parentName:"tr",align:null},"CPU Cores Used per pod"))),(0,a.yg)("tbody",{parentName:"table"},(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"v0.1.0"),(0,a.yg)("td",{parentName:"tr",align:null},"1 hour"),(0,a.yg)("td",{parentName:"tr",align:null},"10000"),(0,a.yg)("td",{parentName:"tr",align:null},"1"),(0,a.yg)("td",{parentName:"tr",align:null},"1500000"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 6 - 22 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 3 - 913 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1.7 - 7 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 2 - 140 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 711 - 870 MB"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 2.2")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"v0.1.0"),(0,a.yg)("td",{parentName:"tr",align:null},"1 hour"),(0,a.yg)("td",{parentName:"tr",align:null},"50000"),(0,a.yg)("td",{parentName:"tr",align:null},"3"),(0,a.yg)("td",{parentName:"tr",align:null},"25000"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 20 - 30 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 3 s"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 35 - 50 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 35 - 45 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1.0- 1.5 GB"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 0.3 - 0.6")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"v0.1.0"),(0,a.yg)("td",{parentName:"tr",align:null},"1 hour"),(0,a.yg)("td",{parentName:"tr",align:null},"50000"),(0,a.yg)("td",{parentName:"tr",align:null},"3"),(0,a.yg)("td",{parentName:"tr",align:null},"100000"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 3 - 5 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 2.5 s"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 20- 30 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 20 - 30 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"400 - 500 MB"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 0.7")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"v0.1.0"),(0,a.yg)("td",{parentName:"tr",align:null},"1 hour"),(0,a.yg)("td",{parentName:"tr",align:null},"100000"),(0,a.yg)("td",{parentName:"tr",align:null},"5"),(0,a.yg)("td",{parentName:"tr",align:null},"100000"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 3 - 9 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 2.5 s"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 20- 30 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 20 - 30 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1.7 - 2GB"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1")),(0,a.yg)("tr",{parentName:"tbody"},(0,a.yg)("td",{parentName:"tr",align:null},"v0.1.2"),(0,a.yg)("td",{parentName:"tr",align:null},"30 min"),(0,a.yg)("td",{parentName:"tr",align:null},"10000"),(0,a.yg)("td",{parentName:"tr",align:null},"1"),(0,a.yg)("td",{parentName:"tr",align:null},"1500000"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1 - 7.13k ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 1 - 7.13k ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 0.8 - 9.25 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 2 - 224 ms"),(0,a.yg)("td",{parentName:"tr",align:null},"~ 960MB -1.2GB"),(0,a.yg)("td",{parentName:"tr",align:null},"~ ~ 2.57")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/03be7dae.20ba7227.js b/assets/js/03be7dae.20ba7227.js deleted file mode 100644 index 04de2fe7..00000000 --- a/assets/js/03be7dae.20ba7227.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[729],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return f}});var r=n(7294);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 a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;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 l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),h=u(n),f=o,m=h["".concat(l,".").concat(f)]||h[f]||p[f]||a;return n?r.createElement(m,i(i({ref:t},s),{},{components:n})):r.createElement(m,i({ref:t},s))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=h;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var u=2;u")," to set a new limit."),(0,a.kt)("p",null,"Apart from OS configuration, there are configurations you can tune on Raccoon:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/configurations#server_websocket_max_conn"},"SERVER_WEBSOCKET_MAX_CONN")," To limit Raccoon resource utilization, we enforce a limit on WebSocket connection. The default value is 30000; adjust it if necessary.")),(0,a.kt)("h3",{id:"worker"},"Worker"),(0,a.kt)("p",null,"After the request is deserialized, the server puts the events on the buffer channel. The worker process events from the channel and publish them to Kafka. You can think of the worker and the channel as a buffer in case the publisher slows down temporarily."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/configurations#worker_buffer_channel_size"},"WORKER_BUFFER_CHANNEL_SIZE")," Buffer before the events get processed. The more the size, the longer it can tolerate a temporary spike or slow down."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/configurations#worker_pool_size"},"WORKER_POOL_SIZE")," The worker will call the publisher client and wait synchronously. Increase this according to the throughput.")),(0,a.kt)("h3",{id:"publisher"},"Publisher"),(0,a.kt)("p",null,"Currently, Raccoon is using ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go"},"Librd Kafka client Go wrapper")," as publisher client. There is plenty of guides out there to tune Kafka producer. Here are some configurations you can tune."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"PUBLISHER_KAFKA_CLIENT_BATCH_NUM_MESSAGES")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/configurations#publisher_kafka_client_acks"},"KAFKA_CLIENT_ACKS")),(0,a.kt)("li",{parentName:"ul"},"KAFKA_CLIENT_LINGER_MS"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/configurations#publisher_kafka_client_"},"PUBLISHER",(0,a.kt)("em",{parentName:"a"},"KAFKA_CLIENT"),"*")," You can put any ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"librd kafka configuration")," by replacing ","*"," and change the delimiter to underscore.")),(0,a.kt)("h2",{id:"backpressure"},"Backpressure"),(0,a.kt)("p",null,"You might see the ",(0,a.kt)("inlineCode",{parentName:"p"},"event_processing_duration_milliseconds")," keeps on increasing and ",(0,a.kt)("inlineCode",{parentName:"p"},"batch_idle_in_channel_milliseconds")," is in constant high value. In that case, Raccoon might get backpressure from the publisher. If that happens, you can check the publisher, or you need to tune the publisher configuration on Raccoon."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/03be7dae.333685c4.js b/assets/js/03be7dae.333685c4.js new file mode 100644 index 00000000..423139cf --- /dev/null +++ b/assets/js/03be7dae.333685c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[768],{5680:(e,n,o)=>{o.d(n,{xA:()=>u,yg:()=>d});var t=o(6540);function r(e,n,o){return n in e?Object.defineProperty(e,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[n]=o,e}function a(e,n){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),o.push.apply(o,t)}return o}function i(e){for(var n=1;n=0||(r[o]=e[o]);return r}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=t.createContext({}),c=function(e){var n=t.useContext(s),o=n;return e&&(o="function"==typeof e?e(n):i(i({},n),e)),o},u=function(e){var n=c(e.components);return t.createElement(s.Provider,{value:n},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},h=t.forwardRef((function(e,n){var o=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(o),h=r,d=p["".concat(s,".").concat(h)]||p[h]||g[h]||a;return o?t.createElement(d,i(i({ref:n},u),{},{components:o})):t.createElement(d,i({ref:n},u))}));function d(e,n){var o=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=h;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>g,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var t=o(8168),r=(o(6540),o(5680));const a={toc_max_heading_level:4},i="Troubleshooting",l={unversionedId:"guides/troubleshooting",id:"guides/troubleshooting",title:"Troubleshooting",description:"Scale Up Racoon",source:"@site/docs/guides/troubleshooting.md",sourceDirName:"guides",slug:"/guides/troubleshooting",permalink:"/raccoon/guides/troubleshooting",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/troubleshooting.md",tags:[],version:"current",frontMatter:{toc_max_heading_level:4},sidebar:"docsSidebar",previous:{title:"Monitoring",permalink:"/raccoon/guides/monitoring"},next:{title:"Architecture",permalink:"/raccoon/concepts/architecture"}},s={},c=[{value:"Scale Up Racoon",id:"scale-up-racoon",level:2},{value:"Server",id:"server",level:3},{value:"Worker",id:"worker",level:3},{value:"Publisher",id:"publisher",level:3},{value:"Kafka",id:"kafka",level:4},{value:"PubSub",id:"pubsub",level:4},{value:"Kinesis",id:"kinesis",level:4},{value:"Backpressure",id:"backpressure",level:2}],u={toc:c},p="wrapper";function g(e){let{components:n,...o}=e;return(0,r.yg)(p,(0,t.A)({},u,o,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"troubleshooting"},"Troubleshooting"),(0,r.yg)("h2",{id:"scale-up-racoon"},"Scale Up Racoon"),(0,r.yg)("p",null,"Internally, Raccoon has 3 main components that affect the capacity. The server, worker, and publisher. Each component has configurations that can be tune if necessary. Since those 3 components are forming a pipe, you need to make sure none of the components become a bottleneck."),(0,r.yg)("p",null,"To know the right configuration, you need to simulate with similar throughput as production. You can tune the configuration accordingly."),(0,r.yg)("p",null,"Following are details of what you can tune."),(0,r.yg)("h3",{id:"server"},"Server"),(0,r.yg)("p",null,"Raccoon is using WebSocket as a communication protocol from client to server. Websocket requires maintaining long-running connections. Each connection costs the OS an open file descriptor. When you reach the limit of the configured open file descriptor, the server won't be able to accept a new connection. By default, OS limit the number of the open file descriptor. You can look up how to increase the max open file descriptor. On Unix, you can do ",(0,r.yg)("inlineCode",{parentName:"p"},"ulimit -n")," to check max open file descriptor and ",(0,r.yg)("inlineCode",{parentName:"p"},"ulimit -n ")," to set a new limit."),(0,r.yg)("p",null,"Apart from OS configuration, there are configurations you can tune on Raccoon:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#server_websocket_max_conn"},"SERVER_WEBSOCKET_MAX_CONN")," To limit Raccoon resource utilization, we enforce a limit on WebSocket connection. The default value is 30000; adjust it if necessary.")),(0,r.yg)("h3",{id:"worker"},"Worker"),(0,r.yg)("p",null,"After the request is deserialized, the server puts the events on the buffer channel. The worker process events from the channel and publishes them downstream. You can think of the worker and the channel as a buffer in case the publisher slows down temporarily."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#worker_buffer_channel_size"},"WORKER_BUFFER_CHANNEL_SIZE")," Buffer before the events get processed. The more the size, the longer it can tolerate a temporary spike or slow down."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#worker_pool_size"},"WORKER_POOL_SIZE")," The worker will call the publisher client and wait synchronously. Increase this according to the throughput.")),(0,r.yg)("h3",{id:"publisher"},"Publisher"),(0,r.yg)("p",null,"Raccoon has support for ",(0,r.yg)("inlineCode",{parentName:"p"},"kafka"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"pubsub")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"kinesis")," publishers."),(0,r.yg)("h4",{id:"kafka"},"Kafka"),(0,r.yg)("p",null,"Currently, Raccoon is using ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go"},"Librd Kafka client Go wrapper")," as publisher client. There is plenty of guides out there to tune Kafka producer. Here are some configurations you can tune."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"PUBLISHER_KAFKA_CLIENT_BATCH_NUM_MESSAGES")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher_kafka_client_acks"},"PUBLISHER_KAFKA_CLIENT_ACKS")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher_kafka_client_"},"PUBLISHER","_","KAFKA","_","CLIENT_${conf}")," You can put any ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"librd kafka configuration")," by replacing ",(0,r.yg)("inlineCode",{parentName:"li"},"${conf}")," with upper case'd configuration key and changing the delimiter to underscore. For example, to use ",(0,r.yg)("inlineCode",{parentName:"li"},"log.queue=true"),", you can set ",(0,r.yg)("inlineCode",{parentName:"li"},"PUBLISHER_KAFKA_CLIENT_LOG_QUEUE=true"))),(0,r.yg)("h4",{id:"pubsub"},"PubSub"),(0,r.yg)("p",null,"Raccoon uses ",(0,r.yg)("a",{parentName:"p",href:"https://pkg.go.dev/cloud.google.com/go/pubsub"},"cloud.google.com/go/pubsub")," as the producer client for publishing events to Google Cloud PubSub."),(0,r.yg)("p",null,"The default quota limits for writes are:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"4GiB/second for large regions"),(0,r.yg)("li",{parentName:"ul"},"800MiB/second for medium regions"),(0,r.yg)("li",{parentName:"ul"},"200MiB/second for small regions")),(0,r.yg)("p",null,"A single message (event) must not be bigger 10MiB. Although this limit can be increased by submitting a quota increase request."),(0,r.yg)("p",null,"Since PubSub is a managed service, you generally only need to worry about hitting quotas or rate limits. Refer to ",(0,r.yg)("a",{parentName:"p",href:"https://cloud.google.com/pubsub/quotas"},"PubSub documentation")," for more information. "),(0,r.yg)("h4",{id:"kinesis"},"Kinesis"),(0,r.yg)("p",null,"Raccoon uses ",(0,r.yg)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/kinesis"},"github.com/aws/aws-sdk-go-v2/service/kinesis")," as the producer client for publishing events to AWS Kinesis."),(0,r.yg)("p",null,"AWS Kinesis Data Stream come into two modes:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Provisioned"),(0,r.yg)("li",{parentName:"ul"},"On-Demand")),(0,r.yg)("p",null,"With Provisioned mode, your throughput is computed using the formlua:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre"},"Throughput/Second = Number of Shards * 1MiB\nRecords/Second = Number of Shards * 1000\n")),(0,r.yg)("p",null,"Shards are the basic unit of capacity in Kinesis. Make sure to create enough shards to accomodate your expected throughtput."),(0,r.yg)("p",null,"With On-Demand mode, the capcity of your stream updates dynamically depending on demand. The lower bound for writes is 4 MiB/second with an upper bound of 200MiB/second. You can request an increase of this quota up to 2 GiB/second by submitting a support request."),(0,r.yg)("p",null,"A single message (event) must not exceed 1MiB in size. This is a hard limit and you cannot request an increase."),(0,r.yg)("p",null,"see ",(0,r.yg)("a",{parentName:"p",href:"https://docs.aws.amazon.com/streams/latest/dev/service-sizes-and-limits.html"},"AWS Kinesis documentation")," for more information."),(0,r.yg)("h2",{id:"backpressure"},"Backpressure"),(0,r.yg)("p",null,"You might see the ",(0,r.yg)("inlineCode",{parentName:"p"},"event_processing_duration_milliseconds")," keeps on increasing and ",(0,r.yg)("inlineCode",{parentName:"p"},"batch_idle_in_channel_milliseconds")," is in constant high value. In that case, Raccoon might get back-pressure from the publisher. If that happens, you can check the publisher, or you need to tune the publisher configuration on Raccoon."))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0dffb83e.0b9a3148.js b/assets/js/0dffb83e.0b9a3148.js deleted file mode 100644 index cf3183f0..00000000 --- a/assets/js/0dffb83e.0b9a3148.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[75],{3905:function(e,t,n){n.d(t,{Zo:function(){return l},kt:function(){return m}});var r=n(7294);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 a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;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 c=r.createContext({}),u=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),d=u(n),m=o,f=d["".concat(c,".").concat(m)]||d[m]||p[m]||a;return n?r.createElement(f,i(i({ref:t},l),{},{components:n})):r.createElement(f,i({ref:t},l))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var u=2;u{n.d(t,{xA:()=>u,yg:()=>h});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=o.createContext({}),l=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(n),m=r,h=p["".concat(c,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=n(8168),r=(n(6540),n(5680));const a={},i="Roadmap",s={unversionedId:"roadmap",id:"roadmap",title:"Roadmap",description:"In the following section, you can learn what features we're working on, what stage they're in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the discussions on the Raccoon Github forum.",source:"@site/docs/roadmap.md",sourceDirName:".",slug:"/roadmap",permalink:"/raccoon/roadmap",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/roadmap.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Quickstart",permalink:"/raccoon/quickstart"},next:{title:"Overview",permalink:"/raccoon/guides/overview"}},c={},l=[{value:"Vision",id:"vision",level:2},{value:"Raccoon 1.x",id:"raccoon-1x",level:3}],u={toc:l},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.yg)(p,(0,o.A)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"roadmap"},"Roadmap"),(0,r.yg)("p",null,"In the following section, you can learn what features we're working on, what stage they're in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/discussions"},"discussions")," on the Raccoon Github forum."),(0,r.yg)("p",null,"We\u2019re planning to iterate on the format of the roadmap itself, and we see the potential to engage more in discussions about the future of Raccoon features. If you have feedback about this roadmap section itself, such as how the issues are presented, let us know through ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/discussions"},"discussions"),"."),(0,r.yg)("h2",{id:"vision"},"Vision"),(0,r.yg)("p",null,"We want to enable Raccoon as the preferred event collector and event distributor that provides high volume, high throughput, low latency protocol-agnostic, and event-agnostic APIs for data ingestion in near-real-time. With this vision, Raccoon can serve the needs of "),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Adtech streams - Where digital marketing data from external sources can be ingested into the organization backends"),(0,r.yg)("li",{parentName:"ul"},"Clickstream - Where user behavior data can be streamed in real-time"),(0,r.yg)("li",{parentName:"ul"},"Edge networks - Where devices ","(","say in the IoT world",")"," need to send data to the cloud. Event Sourcing systems - Such as Stock updates dashboards, autonomous/self-drive use cases")),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(5979).A,width:"1092",height:"692"})),(0,r.yg)("h3",{id:"raccoon-1x"},"Raccoon 1.x"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Support for HTTP, gRPC"),(0,r.yg)("li",{parentName:"ul"},"Support for json, protobuf formats"),(0,r.yg)("li",{parentName:"ul"},"Extendable event distribution"),(0,r.yg)("li",{parentName:"ul"},"Extendable event filtering capability"),(0,r.yg)("li",{parentName:"ul"},"Enable Raccoon to replay lost events with zero-data-loss capability."),(0,r.yg)("li",{parentName:"ul"},"Adopt Raccoon to publish to different transport systems"),(0,r.yg)("li",{parentName:"ul"},"Enables Raccoon to provide extendable data formatters. eg. JSON to proto")))}d.isMDXComponent=!0},5979:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/raccoon_vision-0997b7e2bd89e4c51458d9b754a1b7d8.png"}}]); \ No newline at end of file diff --git a/assets/js/1425879c.4c1a0589.js b/assets/js/1425879c.4c1a0589.js new file mode 100644 index 00000000..2d2377a0 --- /dev/null +++ b/assets/js/1425879c.4c1a0589.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[228],{5680:(e,t,n)=>{n.d(t,{xA:()=>c,yg:()=>y});var a=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;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 l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},g="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),g=p(n),d=r,y=g["".concat(l,".").concat(d)]||g[d]||u[d]||o;return n?a.createElement(y,i(i({ref:t},c),{},{components:n})):a.createElement(y,i({ref:t},c))}));function y(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[g]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(8168),r=(n(6540),n(5680));const o={},i="Publishing Events",s={unversionedId:"guides/publishing",id:"guides/publishing",title:"Publishing Events",description:"EndPoints",source:"@site/docs/guides/publishing.md",sourceDirName:"guides",slug:"/guides/publishing",permalink:"/raccoon/guides/publishing",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/publishing.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Overview",permalink:"/raccoon/guides/overview"},next:{title:"Deployment",permalink:"/raccoon/guides/deployment"}},l={},p=[{value:"EndPoints",id:"endpoints",level:2},{value:"Authorization/Authentication",id:"authorizationauthentication",level:3},{value:"HTTP backend",id:"http-backend",level:3},{value:"gRPC backend",id:"grpc-backend",level:3},{value:"Data Formatters",id:"data-formatters",level:2},{value:"Protobuf",id:"protobuf",level:3},{value:"JSON",id:"json",level:3},{value:"Headers",id:"headers",level:2},{value:"gRPC",id:"grpc",level:2},{value:"Topics",id:"topics",level:2}],c={toc:p},g="wrapper";function u(e){let{components:t,...o}=e;return(0,r.yg)(g,(0,a.A)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"publishing-events"},"Publishing Events"),(0,r.yg)("h2",{id:"endpoints"},"EndPoints"),(0,r.yg)("p",null,"Raccoon can be hosted behind a proxy/API GW, a sample of blocks as below."),(0,r.yg)("p",null,(0,r.yg)("img",{src:n(5516).A,width:"513",height:"161"})),(0,r.yg)("p",null,"The HTTP API path which accepts events is:"),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"/api/v1/events")),(0,r.yg)("p",null,"This path can be used for sending events by either connecting via websocket connection or as a normal REST API Request."),(0,r.yg)("p",null,"HTTP methods used for Endpoints are:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"Websocket")," - GET"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"REST")," - POST")),(0,r.yg)("h3",{id:"authorizationauthentication"},"Authorization/Authentication"),(0,r.yg)("p",null,"Raccoon does not provide features to perform any authorization or authentication of the user/client initiating the connection. It accepts connections as trusted ","(","and assumes any such auth is already performed",")"),(0,r.yg)("h3",{id:"http-backend"},"HTTP backend"),(0,r.yg)("p",null,"SSL termination is outside the scope of Raccoon, and the service API accepts HTTP connections assuming that the SSL is terminated at a proxy or ELB before reaching Raccoon."),(0,r.yg)("h3",{id:"grpc-backend"},"gRPC backend"),(0,r.yg)("p",null,"Similar to HTTP SSL termination is outside the scope of Raccoon, and the service API accepts connections assuming SSL is terminated at a proxy or ELB before reaching Raccoon."),(0,r.yg)("h2",{id:"data-formatters"},"Data Formatters"),(0,r.yg)("p",null,"Raccoon supports Protobuf and JSON as the primary data formatters. Protobuf can be used to send event via websocket, REST or gRPC whereas JSON is supported only for websocket and REST endpoint."),(0,r.yg)("p",null,"With a websocket connection the content type is identified based on the message type. If the message type is binary it is assumed that the formatting is protobuf and if the message type is text then formatting is assumed to be JSON."),(0,r.yg)("h3",{id:"protobuf"},"Protobuf"),(0,r.yg)("p",null,"Raccoon accepts a SendEventRequest proto that wraps multiple Event proto. This enables clients to send an event in real-time or multiple events in batches."),(0,r.yg)("p",null,"Refer to ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"raccoon.proto")," to learn how you can build the request."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-protobuf"},"message SendEventRequest {\n string req_guid = 1;\n google.protobuf.Timestamp sent_time = 2;\n repeated Event events = 3;\n}\n")),(0,r.yg)("p",null,"Where :"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"req_guid")," - A globally unique ID generated by the client denoting this request as unique "),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"sent_time")," - This is when the event is sent over the WebSocket in protobuf timestamp format. This time is used to calculate latencies in Raccoon. "),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"events")," - events of type Event proto. Refer to the ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"raccoon.proto")," to learn more.")),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-protobuf"},"message Event {\n\n // Data/byteArray of the serialised product proto.\n bytes eventBytes = 1;\n\n /* This is the protoMessageName which the protoc provides \n * with each compiled proto. This type is used by raccoon \n * to distribute events to respective topics.\n */\n string type = 2;\n}\n")),(0,r.yg)("p",null,"Where:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"eventBytes")," - is a byte array serialized by the event proto ","(","eg. ViewedEvent.proto",")"," serializer client "),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("strong",{parentName:"li"},"type")," - event type which Raccoon uses to distribute the events to topics. More details in the following sections.")),(0,r.yg)("p",null,"Clients build the event array and compose the SendEventRequest proto, then send them through the WebSocket client."),(0,r.yg)("p",null,"Raccoon also wires a response every time a message is read and processed."),(0,r.yg)("p",null,"Refer to the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"raccoon.proto")," that Raccoon sends for every event."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-protobuf"},"message SendEventResponse {\n Status status = 1;\n Code code = 2;\n int64 sent_time = 3; /* time when the response is generated */\n string reason = 4; /* failure reasons if any */\n map data = 5; /* Usually detailing the success/failures */\n}\n\nenum Status {\n UNKNOWN_STATUS = 0;\n SUCCESS = 1; /* signifies request success */\n ERROR = 2; /* server request failures */\n}\n\nenum Code {\n UNKNOWN_CODE = 0;\n OK = 1; /* successfully read and deserialized */\n BAD_REQUEST = 2; /* usually deserialization failures */\n INTERNAL_ERROR = 3; /* server runtime errors */\n MAX_CONNECTION_LIMIT_REACHED = 4; /* max connection reached at the server */\n MAX_USER_LIMIT_REACHED = 5; /* user reached max connections allowed. Defaults to 1 */\n}\n")),(0,r.yg)("p",null,"The above response model is self-explanatory. Clients can choose to retry for error codes such as Code=","[","3","|","4","]"),(0,r.yg)("h3",{id:"json"},"JSON"),(0,r.yg)("p",null,"Sample JSON SendEventRequest"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-json"},'{\n "req_guid": "1234abcd",\n "sent_time": {\n "seconds": 1638154927,\n "nanos": 376499000\n },\n "events": [\n {\n "eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",\n "type": "booking"\n }\n ]\n}\n')),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Parameter"),(0,r.yg)("th",{parentName:"tr",align:null},"Data Type"),(0,r.yg)("th",{parentName:"tr",align:null},"Description"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"req_guid"),(0,r.yg)("td",{parentName:"tr",align:null},"string"),(0,r.yg)("td",{parentName:"tr",align:null},"A globally unique Identifier generated by the client.")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"sent_time"),(0,r.yg)("td",{parentName:"tr",align:null},"Object"),(0,r.yg)("td",{parentName:"tr",align:null},"Unix time in seconds+nanoseconds when the event is sent to Raccoon")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"events"),(0,r.yg)("td",{parentName:"tr",align:null},"Array(Object)"),(0,r.yg)("td",{parentName:"tr",align:null},"Array of event objects")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"events.eventBytes"),(0,r.yg)("td",{parentName:"tr",align:null},"string"),(0,r.yg)("td",{parentName:"tr",align:null},"base64 string of bytes generated by json serializion of EventProto")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"events.type"),(0,r.yg)("td",{parentName:"tr",align:null},"string"),(0,r.yg)("td",{parentName:"tr",align:null},"Event type which Raccoon uses to distribute the events to topics")))),(0,r.yg)("p",null,"Sample JSON SendEventResponse"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-json"},'{\n "status": 1,\n "code": 1,\n "sent_time": 1638155915,\n "data": {\n "req_guid": "1234abcd"\n }\n}\n')),(0,r.yg)("table",null,(0,r.yg)("thead",{parentName:"table"},(0,r.yg)("tr",{parentName:"thead"},(0,r.yg)("th",{parentName:"tr",align:null},"Parameter"),(0,r.yg)("th",{parentName:"tr",align:null},"Data Type"),(0,r.yg)("th",{parentName:"tr",align:null},"Description"))),(0,r.yg)("tbody",{parentName:"table"},(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"status"),(0,r.yg)("td",{parentName:"tr",align:null},"int"),(0,r.yg)("td",{parentName:"tr",align:null},"status of the send event request")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"code"),(0,r.yg)("td",{parentName:"tr",align:null},"int"),(0,r.yg)("td",{parentName:"tr",align:null},"response code")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"sent_time"),(0,r.yg)("td",{parentName:"tr",align:null},"int"),(0,r.yg)("td",{parentName:"tr",align:null},"sent time in seconds")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"data"),(0,r.yg)("td",{parentName:"tr",align:null},"int"),(0,r.yg)("td",{parentName:"tr",align:null},"data map sent by the server, currently contains just the req_guid")),(0,r.yg)("tr",{parentName:"tbody"},(0,r.yg)("td",{parentName:"tr",align:null},"reason"),(0,r.yg)("td",{parentName:"tr",align:null},"string"),(0,r.yg)("td",{parentName:"tr",align:null},"reason for any failure if any")))),(0,r.yg)("p",null,"Values of status and codes is same as defined in Proto."),(0,r.yg)("h2",{id:"headers"},"Headers"),(0,r.yg)("p",null,"Raccoon service accepts headers to identify a user connection uniquely. The header name is made configurable as it enables clients to specify a header name that works for them. For, e.g. for a mobile app having a request header as ",(0,r.yg)("inlineCode",{parentName:"p"},"X-User-ID")," which identifies the user ","(","client",")"," connecting to Raccoon, can configure Raccoon service with the config set as below ",(0,r.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID"),". Optionally, ",(0,r.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," can also be configured to ",(0,r.yg)("a",{parentName:"p",href:"/raccoon/concepts/architecture#connections"},"support multi-tenancy")," such as multiple apps connecting to a single Raccoon instance."),(0,r.yg)("p",null,"Raccoon uses the config to fetch the header name and uses the value passed in the request header with this name, as the connection id. This header name uniquely identifies a client. A client, in this case, can be the user in the app."),(0,r.yg)("p",null,"The following header is a sample providing a user id: 654785432. Once the client initiates a WebSocket upgrade request over Raccoon, assuming the request is upgraded, and the client connection is established, Racoon accepts the header and extracts the user id to build a connection map. This map helps deduplicate connections for a user within the same raccoon instance."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-json"},'{\n "X-User-ID": "654785432"\n}\n')),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"Content-Type")," header is mandatory for sending event using REST API."),(0,r.yg)("p",null,"Following are the supported ",(0,r.yg)("inlineCode",{parentName:"p"},"Content-Type")," headers for various data formats:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Protobuf - ",(0,r.yg)("inlineCode",{parentName:"li"},"application/proto")),(0,r.yg)("li",{parentName:"ul"},"JSON - ",(0,r.yg)("inlineCode",{parentName:"li"},"application/json"))),(0,r.yg)("h2",{id:"grpc"},"gRPC"),(0,r.yg)("p",null,"Events can be sent to Raccoon using gRPC too."),(0,r.yg)("p",null,"Refer to ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"EventService")," for the definition of ",(0,r.yg)("inlineCode",{parentName:"p"},"EventService")," which exposes one RPC call ",(0,r.yg)("inlineCode",{parentName:"p"},"SendEvent"),". It is recommended to generate the language specific gRPC client using the proto definition."),(0,r.yg)("p",null,"Input to the RPC call is ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventRequest")," and the output is ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventResponse"),"."),(0,r.yg)("p",null,"To support multi-tenancy while using gRPC, ",(0,r.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," values can be used. The key along with their values should be set in the grpc metadata while sending the request. Golang client example -"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-go"},'md := metadata.New(map[string]string{"X-User-ID": "1234"})\nctx := metadata.NewOutgoingContext(context.Background(), md)\nr, err := client.SendEvent(ctx, req)\n')),(0,r.yg)("h2",{id:"topics"},"Topics"),(0,r.yg)("p",null,"Raccoon distributes events to a topic based on the event type. The protobuf section above clarifies how the type should be set in the event. The type is a string literal. For example, ViewedEvent - which signifies that the user viewed something on the app or the site can have its event type set as below ",(0,r.yg)("inlineCode",{parentName:"p"},"type = viewedevent")),(0,r.yg)("p",null,"When raccoon API consumes a batch array of events ","(","events in SendEventRequest proto",")",", it deserializes them and fetches the individual events ","(","using the SendEventRequest proto",")",", and constructs the topic to send each event to based on the ",(0,r.yg)("inlineCode",{parentName:"p"},"type")," field set in each of the events."),(0,r.yg)("p",null,"The following code determines the topic name."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-go"},'topic := strings.Replace(p.topicFormat, "%s", event.Type, 1)\n')),(0,r.yg)("p",null,"where ",(0,r.yg)("strong",{parentName:"p"},"topicformat")," - is the configured pattern ",(0,r.yg)("inlineCode",{parentName:"p"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")," ",(0,r.yg)("strong",{parentName:"p"},"type")," - is the type set by the client when the event proto is generated"),(0,r.yg)("p",null,"For e.g. setting the"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log\n")),(0,r.yg)("p",null,"and a type such as ",(0,r.yg)("inlineCode",{parentName:"p"},"type=viewedevent")," in the event"),(0,r.yg)("p",null,"will have the topic name as ",(0,r.yg)("inlineCode",{parentName:"p"},"topic-viewedevent-log")))}u.isMDXComponent=!0},5516:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/raccoon_ep-2f003a95743c872cbd23fe5f2cf5fb1e.png"}}]); \ No newline at end of file diff --git a/assets/js/1425879c.b1efae2f.js b/assets/js/1425879c.b1efae2f.js deleted file mode 100644 index 2cc3cd60..00000000 --- a/assets/js/1425879c.b1efae2f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[285],{3905:function(e,t,n){n.d(t,{Zo:function(){return p},kt:function(){return h}});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;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 l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),h=r,m=d["".concat(l,".").concat(h)]||d[h]||u[h]||o;return n?a.createElement(m,i(i({ref:t},p),{},{components:n})):a.createElement(m,i({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c data = 5;\n}\n\nenum Status {\n UNKNOWN_STATUS = 0;\n /* signifies request success */\n SUCCESS = 1;\n /* server request failures */\n ERROR = 2;\n}\n\nenum Code {\n UNKNOWN_CODE = 0;\n /* successfully read and deserialized */\n OK = 1;\n /* usually deserialization failures */\n BAD_REQUEST = 2;\n /* server runtime errors */\n INTERNAL_ERROR = 3;\n /* signifies max connection reached at the server */\n MAX_CONNECTION_LIMIT_REACHED = 4;\n /* signifies a user reached max connections allowed.Defaults to 1 */\n MAX_USER_LIMIT_REACHED = 5;\n}\n")),(0,o.kt)("p",null,"The above response model is self-explanatory. Clients can choose to retry for error codes such as Code=","[","3","|","4","]"),(0,o.kt)("h3",{id:"json"},"JSON"),(0,o.kt)("p",null,"Sample JSON SendEventRequest"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'{\n "req_guid": "1234abcd",\n "sent_time": {\n "seconds": 1638154927,\n "nanos": 376499000\n },\n "events": [\n {\n "eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",\n "type": "booking"\n }\n ]\n}\n')),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Parameter"),(0,o.kt)("th",{parentName:"tr",align:null},"Data Type"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"req_guid"),(0,o.kt)("td",{parentName:"tr",align:null},"string"),(0,o.kt)("td",{parentName:"tr",align:null},"A globally unique Identifier generated by the client.")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"sent_time"),(0,o.kt)("td",{parentName:"tr",align:null},"Object"),(0,o.kt)("td",{parentName:"tr",align:null},"Unix time in seconds+nanoseconds when the event is sent to Raccoon")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"events"),(0,o.kt)("td",{parentName:"tr",align:null},"Array(Object)"),(0,o.kt)("td",{parentName:"tr",align:null},"Array of event objects")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"events.eventBytes"),(0,o.kt)("td",{parentName:"tr",align:null},"string"),(0,o.kt)("td",{parentName:"tr",align:null},"base64 string of bytes generated by json serializion of EventProto")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"events.type"),(0,o.kt)("td",{parentName:"tr",align:null},"string"),(0,o.kt)("td",{parentName:"tr",align:null},"Event type which Raccoon uses to distribute the events to Kafka topics")))),(0,o.kt)("p",null,"Sample JSON SendEventResponse"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-json"},'{\n "status": 1,\n "code": 1,\n "sent_time": 1638155915,\n "data": {\n "req_guid": "1234abcd"\n }\n}\n')),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:null},"Parameter"),(0,o.kt)("th",{parentName:"tr",align:null},"Data Type"),(0,o.kt)("th",{parentName:"tr",align:null},"Description"))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"status"),(0,o.kt)("td",{parentName:"tr",align:null},"int"),(0,o.kt)("td",{parentName:"tr",align:null},"status of the send event request")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"code"),(0,o.kt)("td",{parentName:"tr",align:null},"int"),(0,o.kt)("td",{parentName:"tr",align:null},"response code")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"sent_time"),(0,o.kt)("td",{parentName:"tr",align:null},"int"),(0,o.kt)("td",{parentName:"tr",align:null},"sent time in seconds")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"data"),(0,o.kt)("td",{parentName:"tr",align:null},"int"),(0,o.kt)("td",{parentName:"tr",align:null},"data map sent by the server, currently contains just the req_guid")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:null},"reason"),(0,o.kt)("td",{parentName:"tr",align:null},"string"),(0,o.kt)("td",{parentName:"tr",align:null},"reason for any failure if any")))),(0,o.kt)("p",null,"Values of status and codes is same as defined in Protos."),(0,o.kt)("h2",{id:"headers"},"Headers"),(0,o.kt)("p",null,"Raccoon service accepts headers to identify a user connection uniquely. The header name is made configurable as it enables clients to specify a header name that works for them. For, e.g. for a mobile app having a request header as ",(0,o.kt)("inlineCode",{parentName:"p"},"X-User-ID")," which identifies the user ","(","client",")"," connecting to Raccoon, can configure Raccoon service with the config set as below ",(0,o.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID"),". Optionally, ",(0,o.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," can also be configured to ",(0,o.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/concepts/architecture#connections"},"support multitenancy")," such as multiple apps connecting to a single Raccoon instance."),(0,o.kt)("p",null,"Raccoon uses the config to fetch the header name and uses the value passed in the request header with this name, as the connection id. This header name uniquely identifies a client. A client, in this case, can be the user in the app."),(0,o.kt)("p",null,"The following header is a sample providing a user id: 654785432. Once the client initiates a WebSocket upgrade request over Raccoon, assuming the request is upgraded, and the client connection is established, Racoon accepts the header and extracts the user id to build a connection map. This map helps deduplicate connections for a user within the same raccoon instance."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-text"},'{\n "X-User-ID": "654785432"\n}\n')),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"Content-Type")," header is mandatory for sending event using REST API."),(0,o.kt)("p",null,"Following are the supported ",(0,o.kt)("inlineCode",{parentName:"p"},"Content-Type")," headers for various data formats:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Protobufs - ",(0,o.kt)("inlineCode",{parentName:"li"},"application/proto")),(0,o.kt)("li",{parentName:"ul"},"JSON - ",(0,o.kt)("inlineCode",{parentName:"li"},"application/json"))),(0,o.kt)("h2",{id:"grpc"},"gRPC"),(0,o.kt)("p",null,"Events can be sent to Raccoon using gRPC too."),(0,o.kt)("p",null,"Refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/EventService.proto"},"EventService.proto")," for the definition of ",(0,o.kt)("inlineCode",{parentName:"p"},"EventService")," which exposes one RPC call ",(0,o.kt)("inlineCode",{parentName:"p"},"SendEvent"),". It is recommended to generate the language specific gRPC client using the proto definition."),(0,o.kt)("p",null,"Input to the RPC call is ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventRequest")," and the output is ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"raccoon.proto"),"."),(0,o.kt)("p",null,"To support multi-tenacy while using gRPC, ",(0,o.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," values can be used. The key along with their values if set in grpc metadata while sending the request. Golang client example -"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-go"},'md := metadata.New(map[string]string{"X-User-ID": "1234"})\nctx := metadata.NewOutgoingContext(context.Background(), md)\nr, err := client.SendEvent(ctx, req)\n')),(0,o.kt)("h2",{id:"topics"},"Topics"),(0,o.kt)("p",null,"Raccoon distributes events to a topic based on the event type. The protobufs section above clarifies how the type should be set in the event. The type is a string literal. For example, ViewedEvent - which signifies that the user viewed something on the app or the site can have its event type set as below ",(0,o.kt)("inlineCode",{parentName:"p"},"type = viewedevent")),(0,o.kt)("p",null,"When raccoon API consumes a batch array of events ","(","events in SendEventRequest proto",")",", it deserializes them and fetches the individual events ","(","using the SendEventRequest proto",")",", and constructs the topic to send each event to based on the ",(0,o.kt)("inlineCode",{parentName:"p"},"type")," field set in each of the events."),(0,o.kt)("p",null,"The following code determines the topic name."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-text"},"topic := fmt.Sprintf(pr.topicFormat, event.Type)\n")),(0,o.kt)("p",null,"where ",(0,o.kt)("strong",{parentName:"p"},"topicformat")," - is the configured pattern ",(0,o.kt)("inlineCode",{parentName:"p"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")," ",(0,o.kt)("strong",{parentName:"p"},"type")," - is the type set by the client when the event proto is generated"),(0,o.kt)("p",null,"For e.g. setting the"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-text"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log\n")),(0,o.kt)("p",null,"and a type such as ",(0,o.kt)("inlineCode",{parentName:"p"},"type=viewedevent")," in the event"),(0,o.kt)("p",null,"will have the topic name as ",(0,o.kt)("inlineCode",{parentName:"p"},"topic-viewedevent-log")))}h.isMDXComponent=!0},7447:function(e,t,n){t.Z=n.p+"assets/images/raccoon_ep-2f003a95743c872cbd23fe5f2cf5fb1e.png"}}]); \ No newline at end of file diff --git a/assets/js/17896441.0e6dd5ea.js b/assets/js/17896441.0e6dd5ea.js deleted file mode 100644 index 6cbdaae5..00000000 --- a/assets/js/17896441.0e6dd5ea.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[918],{3905:function(e,t,n){"use strict";n.d(t,{Zo:function(){return u},kt:function(){return p}});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=a.createContext({}),s=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(n),p=r,v=d["".concat(c,".").concat(p)]||d[p]||m[p]||l;return n?a.createElement(v,o(o({ref:t},u),{},{components:n})):a.createElement(v,o({ref:t},u))}));function p(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=d;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,o[1]=i;for(var s=2;s0,m=!!(n||l||c);return u||m?a.createElement("footer",{className:(0,r.Z)(i.k.docs.docFooter,"docusaurus-mt-lg")},u&&a.createElement(U,{tags:s}),m&&a.createElement(z,{editUrl:n,lastUpdatedAt:l,lastUpdatedBy:c,formattedLastUpdatedAt:o})):null}var D=n(6668),R=["parentIndex"];function W(e){var t=e.map((function(e){return Object.assign({},e,{parentIndex:-1,children:[]})})),n=Array(7).fill(-1);t.forEach((function(e,t){var a=n.slice(2,e.level);e.parentIndex=Math.max.apply(Math,a),n[e.level]=t}));var a=[];return t.forEach((function(e){var n=e.parentIndex,r=(0,T.Z)(e,R);n>=0?t[n].children.push(r):a.push(r)})),a}function F(e){var t=e.toc,n=e.minHeadingLevel,a=e.maxHeadingLevel;return t.flatMap((function(e){var t=F({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[Object.assign({},e,{children:t})]:t}))}function q(e){var t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function G(e,t){var n,a,r=t.anchorTopOffset,l=e.find((function(e){return q(e).top>=r}));return l?function(e){return e.top>0&&e.bottom0})).map((function(e){return[e-1,[i]]}));return{lineClassNames:Object.fromEntries(c),code:n}}if(void 0===a)return{lineClassNames:{},code:n};for(var s=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return Me(["js","jsBlock"],t);case"jsx":case"tsx":return Me(["js","jsBlock","jsx"],t);case"html":return Me(["js","jsBlock","html"],t);case"python":case"py":case"bash":return Me(["bash"],t);case"markdown":case"md":return Me(["html","jsx","bash"],t);default:return Me(Object.keys(Ie),t)}}(a,r),u=n.split("\n"),m=Object.fromEntries(r.map((function(e){return[e.className,{start:0,range:""}]}))),d=Object.fromEntries(r.filter((function(e){return e.line})).map((function(e){var t=e.className;return[e.line,t]}))),p=Object.fromEntries(r.filter((function(e){return e.block})).map((function(e){var t=e.className;return[e.block.start,t]}))),v=Object.fromEntries(r.filter((function(e){return e.block})).map((function(e){var t=e.className;return[e.block.end,t]}))),f=0;f0&&e[n-1]===t?e:e.concat(t)},et=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=$e({},e[t],r);e[t]=n})),e}),a);return r.root=n,r.plain=$e({},n,{backgroundColor:null}),r};function tt(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 nt=function(e){function t(){for(var t=this,n=[],a=arguments.length;a--;)n[a]=arguments[a];e.apply(this,n),Ye(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?et(e.theme,e.language):void 0;return t.themeDict=n})),Ye(this,"getLineProps",(function(e){var n=e.key,a=e.className,r=e.style,l=$e({},tt(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),o=t.getThemeDict(t.props);return void 0!==o&&(l.style=o.plain),void 0!==r&&(l.style=void 0!==l.style?$e({},l.style,r):r),void 0!==n&&(l.key=n),a&&(l.className+=" "+a),l})),Ye(this,"getStyleForToken",(function(e){var n=e.types,a=e.empty,r=n.length,l=t.getThemeDict(t.props);if(void 0!==l){if(1===r&&"plain"===n[0])return a?{display:"inline-block"}:void 0;if(1===r&&!a)return l[n[0]];var o=a?{display:"inline-block"}:{},i=n.map((function(e){return l[e]}));return Object.assign.apply(Object,[o].concat(i))}})),Ye(this,"getTokenProps",(function(e){var n=e.key,a=e.className,r=e.style,l=e.token,o=$e({},tt(e,["key","className","style","token"]),{className:"token "+l.types.join(" "),children:l.content,style:t.getStyleForToken(l),key:void 0});return void 0!==r&&(o.style=void 0!==o.style?$e({},o.style,r):r),void 0!==n&&(o.key=n),a&&(o.className+=" "+a),o})),Ye(this,"tokenize",(function(e,t,n,a){var r={code:t,grammar:n,language:a,tokens:[]};e.hooks.run("before-tokenize",r);var l=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),l}))}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,l=this.getThemeDict(this.props),o=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],a=[0],r=[e.length],l=0,o=0,i=[],c=[i];o>-1;){for(;(l=a[o]++)0?u:["plain"],s=m):(u=Ke(u,m.type),m.alias&&(u=Ke(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(Qe),p=d.length;i.push({types:u,content:d[0]});for(var v=1;v0&&(i=o.getRangeAt(0)),a.append(r),r.select(),r.selectionStart=0,r.selectionEnd=e.length;var c=!1;try{c=document.execCommand("copy")}catch(s){}r.remove(),i&&(o.removeAllRanges(),o.addRange(i)),l&&l.focus()}(t),i(!0),c.current=window.setTimeout((function(){i(!1)}),1e3)}),[t]);return(0,a.useEffect)((function(){return function(){return window.clearTimeout(c.current)}}),[]),a.createElement("button",{type:"button","aria-label":o?(0,s.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,s.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,s.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.Z)("clean-btn",n,ct.copyButton,o&&ct.copyButtonCopied),onClick:u},a.createElement("span",{className:ct.copyButtonIcons,"aria-hidden":"true"},a.createElement("svg",{className:ct.copyButtonIcon,viewBox:"0 0 24 24"},a.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),a.createElement("svg",{className:ct.copyButtonSuccessIcon,viewBox:"0 0 24 24"},a.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}var ut="wordWrapButtonIcon_Bwma",mt="wordWrapButtonEnabled_EoeP";function dt(e){var t=e.className,n=e.onClick,l=e.isEnabled,o=(0,s.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return a.createElement("button",{type:"button",onClick:n,className:(0,r.Z)("clean-btn",t,l&&mt),"aria-label":o,title:o},a.createElement("svg",{className:ut,viewBox:"0 0 24 24","aria-hidden":"true"},a.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function pt(e){var t,n,l,o,i,s,u,m,d,p,v,f=e.children,h=e.className,g=void 0===h?"":h,b=e.metastring,E=e.title,y=e.showLineNumbers,k=e.language,N=(0,D.L)().prism,L=N.defaultLanguage,C=N.magicComments,Z=null!=(t=null!=k?k:null==(n=g.split(" ").find((function(e){return e.startsWith("language-")})))?void 0:n.replace(/language-/,""))?t:L,T=Be(),_=(l=(0,a.useState)(!1),o=l[0],i=l[1],s=(0,a.useState)(!1),u=s[0],m=s[1],d=(0,a.useRef)(null),p=(0,a.useCallback)((function(){var e=d.current.querySelector("code");o?e.removeAttribute("style"):(e.style.whiteSpace="pre-wrap",e.style.overflowWrap="anywhere"),i((function(e){return!e}))}),[d,o]),v=(0,a.useCallback)((function(){var e=d.current,t=e.scrollWidth>e.clientWidth||d.current.querySelector("code").hasAttribute("style");m(t)}),[d]),qe(d,v),(0,a.useEffect)((function(){v()}),[o,v]),(0,a.useEffect)((function(){return window.addEventListener("resize",v,{passive:!0}),function(){window.removeEventListener("resize",v)}}),[v]),{codeBlockRef:d,isEnabled:o,isCodeScrollable:u,toggle:p}),w=function(e){var t,n;return null!=(t=null==e||null==(n=e.match(He))?void 0:n.groups.title)?t:""}(b)||E,x=Pe(f,{metastring:b,language:Z,magicComments:C}),B=x.lineClassNames,O=x.code,A=null!=y?y:function(e){return Boolean(null==e?void 0:e.includes("showLineNumbers"))}(b);return a.createElement(Ve,{as:"div",className:(0,r.Z)(g,Z&&!g.includes("language-"+Z)&&"language-"+Z)},w&&a.createElement("div",{className:De.codeBlockTitle},w),a.createElement("div",{className:De.codeBlockContent},a.createElement(at,(0,c.Z)({},Je,{theme:T,code:O,language:null!=Z?Z:"text"}),(function(e){var t=e.className,n=e.tokens,l=e.getLineProps,o=e.getTokenProps;return a.createElement("pre",{tabIndex:0,ref:_.codeBlockRef,className:(0,r.Z)(t,De.codeBlock,"thin-scrollbar")},a.createElement("code",{className:(0,r.Z)(De.codeBlockLines,A&&De.codeBlockLinesWithNumbering)},n.map((function(e,t){return a.createElement(it,{key:t,line:e,getLineProps:l,getTokenProps:o,classNames:B[t],showLineNumbers:A})}))))})),a.createElement("div",{className:De.buttonGroup},(_.isEnabled||_.isCodeScrollable)&&a.createElement(dt,{className:De.codeButton,onClick:function(){return _.toggle()},isEnabled:_.isEnabled}),a.createElement(st,{className:De.codeButton,code:O}))))}var vt=["children"];function ft(e){var t=e.children,n=(0,T.Z)(e,vt),r=(0,we.Z)(),l=function(e){return a.Children.toArray(e).some((function(e){return(0,a.isValidElement)(e)}))?e:Array.isArray(e)?e.join(""):e}(t),o="string"==typeof l?pt:Re;return a.createElement(o,(0,c.Z)({key:String(r)},n),l)}var ht="details_lb9f",gt="isBrowser_bmU9",bt="collapsibleContent_i85q",Et=["summary","children"];function yt(e){return!!e&&("SUMMARY"===e.tagName||yt(e.parentElement))}function kt(e,t){return!!e&&(e===t||kt(e.parentElement,t))}function Nt(e){var t=e.summary,n=e.children,l=(0,T.Z)(e,Et),o=(0,we.Z)(),i=(0,a.useRef)(null),s=(0,ae.u)({initialState:!l.open}),u=s.collapsed,m=s.setCollapsed,d=(0,a.useState)(l.open),p=d[0],v=d[1];return a.createElement("details",(0,c.Z)({},l,{ref:i,open:p,"data-collapsed":u,className:(0,r.Z)(ht,o&>,l.className),onMouseDown:function(e){yt(e.target)&&e.detail>1&&e.preventDefault()},onClick:function(e){e.stopPropagation();var t=e.target;yt(t)&&kt(t,i.current)&&(e.preventDefault(),u?(m(!1),v(!0)):m(!0))}}),null!=t?t:a.createElement("summary",null,"Details"),a.createElement(ae.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:function(e){m(e),v(!e)}},a.createElement("div",{className:bt},n)))}var Lt="details_b_Ee";function Ct(e){var t=Object.assign({},e);return a.createElement(Nt,(0,c.Z)({},t,{className:(0,r.Z)("alert alert--info",Lt,t.className)}))}function Zt(e){return a.createElement(fe,e)}var Tt="containsTaskList_mC6p";var _t="img_ev3q";var wt="admonition_LlT9",xt="admonitionHeading_tbUL",Bt="admonitionIcon_kALy",Ot="admonitionContent_S0QG";var At={note:{infimaClassName:"secondary",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:a.createElement(s.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:a.createElement(s.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:a.createElement(s.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:a.createElement(s.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 16 16"},a.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:a.createElement(s.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},jt={secondary:"note",important:"info",success:"tip",warning:"danger"};function Ht(e){var t,n=function(e){var t=a.Children.toArray(e),n=t.find((function(e){var t;return a.isValidElement(e)&&"mdxAdmonitionTitle"===(null==(t=e.props)?void 0:t.mdxType)})),r=a.createElement(a.Fragment,null,t.filter((function(e){return e!==n})));return{mdxAdmonitionTitle:n,rest:r}}(e.children),r=n.mdxAdmonitionTitle,l=n.rest;return Object.assign({},e,{title:null!=(t=e.title)?t:r,children:l})}var St={head:function(e){var t=a.Children.map(e.children,(function(e){return a.isValidElement(e)?function(e){var t;if(null!=(t=e.props)&&t.mdxType&&e.props.originalType){var n=e.props,r=(n.mdxType,n.originalType,(0,T.Z)(n,_e));return a.createElement(e.props.originalType,r)}return e}(e):e}));return a.createElement(Te.Z,e,t)},code:function(e){var t=["a","b","big","i","span","em","strong","sup","sub","small"];return a.Children.toArray(e.children).every((function(e){var n;return"string"==typeof e&&!e.includes("\n")||(0,a.isValidElement)(e)&&t.includes(null==(n=e.props)?void 0:n.mdxType)}))?a.createElement("code",e):a.createElement(ft,e)},a:function(e){return a.createElement(u.Z,e)},pre:function(e){var t;return a.createElement(ft,(0,a.isValidElement)(e.children)&&"code"===(null==(t=e.children.props)?void 0:t.originalType)?e.children.props:Object.assign({},e))},details:function(e){var t=a.Children.toArray(e.children),n=t.find((function(e){var t;return a.isValidElement(e)&&"summary"===(null==(t=e.props)?void 0:t.mdxType)})),r=a.createElement(a.Fragment,null,t.filter((function(e){return e!==n})));return a.createElement(Ct,(0,c.Z)({},e,{summary:n}),r)},ul:function(e){return a.createElement("ul",(0,c.Z)({},e,{className:(t=e.className,(0,r.Z)(t,(null==t?void 0:t.includes("contains-task-list"))&&Tt))}));var t},img:function(e){return a.createElement("img",(0,c.Z)({loading:"lazy"},e,{className:(t=e.className,(0,r.Z)(t,_t))}));var t},h1:function(e){return a.createElement(Zt,(0,c.Z)({as:"h1"},e))},h2:function(e){return a.createElement(Zt,(0,c.Z)({as:"h2"},e))},h3:function(e){return a.createElement(Zt,(0,c.Z)({as:"h3"},e))},h4:function(e){return a.createElement(Zt,(0,c.Z)({as:"h4"},e))},h5:function(e){return a.createElement(Zt,(0,c.Z)({as:"h5"},e))},h6:function(e){return a.createElement(Zt,(0,c.Z)({as:"h6"},e))},admonition:function(e){var t=Ht(e),n=t.children,l=t.type,o=t.title,c=t.icon,s=function(e){var t,n=null!=(t=jt[e])?t:e;return At[n]||(console.warn('No admonition config found for admonition type "'+n+'". Using Info as fallback.'),At.info)}(l),u=null!=o?o:s.label,m=s.iconComponent,d=null!=c?c:a.createElement(m,null);return a.createElement("div",{className:(0,r.Z)(i.k.common.admonition,i.k.common.admonitionType(e.type),"alert","alert--"+s.infimaClassName,wt)},a.createElement("div",{className:xt},a.createElement("span",{className:Bt},d),u),a.createElement("div",{className:Ot},n))}};function It(e){var t=e.children;return a.createElement(Ze.Zo,{components:St},t)}var Mt="docItemContainer_Adtb",Pt="docItemCol_GujU",Ut="tocMobile_aoJ5";function zt(e){var t,n=e.content,r=n.metadata,o=n.frontMatter,i=n.assets,c=o.keywords,s=r.description,u=r.title,m=null!=(t=i.image)?t:o.image;return a.createElement(l.d,{title:u,description:s,keywords:c,image:m})}function Vt(e){var t=e.content,n=t.metadata,l=t.frontMatter,c=l.hide_title,s=l.hide_table_of_contents,u=l.toc_min_heading_level,m=l.toc_max_heading_level,p=n.title,v=!c&&void 0===t.contentTitle,f=(0,o.i)(),h=!s&&t.toc.length>0,g=h&&("desktop"===f||"ssr"===f);return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,r.Z)("col",!s&&Pt)},a.createElement(k,null),a.createElement("div",{className:Mt},a.createElement("article",null,a.createElement(Ce,null),a.createElement(N,null),h&&a.createElement(me,{toc:t.toc,minHeadingLevel:u,maxHeadingLevel:m,className:(0,r.Z)(i.k.docs.docTocMobile,Ut)}),a.createElement("div",{className:(0,r.Z)(i.k.docs.docMarkdown,"markdown")},v&&a.createElement("header",null,a.createElement(fe,{as:"h1"},p)),a.createElement(It,null,a.createElement(t,null))),a.createElement(V,e)),a.createElement(d,{previous:n.previous,next:n.next}))),g&&a.createElement("div",{className:"col col--3"},a.createElement(ne,{toc:t.toc,minHeadingLevel:u,maxHeadingLevel:m,className:i.k.docs.docTocDesktop})))}function Dt(e){var t="docs-doc-id-"+e.content.metadata.unversionedId;return a.createElement(l.FG,{className:t},a.createElement(zt,e),a.createElement(Vt,e))}},4477:function(e,t,n){"use strict";n.d(t,{E:function(){return i},q:function(){return o}});var a=n(7294),r=n(9688),l=a.createContext(null);function o(e){var t=e.children,n=e.version;return a.createElement(l.Provider,{value:n},t)}function i(){var e=(0,a.useContext)(l);if(null===e)throw new r.i6("DocsVersionProvider");return e}},7594:function(e,t){function n(e){let t,n=[];for(let a of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(a))n.push(parseInt(a,10));else if(t=a.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,a,r,l]=t;if(a&&l){a=parseInt(a),l=parseInt(l);const e=a{n.r(t),n.d(t,{default:()=>Re});var a=n(6540),l=n(53),r=n(1003),i=n(4581),o=n(7559),c=n(8168),s=n(1312),d=n(5489);function m(e){const{permalink:t,title:n,subLabel:r,isNext:i}=e;return a.createElement(d.A,{className:(0,l.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},r&&a.createElement("div",{className:"pagination-nav__sublabel"},r),a.createElement("div",{className:"pagination-nav__label"},n))}function u(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&a.createElement(m,(0,c.A)({},t,{subLabel:a.createElement(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(m,(0,c.A)({},n,{subLabel:a.createElement(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}var p=n(4586),h=n(4070),v=n(5597),b=n(2252);const f={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function E(e){const t=f[e.versionMetadata.banner];return a.createElement(t,e)}function g(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(s.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(d.A,{to:n,onClick:l},a.createElement(s.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function A(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:r}}=(0,p.A)(),{pluginId:i}=(0,h.vT)({failfast:!0}),{savePreferredVersionName:c}=(0,v.g1)(i),{latestDocSuggestion:s,latestVersionSuggestion:d}=(0,h.HW)(i),m=s??(u=d).docs.find((e=>e.id===u.mainDocId));var u;return a.createElement("div",{className:(0,l.A)(t,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(E,{siteTitle:r,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(g,{versionLabel:d.label,to:m.path,onClick:()=>c(d.name)})))}function N(e){let{className:t}=e;const n=(0,b.r)();return n.banner?a.createElement(A,{className:t,versionMetadata:n}):null}function C(e){let{className:t}=e;const n=(0,b.r)();return n.badge?a.createElement("span",{className:(0,l.A)(t,o.G.docs.docVersionBadge,"badge badge--secondary")},a.createElement(s.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function L(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(s.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function _(e){let{lastUpdatedBy:t}=e;return a.createElement(s.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function T(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:o.G.common.lastUpdated},a.createElement(s.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(L,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(_,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}const y={iconEdit:"iconEdit_eYIM"};function k(e){let{className:t,...n}=e;return a.createElement("svg",(0,c.A)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,l.A)(y.iconEdit,t),"aria-hidden":"true"},n),a.createElement("g",null,a.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function x(e){let{editUrl:t}=e;return a.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:o.G.common.editThisPage},a.createElement(k,null),a.createElement(s.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}const H={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function U(e){let{permalink:t,label:n,count:r}=e;return a.createElement(d.A,{href:t,className:(0,l.A)(H.tag,r?H.tagWithCount:H.tagRegular)},n,r&&a.createElement("span",null,r))}const w={tags:"tags_jXut",tag:"tag_QGVx"};function M(e){let{tags:t}=e;return a.createElement(a.Fragment,null,a.createElement("b",null,a.createElement(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),a.createElement("ul",{className:(0,l.A)(w.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return a.createElement("li",{key:n,className:w.tag},a.createElement(U,{label:t,permalink:n}))}))))}const B={lastUpdated:"lastUpdated_vbeJ"};function I(e){return a.createElement("div",{className:(0,l.A)(o.G.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(M,e)))}function S(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:r,formattedLastUpdatedAt:i}=e;return a.createElement("div",{className:(0,l.A)(o.G.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(x,{editUrl:t})),a.createElement("div",{className:(0,l.A)("col",B.lastUpdated)},(n||r)&&a.createElement(T,{lastUpdatedAt:n,formattedLastUpdatedAt:i,lastUpdatedBy:r})))}function z(e){const{content:t}=e,{metadata:n}=t,{editUrl:r,lastUpdatedAt:i,formattedLastUpdatedAt:c,lastUpdatedBy:s,tags:d}=n,m=d.length>0,u=!!(r||i||s);return m||u?a.createElement("footer",{className:(0,l.A)(o.G.docs.docFooter,"docusaurus-mt-lg")},m&&a.createElement(I,{tags:d}),u&&a.createElement(S,{editUrl:r,lastUpdatedAt:i,lastUpdatedBy:s,formattedLastUpdatedAt:c})):null}var V=n(6342);function O(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function R(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=R({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function G(e){const t=e.getBoundingClientRect();return t.top===t.bottom?G(e.parentNode):t}function D(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>G(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function W(e){const t=(0,a.useRef)(void 0),n=P();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:i}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:i}),c=D(o,{anchorTopOffset:n.current}),s=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===s)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}function F(e){let{toc:t,className:n,linkClassName:l,isChild:r}=e;return t.length?a.createElement("ul",{className:r?void 0:n},t.map((e=>a.createElement("li",{key:e.id},a.createElement("a",{href:`#${e.id}`,className:l??void 0,dangerouslySetInnerHTML:{__html:e.value}}),a.createElement(F,{isChild:!0,toc:e.children,className:n,linkClassName:l}))))):null}const q=a.memo(F);function $(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:i,maxHeadingLevel:o,...s}=e;const d=(0,V.p)(),m=i??d.tableOfContents.minHeadingLevel,u=o??d.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:l}=e;return(0,a.useMemo)((()=>R({toc:O(t),minHeadingLevel:n,maxHeadingLevel:l})),[t,n,l])}({toc:t,minHeadingLevel:m,maxHeadingLevel:u});return W((0,a.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:m,maxHeadingLevel:u}}),[l,r,m,u])),a.createElement(q,(0,c.A)({toc:p,className:n,linkClassName:l},s))}const j={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},Y="table-of-contents__link toc-highlight",J="table-of-contents__link--active";function Q(e){let{className:t,...n}=e;return a.createElement("div",{className:(0,l.A)(j.tableOfContents,"thin-scrollbar",t)},a.createElement($,(0,c.A)({},n,{linkClassName:Y,linkActiveClassName:J})))}var X=n(1422);const Z={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function K(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,c.A)({type:"button"},n,{className:(0,l.A)("clean-btn",Z.tocCollapsibleButton,!t&&Z.tocCollapsibleButtonExpanded,n.className)}),a.createElement(s.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const ee={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function te(e){let{toc:t,className:n,minHeadingLevel:r,maxHeadingLevel:i}=e;const{collapsed:o,toggleCollapsed:c}=(0,X.u)({initialState:!0});return a.createElement("div",{className:(0,l.A)(ee.tocCollapsible,!o&&ee.tocCollapsibleExpanded,n)},a.createElement(K,{collapsed:o,onClick:c}),a.createElement(X.N,{lazy:!0,className:ee.tocCollapsibleContent,collapsed:o},a.createElement($,{toc:t,minHeadingLevel:r,maxHeadingLevel:i})))}const ne={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function ae(e){let{as:t,id:n,...r}=e;const{navbar:{hideOnScroll:i}}=(0,V.p)();return"h1"!==t&&n?a.createElement(t,(0,c.A)({},r,{className:(0,l.A)("anchor",i?ne.anchorWithHideOnScrollNavbar:ne.anchorWithStickyNavbar),id:n}),r.children,a.createElement("a",{className:"hash-link",href:`#${n}`,title:(0,s.T)({id:"theme.common.headingLinkTitle",message:"Direct link to heading",description:"Title for link to heading"})},"\u200b")):a.createElement(t,(0,c.A)({},r,{id:void 0}))}var le=n(4142),re=n(9169),ie=n(6025);function oe(e){return a.createElement("svg",(0,c.A)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const ce={breadcrumbsContainer:"breadcrumbsContainer_Z_bl",breadcrumbHomeIcon:"breadcrumbHomeIcon_OVgt"};function se(e){let{children:t,href:n,isLast:l}=e;const r="breadcrumbs__link";return l?a.createElement("span",{className:r,itemProp:"name"},t):n?a.createElement(d.A,{className:r,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:r},t)}function de(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return a.createElement("li",(0,c.A)({},i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,l.A)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(r+1)}))}function me(){const e=(0,ie.A)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(d.A,{"aria-label":(0,s.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:(0,l.A)("breadcrumbs__link",ce.breadcrumbsItemLink),href:e},a.createElement(oe,{className:ce.breadcrumbHomeIcon})))}function ue(){const e=(0,le.OF)(),t=(0,re.Dt)();return e?a.createElement("nav",{className:(0,l.A)(o.G.docs.docBreadcrumbs,ce.breadcrumbsContainer),"aria-label":(0,s.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(me,null),e.map(((t,n)=>{const l=n===e.length-1;return a.createElement(de,{key:n,active:l,index:n,addMicrodata:!!t.href},a.createElement(se,{href:t.href,isLast:l},t.label))})))):null}var pe=n(5680),he=n(5260);var ve=n(7964);var be=n(2303);const fe={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function Ee(e){return!!e&&("SUMMARY"===e.tagName||Ee(e.parentElement))}function ge(e,t){return!!e&&(e===t||ge(e.parentElement,t))}function Ae(e){let{summary:t,children:n,...r}=e;const i=(0,be.A)(),o=(0,a.useRef)(null),{collapsed:s,setCollapsed:d}=(0,X.u)({initialState:!r.open}),[m,u]=(0,a.useState)(r.open);return a.createElement("details",(0,c.A)({},r,{ref:o,open:m,"data-collapsed":s,className:(0,l.A)(fe.details,i&&fe.isBrowser,r.className),onMouseDown:e=>{Ee(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Ee(t)&&ge(t,o.current)&&(e.preventDefault(),s?(d(!1),u(!0)):d(!0))}}),t??a.createElement("summary",null,"Details"),a.createElement(X.N,{lazy:!1,collapsed:s,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),u(!e)}},a.createElement("div",{className:fe.collapsibleContent},n)))}const Ne={details:"details_b_Ee"},Ce="alert alert--info";function Le(e){let{...t}=e;return a.createElement(Ae,(0,c.A)({},t,{className:(0,l.A)(Ce,Ne.details,t.className)}))}function _e(e){return a.createElement(ae,e)}const Te={containsTaskList:"containsTaskList_mC6p"};const ye={img:"img_ev3q"};const ke="admonition_LlT9",xe="admonitionHeading_tbUL",He="admonitionIcon_kALy",Ue="admonitionContent_S0QG";const we={note:{infimaClassName:"secondary",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:a.createElement(s.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:a.createElement(s.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 12 16"},a.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:a.createElement(s.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 14 16"},a.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:a.createElement(s.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return a.createElement("svg",{viewBox:"0 0 16 16"},a.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:a.createElement(s.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},Me={secondary:"note",important:"info",success:"tip",warning:"danger"};function Be(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=a.Children.toArray(e),n=t.find((e=>{var t;return a.isValidElement(e)&&"mdxAdmonitionTitle"===(null==(t=e.props)?void 0:t.mdxType)})),l=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:l}}(e.children);return{...e,title:e.title??t,children:n}}const Ie={head:function(e){const t=a.Children.map(e.children,(e=>a.isValidElement(e)?function(e){var t;if(null!=(t=e.props)&&t.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...l}=e.props;return a.createElement(e.props.originalType,l)}return e}(e):e));return a.createElement(he.A,e,t)},code:function(e){const t=["a","b","big","i","span","em","strong","sup","sub","small"];return a.Children.toArray(e.children).every((e=>{var n;return"string"==typeof e&&!e.includes("\n")||(0,a.isValidElement)(e)&&t.includes(null==(n=e.props)?void 0:n.mdxType)}))?a.createElement("code",e):a.createElement(ve.A,e)},a:function(e){return a.createElement(d.A,e)},pre:function(e){var t;return a.createElement(ve.A,(0,a.isValidElement)(e.children)&&"code"===(null==(t=e.children.props)?void 0:t.originalType)?e.children.props:{...e})},details:function(e){const t=a.Children.toArray(e.children),n=t.find((e=>{var t;return a.isValidElement(e)&&"summary"===(null==(t=e.props)?void 0:t.mdxType)})),l=a.createElement(a.Fragment,null,t.filter((e=>e!==n)));return a.createElement(Le,(0,c.A)({},e,{summary:n}),l)},ul:function(e){return a.createElement("ul",(0,c.A)({},e,{className:(t=e.className,(0,l.A)(t,(null==t?void 0:t.includes("contains-task-list"))&&Te.containsTaskList))}));var t},img:function(e){return a.createElement("img",(0,c.A)({loading:"lazy"},e,{className:(t=e.className,(0,l.A)(t,ye.img))}));var t},h1:e=>a.createElement(_e,(0,c.A)({as:"h1"},e)),h2:e=>a.createElement(_e,(0,c.A)({as:"h2"},e)),h3:e=>a.createElement(_e,(0,c.A)({as:"h3"},e)),h4:e=>a.createElement(_e,(0,c.A)({as:"h4"},e)),h5:e=>a.createElement(_e,(0,c.A)({as:"h5"},e)),h6:e=>a.createElement(_e,(0,c.A)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:r,icon:i}=Be(e),c=function(e){const t=Me[e]??e,n=we[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),we.info)}(n),s=r??c.label,{iconComponent:d}=c,m=i??a.createElement(d,null);return a.createElement("div",{className:(0,l.A)(o.G.common.admonition,o.G.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ke)},a.createElement("div",{className:xe},a.createElement("span",{className:He},m),s),a.createElement("div",{className:Ue},t))}};function Se(e){let{children:t}=e;return a.createElement(pe.xA,{components:Ie},t)}const ze={docItemContainer:"docItemContainer_Adtb",docItemCol:"docItemCol_GujU",tocMobile:"tocMobile_aoJ5"};function Ve(e){const{content:t}=e,{metadata:n,frontMatter:l,assets:i}=t,{keywords:o}=l,{description:c,title:s}=n,d=i.image??l.image;return a.createElement(r.be,{title:s,description:c,keywords:o,image:d})}function Oe(e){const{content:t}=e,{metadata:n,frontMatter:r}=t,{hide_title:c,hide_table_of_contents:s,toc_min_heading_level:d,toc_max_heading_level:m}=r,{title:p}=n,h=!c&&void 0===t.contentTitle,v=(0,i.l)(),b=!s&&t.toc.length>0,f=b&&("desktop"===v||"ssr"===v);return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,l.A)("col",!s&&ze.docItemCol)},a.createElement(N,null),a.createElement("div",{className:ze.docItemContainer},a.createElement("article",null,a.createElement(ue,null),a.createElement(C,null),b&&a.createElement(te,{toc:t.toc,minHeadingLevel:d,maxHeadingLevel:m,className:(0,l.A)(o.G.docs.docTocMobile,ze.tocMobile)}),a.createElement("div",{className:(0,l.A)(o.G.docs.docMarkdown,"markdown")},h&&a.createElement("header",null,a.createElement(ae,{as:"h1"},p)),a.createElement(Se,null,a.createElement(t,null))),a.createElement(z,e)),a.createElement(u,{previous:n.previous,next:n.next}))),f&&a.createElement("div",{className:"col col--3"},a.createElement(Q,{toc:t.toc,minHeadingLevel:d,maxHeadingLevel:m,className:o.G.docs.docTocDesktop})))}function Re(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`;return a.createElement(r.e3,{className:t},a.createElement(Ve,e),a.createElement(Oe,e))}},2252:(e,t,n)=>{n.d(t,{n:()=>i,r:()=>o});var a=n(6540),l=n(9532);const r=a.createContext(null);function i(e){let{children:t,version:n}=e;return a.createElement(r.Provider,{value:n},t)}function o(){const e=(0,a.useContext)(r);if(null===e)throw new l.dV("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1be78505.82e067b7.js b/assets/js/1be78505.82e067b7.js deleted file mode 100644 index 3db9ee9d..00000000 --- a/assets/js/1be78505.82e067b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[514,972],{7994:function(e,t,n){n.r(t),n.d(t,{default:function(){return xe}});var a=n(7294),r=n(6010),l=n(8425),i=n(3320),o=n(1944),c=n(5281),s=n(4477),d=n(1116),u=n(5257),m=n(5999),b=n(2466),p=n(5936);var v="backToTopButton_sjWU",h="backToTopButtonShow_xfvO";function f(){var e=function(e){var t=e.threshold,n=(0,a.useState)(!1),r=n[0],l=n[1],i=(0,a.useRef)(!1),o=(0,b.Ct)(),c=o.startScroll,s=o.cancelScroll;return(0,b.RF)((function(e,n){var a=e.scrollY,r=null==n?void 0:n.scrollY;r&&(i.current?i.current=!1:a>=r?(s(),l(!1)):a{n.r(t),n.d(t,{default:()=>Ee});var a=n(6540),l=n(53),o=n(4142),r=n(2967),c=n(1003),i=n(7559),s=n(2252),d=n(6588),m=n(5173),u=n(1312),b=n(3104),p=n(5062);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.gk)();return(0,b.Mq)(((e,n)=>{let{scrollY:a}=e;const r=null==n?void 0:n.scrollY;r&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.A)("clean-btn",i.G.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(2681),g=n(4581),v=n(6342),_=n(3465),C=n(8168);function k(e){return a.createElement("svg",(0,C.A)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function S(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t},a.createElement(k,{className:A.collapseSidebarButtonIcon}))}var N=n(5041),T=n(9532);const I=Symbol("EmptyContext"),x=a.createContext(I);function y(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(x.Provider,{value:o},t)}var B=n(9169),w=n(1422),L=n(5489),M=n(2303);function P(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.T)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:r,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,v.p)(),f=function(e){const t=(0,M.A)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,o._o)(e):void 0),[e,t])}(t),g=(0,o.w8)(t,r),_=(0,B.ys)(h,r),{collapsed:k,setCollapsed:A}=(0,w.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:S,setExpandedItem:N}=function(){const e=(0,a.useContext)(x);if(e===I)throw new T.dV("DocSidebarItemsExpandedStateProvider");return e}(),y=function(e){void 0===e&&(e=!k),N(e?null:s),A(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,T.ZC)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:g,collapsed:k,updateCollapsed:y}),(0,a.useEffect)((()=>{b&&S&&S!==s&&E&&A(!0)}),[b,S,s,A,E]),a.createElement("li",{className:(0,l.A)(i.G.docs.docSidebarItemCategory,i.G.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":k},p)},a.createElement("div",{className:(0,l.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":_})},a.createElement(L.A,(0,C.A)({className:(0,l.A)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{null==n||n(t),h?y(!1):(e.preventDefault(),y())}:()=>{null==n||n(t)},"aria-current":_?"page":void 0,"aria-expanded":b?!k:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(P,{categoryLabel:u,onClick:e=>{e.preventDefault(),y()}})),a.createElement(w.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:k},a.createElement(j,{items:m,tabIndex:k?-1:0,onItemClick:n,activePath:r,level:c+1})))}var G=n(6654),W=n(2523);const F={menuExternalLink:"menuExternalLink_NmtK"};function D(e){let{item:t,onItemClick:n,activePath:r,level:c,index:s,...d}=e;const{href:m,label:u,className:b}=t,p=(0,o.w8)(t,r),h=(0,G.A)(m);return a.createElement("li",{className:(0,l.A)(i.G.docs.docSidebarItemLink,i.G.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(L.A,(0,C.A)({className:(0,l.A)("menu__link",!h&&F.menuExternalLink,{"menu__link--active":p}),"aria-current":p?"page":void 0,to:m},h&&{onClick:n?()=>n(t):void 0},d),u,!h&&a.createElement(W.A,null)))}const z={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:o}=e;const{value:r,defaultStyle:c,className:s}=t;return a.createElement("li",{className:(0,l.A)(i.G.docs.docSidebarItemLink,i.G.docs.docSidebarItemLinkLevel(n),c&&[z.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:r}})}function U(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.A)({item:t},n));case"html":return a.createElement(R,(0,C.A)({item:t},n));default:return a.createElement(D,(0,C.A)({item:t},n))}}function V(e){let{items:t,...n}=e;return a.createElement(y,null,t.map(((e,t)=>a.createElement(U,(0,C.A)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(V),K={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function q(e){let{path:t,sidebar:n,className:o}=e;const r=function(){const{isActive:e}=(0,N.Mj)(),[t,n]=(0,a.useState)(e);return(0,b.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{className:(0,l.A)("menu thin-scrollbar",K.menu,r&&K.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.A)(i.G.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const Y="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",Z="sidebarLogo_isFc";function $(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,v.p)();return a.createElement("div",{className:(0,l.A)(Y,c&&O,r&&X)},c&&a.createElement(_.A,{tabIndex:-1,className:Z}),a.createElement(q,{path:t,sidebar:n}),i&&a.createElement(S,{onClick:o}))}const J=a.memo($);var Q=n(9876),ee=n(5600);const te=e=>{let{sidebar:t,path:n}=e;const o=(0,Q.M)();return a.createElement("ul",{className:(0,l.A)(i.G.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ne(e){return a.createElement(ee.GX,{component:te,props:e})}const ae=a.memo(ne);function le(e){const t=(0,g.l)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement(J,e),l&&a.createElement(ae,e))}const oe={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function re(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:oe.expandButton,title:(0,u.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(k,{className:oe.expandButtonIcon}))}const ce={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry"};function ie(e){let{children:t}=e;const n=(0,d.t)();return a.createElement(a.Fragment,{key:(null==n?void 0:n.name)??"noSidebar"},t)}function se(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:r}=(0,f.zy)(),[c,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{c&&s(!1),o((e=>!e))}),[o,c]);return a.createElement("aside",{className:(0,l.A)(i.G.docs.docSidebarContainer,ce.docSidebarContainer,n&&ce.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ce.docSidebarContainer)&&n&&s(!0)}},a.createElement(ie,null,a.createElement(le,{sidebar:t,path:r,onCollapse:d,isHidden:c})),c&&a.createElement(re,{toggleSidebar:d}))}const de={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function me(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.t)();return a.createElement("main",{className:(0,l.A)(de.docMainContainer,(t||!o)&&de.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced)},n))}const ue={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX"};function be(e){let{children:t}=e;const n=(0,d.t)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.A,{wrapperClassName:ue.docsWrapper},a.createElement(E,null),a.createElement("div",{className:ue.docPage},n&&a.createElement(se,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(me,{hiddenSidebarContainer:l},t)))}var pe=n(1774),he=n(1463);function Ee(e){const{versionMetadata:t}=e,n=(0,o.mz)(e);if(!n)return a.createElement(pe.default,null);const{docElement:m,sidebarName:u,sidebarItems:b}=n;return a.createElement(a.Fragment,null,a.createElement(he.A,{version:t.version,tag:(0,r.tU)(t.pluginId,t.version)}),a.createElement(c.e3,{className:(0,l.A)(i.G.wrapper.docsPages,i.G.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.n,{version:t},a.createElement(d.V,{name:u,items:b},a.createElement(be,null,m)))))}},1774:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(6540),l=n(1312),o=n(1003),r=n(5173);function c(){return a.createElement(a.Fragment,null,a.createElement(o.be,{title:(0,l.T)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.A,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.A,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},2252:(e,t,n)=>{n.d(t,{n:()=>r,r:()=>c});var a=n(6540),l=n(9532);const o=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(o);if(null===e)throw new l.dV("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/338d3fa8.055812d0.js b/assets/js/338d3fa8.055812d0.js deleted file mode 100644 index 002c4b58..00000000 --- a/assets/js/338d3fa8.055812d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[668],{3905:function(e,t,r){r.d(t,{Zo:function(){return p},kt:function(){return d}});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;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 c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(r),d=a,f=m["".concat(c,".").concat(d)]||m[d]||u[d]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var s=2;s{r.d(t,{xA:()=>p,yg:()=>y});var a=r(6540);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(r),m=n,y=u["".concat(s,".").concat(m)]||u[m]||g[m]||o;return r?a.createElement(y,l(l({ref:t},p),{},{components:r})):a.createElement(y,l({ref:t},p))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=r(8168),n=(r(6540),r(5680));const o={},l="Release Process",i={unversionedId:"contribute/release",id:"contribute/release",title:"Release Process",description:"For maintainers, please read the sections below as a guide to create a new release.",source:"@site/docs/contribute/release.md",sourceDirName:"contribute",slug:"/contribute/release",permalink:"/raccoon/contribute/release",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/contribute/release.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Development Guide",permalink:"/raccoon/contribute/development"}},s={},c=[{value:"Create A New Release",id:"create-a-new-release",level:2},{value:"Important Notes",id:"important-notes",level:2}],p={toc:c},u="wrapper";function g(e){let{components:t,...r}=e;return(0,n.yg)(u,(0,a.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.yg)("h1",{id:"release-process"},"Release Process"),(0,n.yg)("p",null,"For maintainers, please read the sections below as a guide to create a new release."),(0,n.yg)("h2",{id:"create-a-new-release"},"Create A New Release"),(0,n.yg)("p",null,"Please follow these steps to create a new release:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"create a new tag of the form ",(0,n.yg)("inlineCode",{parentName:"li"},"vM.m.p"),", where:",(0,n.yg)("ul",{parentName:"li"},(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"M")," = Major version, indicates there are breaking changes from the last Major version."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"m")," = Minor version, indicates there are backward-compatible changes."),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"p")," = Patch version, indicates there are backward-compatible bug-fixes.")))),(0,n.yg)("p",null,"For example:"),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ git tag v1.2.0\n")),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"push the tags to trigger a release.")),(0,n.yg)("pre",null,(0,n.yg)("code",{parentName:"pre",className:"language-bash"},"$ git push --tags\n")),(0,n.yg)("p",null," Raccoon uses Goreleaser under the hood for release management. Each release pushes:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"A ",(0,n.yg)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/releases/"},"github release")),(0,n.yg)("li",{parentName:"ul"},"A docker image to ",(0,n.yg)("a",{parentName:"li",href:"https://hub.docker.com/r/raystack/raccoon"},"raystack/raccoon")),(0,n.yg)("li",{parentName:"ul"},"Updates raystack's ",(0,n.yg)("a",{parentName:"li",href:"https://github.com/raystack/homebrew-tap"},"homebrew-tap")),(0,n.yg)("li",{parentName:"ul"},"Updates raystack's ",(0,n.yg)("a",{parentName:"li",href:"https://github.com/raystack/scoop-bucket"},"scoop-bucket"))),(0,n.yg)("p",null,"Additionally, the Github release will also contain with pre-built binaries for:"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"linux")),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"darwin")," (macOS)"),(0,n.yg)("li",{parentName:"ul"},(0,n.yg)("inlineCode",{parentName:"li"},"windows"))),(0,n.yg)("h2",{id:"important-notes"},"Important Notes"),(0,n.yg)("ul",null,(0,n.yg)("li",{parentName:"ul"},"Raccoon release tags follow ",(0,n.yg)("a",{parentName:"li",href:"https://semver.org/"},"SEMVER")," convention."),(0,n.yg)("li",{parentName:"ul"},"Github workflow is used to build and push the built docker image to Docker hub."),(0,n.yg)("li",{parentName:"ul"},"A release is triggered when a github tag of format ",(0,n.yg)("inlineCode",{parentName:"li"},"vM.m.p")," is pushed."),(0,n.yg)("li",{parentName:"ul"},"Release tags should only point to main branch")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3585ba8f.2a60ee12.js b/assets/js/3585ba8f.2a60ee12.js deleted file mode 100644 index 1e03290f..00000000 --- a/assets/js/3585ba8f.2a60ee12.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[144],{3769:function(e){e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/3585ba8f.467414d2.js b/assets/js/3585ba8f.467414d2.js new file mode 100644 index 00000000..e1ab2882 --- /dev/null +++ b/assets/js/3585ba8f.467414d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[187],{1966:c=>{c.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/553.217c3e29.js b/assets/js/553.217c3e29.js new file mode 100644 index 00000000..44273bc1 --- /dev/null +++ b/assets/js/553.217c3e29.js @@ -0,0 +1 @@ +(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[553],{5680:(e,t,n)=>{"use strict";n.d(t,{xA:()=>u,yg:()=>f});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),i=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=i(e.components);return o.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,c=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=i(n),m=r,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||c;return n?o.createElement(f,a(a({ref:t},u),{},{components:n})):o.createElement(f,a({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var c=n.length,a=new Array(c);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,a[1]=s;for(var i=2;i{"use strict";n.d(t,{A:()=>R});var o=n(8168),r=n(6540),c=n(2303),a=n(53),s=n(5293),l=n(6342);function i(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,s.G)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var u=n(8426),p=n.n(u);const d=/title=(?["'])(?.*?)\1/,m=/\{(?<range>[\d,-]+)\}/,f={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function y(e,t){const n=e.map((e=>{const{start:n,end:o}=f[e];return`(?:${n}\\s*(${t.flatMap((e=>{var t,n;return[e.line,null==(t=e.block)?void 0:t.start,null==(n=e.block)?void 0:n.end].filter(Boolean)})).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function g(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:r,metastring:c}=t;if(c&&m.test(c)){const e=c.match(m).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${c}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=r[0].className,o=p()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const a=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return y(["js","jsBlock"],t);case"jsx":case"tsx":return y(["js","jsBlock","jsx"],t);case"html":return y(["js","jsBlock","html"],t);case"python":case"py":case"bash":return y(["bash"],t);case"markdown":case"md":return y(["html","jsx","bash"],t);default:return y(Object.keys(f),t)}}(o,r),s=n.split("\n"),l=Object.fromEntries(r.map((e=>[e.className,{start:0,range:""}]))),i=Object.fromEntries(r.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),d=Object.fromEntries(r.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<s.length;){const e=s[p].match(a);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));i[t]?l[i[t]].range+=`${p},`:u[t]?l[u[t]].start=p:d[t]&&(l[d[t]].range+=`${l[d[t]].start}-${p-1},`),s.splice(p,1)}n=s.join("\n");const g={};return Object.entries(l).forEach((e=>{let[t,{range:n}]=e;p()(n).forEach((e=>{g[e]??=[],g[e].push(t)}))})),{lineClassNames:g,code:n}}var b=n(7559);const h={codeBlockContainer:"codeBlockContainer_Ckt0"};function v(e){let{as:t,...n}=e;const c=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,r]=e;const c=t[o];c&&"string"==typeof r&&(n[c]=r)})),n}(i());return r.createElement(t,(0,o.A)({},n,{style:c,className:(0,a.A)(n.className,h.codeBlockContainer,b.G.common.codeBlock)}))}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function E(e){let{children:t,className:n}=e;return r.createElement(v,{as:"pre",tabIndex:0,className:(0,a.A)(k.codeBlockStandalone,"thin-scrollbar",n)},r.createElement("code",{className:k.codeBlockLines},t))}var B=n(9532);const N={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,o]=(0,r.useState)(),c=(0,r.useCallback)((()=>{var t;o(null==(t=e.current)?void 0:t.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,r.useEffect)((()=>{c()}),[c]),function(e,t,n){void 0===n&&(n=N);const o=(0,B.qd)(t),c=(0,B.Be)(n);(0,r.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,c),()=>t.disconnect()}),[e,o,c])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),c())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const j={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"}}]};var C={Prism:n(1258).A,theme:j};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 L(){return L=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},L.apply(this,arguments)}var T=/\r\n|\r|\n/,A=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},x=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function P(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var S=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];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?function(e,t){var n=e.plain,o=Object.create(null),r=e.styles.reduce((function(e,n){var o=n.languages,r=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=L({},e[t],r);e[t]=n})),e}),o);return r.root=n,r.plain=L({},n,{backgroundColor:null}),r}(e.theme,e.language):void 0;return t.themeDict=n})),O(this,"getLineProps",(function(e){var n=e.key,o=e.className,r=e.style,c=L({},P(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),a=t.getThemeDict(t.props);return void 0!==a&&(c.style=a.plain),void 0!==r&&(c.style=void 0!==c.style?L({},c.style,r):r),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),O(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,r=n.length,c=t.getThemeDict(t.props);if(void 0!==c){if(1===r&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===r&&!o)return c[n[0]];var a=o?{display:"inline-block"}:{},s=n.map((function(e){return c[e]}));return Object.assign.apply(Object,[a].concat(s))}})),O(this,"getTokenProps",(function(e){var n=e.key,o=e.className,r=e.style,c=e.token,a=L({},P(e,["key","className","style","token"]),{className:"token "+c.types.join(" "),children:c.content,style:t.getStyleForToken(c),key:void 0});return void 0!==r&&(a.style=void 0!==a.style?L({},a.style,r):r),void 0!==n&&(a.key=n),o&&(a.className+=" "+o),a})),O(this,"tokenize",(function(e,t,n,o){var r={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",r);var c=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),c}))}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,o=e.code,r=e.children,c=this.getThemeDict(this.props),a=t.languages[n];return r({tokens:function(e){for(var t=[[]],n=[e],o=[0],r=[e.length],c=0,a=0,s=[],l=[s];a>-1;){for(;(c=o[a]++)<r[a];){var i=void 0,u=t[a],p=n[a][c];if("string"==typeof p?(u=a>0?u:["plain"],i=p):(u=x(u,p.type),p.alias&&(u=x(u,p.alias)),i=p.content),"string"==typeof i){var d=i.split(T),m=d.length;s.push({types:u,content:d[0]});for(var f=1;f<m;f++)A(s),l.push(s=[]),s.push({types:u,content:d[f]})}else a++,t.push(u),n.push(i),o.push(0),r.push(i.length)}a--,t.pop(),n.pop(),o.pop(),r.pop()}return A(s),l}(void 0!==a?this.tokenize(t,o,a,n):[o]),className:"prism-code language-"+n,style:void 0!==c?c.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(r.Component);const _=S,I={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function D(e){let{line:t,classNames:n,showLineNumbers:c,getLineProps:s,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const i=s({line:t,className:(0,a.A)(n,c&&I.codeLine)}),u=t.map(((e,t)=>r.createElement("span",(0,o.A)({key:t},l({token:e,key:t})))));return r.createElement("span",i,c?r.createElement(r.Fragment,null,r.createElement("span",{className:I.codeLineNumber}),r.createElement("span",{className:I.codeLineContent},u)):r.createElement(r.Fragment,null,u,r.createElement("br",null)))}var W=n(1312);const $={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function H(e){let{code:t,className:n}=e;const[o,c]=(0,r.useState)(!1),s=(0,r.useRef)(void 0),l=(0,r.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;const o=document.createElement("textarea"),r=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const c=document.getSelection();let a=!1;c.rangeCount>0&&(a=c.getRangeAt(0)),n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let s=!1;try{s=document.execCommand("copy")}catch{}o.remove(),a&&(c.removeAllRanges(),c.addRange(a)),r&&r.focus()}(t),c(!0),s.current=window.setTimeout((()=>{c(!1)}),1e3)}),[t]);return(0,r.useEffect)((()=>()=>window.clearTimeout(s.current)),[]),r.createElement("button",{type:"button","aria-label":o?(0,W.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,W.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,W.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,a.A)("clean-btn",n,$.copyButton,o&&$.copyButtonCopied),onClick:l},r.createElement("span",{className:$.copyButtonIcons,"aria-hidden":"true"},r.createElement("svg",{className:$.copyButtonIcon,viewBox:"0 0 24 24"},r.createElement("path",{d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})),r.createElement("svg",{className:$.copyButtonSuccessIcon,viewBox:"0 0 24 24"},r.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))))}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function z(e){let{className:t,onClick:n,isEnabled:o}=e;const c=(0,W.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return r.createElement("button",{type:"button",onClick:n,className:(0,a.A)("clean-btn",t,o&&M.wordWrapButtonEnabled),"aria-label":c,title:c},r.createElement("svg",{className:M.wordWrapButtonIcon,viewBox:"0 0 24 24","aria-hidden":"true"},r.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})))}function V(e){let{children:t,className:n="",metastring:c,title:s,showLineNumbers:u,language:p}=e;const{prism:{defaultLanguage:m,magicComments:f}}=(0,l.p)(),y=p??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return null==t?void 0:t.replace(/language-/,"")}(n)??m,b=i(),h=function(){const[e,t]=(0,r.useState)(!1),[n,o]=(0,r.useState)(!1),c=(0,r.useRef)(null),a=(0,r.useCallback)((()=>{const n=c.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[c,e]),s=(0,r.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=c.current,n=e>t||c.current.querySelector("code").hasAttribute("style");o(n)}),[c]);return w(c,s),(0,r.useEffect)((()=>{s()}),[e,s]),(0,r.useEffect)((()=>(window.addEventListener("resize",s,{passive:!0}),()=>{window.removeEventListener("resize",s)})),[s]),{codeBlockRef:c,isEnabled:e,isCodeScrollable:n,toggle:a}}(),E=function(e){var t;return(null==e||null==(t=e.match(d))?void 0:t.groups.title)??""}(c)||s,{lineClassNames:B,code:N}=g(t,{metastring:c,language:y,magicComments:f}),j=u??function(e){return Boolean(null==e?void 0:e.includes("showLineNumbers"))}(c);return r.createElement(v,{as:"div",className:(0,a.A)(n,y&&!n.includes(`language-${y}`)&&`language-${y}`)},E&&r.createElement("div",{className:k.codeBlockTitle},E),r.createElement("div",{className:k.codeBlockContent},r.createElement(_,(0,o.A)({},C,{theme:b,code:N,language:y??"text"}),(e=>{let{className:t,tokens:n,getLineProps:o,getTokenProps:c}=e;return r.createElement("pre",{tabIndex:0,ref:h.codeBlockRef,className:(0,a.A)(t,k.codeBlock,"thin-scrollbar")},r.createElement("code",{className:(0,a.A)(k.codeBlockLines,j&&k.codeBlockLinesWithNumbering)},n.map(((e,t)=>r.createElement(D,{key:t,line:e,getLineProps:o,getTokenProps:c,classNames:B[t],showLineNumbers:j})))))})),r.createElement("div",{className:k.buttonGroup},(h.isEnabled||h.isCodeScrollable)&&r.createElement(z,{className:k.codeButton,onClick:()=>h.toggle(),isEnabled:h.isEnabled}),r.createElement(H,{className:k.codeButton,code:N}))))}function R(e){let{children:t,...n}=e;const a=(0,c.A)(),s=function(e){return r.Children.toArray(e).some((e=>(0,r.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof s?V:E;return r.createElement(l,(0,o.A)({key:String(a)},n),s)}},8426:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,r,c]=t;if(o&&c){o=parseInt(o),c=parseInt(c);const e=o<c?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(c+=e);for(let t=o;t!==c;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/58175526.77dae5db.js b/assets/js/58175526.77dae5db.js deleted file mode 100644 index dd54fc4d..00000000 --- a/assets/js/58175526.77dae5db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[409],{3905:function(e,t,l){l.d(t,{Zo:function(){return s},kt:function(){return k}});var n=l(7294);function i(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function a(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,n)}return l}function r(e){for(var t=1;t<arguments.length;t++){var l=null!=arguments[t]?arguments[t]:{};t%2?a(Object(l),!0).forEach((function(t){i(e,t,l[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(l)):a(Object(l)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(l,t))}))}return e}function o(e,t){if(null==e)return{};var l,n,i=function(e,t){if(null==e)return{};var l,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||(i[l]=e[l]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)l=a[n],t.indexOf(l)>=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(i[l]=e[l])}return i}var u=n.createContext({}),p=function(e){var t=n.useContext(u),l=t;return e&&(l="function"==typeof e?e(t):r(r({},t),e)),l},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},_={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var l=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),d=p(l),k=i,c=d["".concat(u,".").concat(k)]||d[k]||_[k]||a;return l?n.createElement(c,r(r({ref:t},s),{},{components:l})):n.createElement(c,r({ref:t},s))}));function k(e,t){var l=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=l.length,r=new Array(a);r[0]=d;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:i,r[1]=o;for(var p=2;p<a;p++)r[p]=l[p];return n.createElement.apply(null,r)}return n.createElement.apply(null,l)}d.displayName="MDXCreateElement"},8836:function(e,t,l){l.r(t),l.d(t,{assets:function(){return s},contentTitle:function(){return u},default:function(){return k},frontMatter:function(){return o},metadata:function(){return p},toc:function(){return _}});var n=l(7462),i=l(3366),a=(l(7294),l(3905)),r=["components"],o={},u="Configurations",p={unversionedId:"reference/configurations",id:"reference/configurations",title:"Configurations",description:"This page contains reference for all the application configurations for Raccoon.",source:"@site/docs/reference/configurations.md",sourceDirName:"reference",slug:"/reference/configurations",permalink:"/raccoon/reference/configurations",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/reference/configurations.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Structure",permalink:"/raccoon/concepts/structure"},next:{title:"Metrics",permalink:"/raccoon/reference/metrics"}},s={},_=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Server",id:"server",level:2},{value:"<code>SERVER_WEBSOCKET_PORT</code>",id:"server_websocket_port",level:3},{value:"<code>SERVER_WEBSOCKET_MAX_CONN</code>",id:"server_websocket_max_conn",level:3},{value:"<code>SERVER_WEBSOCKET_READ_BUFFER_SIZE</code>",id:"server_websocket_read_buffer_size",level:3},{value:"<code>SERVER_WEBSOCKET_WRITE_BUFFER_SIZE</code>",id:"server_websocket_write_buffer_size",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_ID_HEADER</code>",id:"server_websocket_conn_id_header",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_GROUP_HEADER</code>",id:"server_websocket_conn_group_header",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_GROUP_DEFAULT</code>",id:"server_websocket_conn_group_default",level:3},{value:"<code>SERVER_WEBSOCKET_PING_INTERVAL_MS</code>",id:"server_websocket_ping_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS</code>",id:"server_websocket_pong_wait_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS</code>",id:"server_websocket_write_wait_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_PINGER_SIZE</code>",id:"server_websocket_pinger_size",level:3},{value:"<code>SERVER_WEBSOCKET_CHECK_ORIGIN</code>",id:"server_websocket_check_origin",level:3},{value:"<code>SERVER_CORS_ENABLED</code>",id:"server_cors_enabled",level:3},{value:"<code>SERVER_CORS_ALLOWED_ORIGIN</code>",id:"server_cors_allowed_origin",level:3},{value:"<code>SERVER_CORS_ALLOWED_METHODS</code>",id:"server_cors_allowed_methods",level:3},{value:"<code>SERVER_CORS_ALLOWED_HEADERS</code>",id:"server_cors_allowed_headers",level:3},{value:"<code>SERVER_CORS_ALLOW_CREDENTIALS</code>",id:"server_cors_allow_credentials",level:3},{value:"<code>SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS</code>",id:"server_cors_preflight_max_age_seconds",level:3},{value:"<code>SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED</code>",id:"server_batch_dedup_in_connection_enabled",level:3},{value:"Worker",id:"worker",level:2},{value:"<code>WORKER_BUFFER_CHANNEL_SIZE</code>",id:"worker_buffer_channel_size",level:3},{value:"<code>WORKER_BUFFER_FLUSH_TIMEOUT_MS</code>",id:"worker_buffer_flush_timeout_ms",level:3},{value:"<code>WORKER_POOL_SIZE</code>",id:"worker_pool_size",level:3},{value:"<code>WORKER_KAFKA_DELIVERY_CHANNEL_SIZE</code>",id:"worker_kafka_delivery_channel_size",level:3},{value:"Event Distribution",id:"event-distribution",level:2},{value:"<code>EVENT_DISTRIBUTION_PUBLISHER_PATTERN</code>",id:"event_distribution_publisher_pattern",level:3},{value:"Publisher",id:"publisher",level:2},{value:"<code>PUBLISHER_TYPE</code>",id:"publisher_type",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS</code>",id:"publisher_kafka_client_bootstrap_servers",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_ACKS</code>",id:"publisher_kafka_client_acks",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_RETRIES</code>",id:"publisher_kafka_client_retries",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS</code>",id:"publisher_kafka_client_retry_backoff_ms",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS</code>",id:"publisher_kafka_client_statistics_interval_ms",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES</code>",id:"publisher_kafka_client_queue_buffering_max_messages",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_*</code>",id:"publisher_kafka_client_",level:3},{value:"<code>PUBLISHER_KAFKA_FLUSH_INTERVAL_MS</code>",id:"publisher_kafka_flush_interval_ms",level:3},{value:"<code>PUBLISHER_PUBSUB_CREDENTIALS</code>",id:"publisher_pubsub_credentials",level:3},{value:"<code>PUBLISHER_PUBSUB_PROJECT_ID</code>",id:"publisher_pubsub_project_id",level:3},{value:"<code>PUBLISHER_PUBSUB_TOPIC_AUTOCREATE</code>",id:"publisher_pubsub_topic_autocreate",level:3},{value:"<code>PUBLISHER_PUBSUB_TOPIC_RETENTION_MS</code>",id:"publisher_pubsub_topic_retention_ms",level:3},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS</code>",id:"publisher_pubsub_publish_delay_threshold_ms",level:3},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD</code>",id:"publisher_pubsub_publish_count_threshold",level:3},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD</code>",id:"publisher_pubsub_publish_byte_threshold",level:3},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS</code>",id:"publisher_pubsub_publish_timeout_ms",level:3},{value:"<code>PUBLISHER_KINESIS_AWS_REGION</code>",id:"publisher_kinesis_aws_region",level:3},{value:"<code>PUBLISHER_KINESIS_CREDENTIALS</code>",id:"publisher_kinesis_credentials",level:3},{value:"<code>PUBLISHER_KINESIS_STREAM_AUTOCREATE</code>",id:"publisher_kinesis_stream_autocreate",level:3},{value:"<code>PUBLISHER_KINESIS_STREAM_MODE</code>",id:"publisher_kinesis_stream_mode",level:3},{value:"<code>PUBLISHER_KINESIS_STREAM_SHARDS</code>",id:"publisher_kinesis_stream_shards",level:3},{value:"<code>PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS</code>",id:"publisher_kinesis_stream_probe_interval_ms",level:3},{value:"<code>PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS</code>",id:"publisher_kinesis_publish_timeout_ms",level:3},{value:"Metric",id:"metric",level:2},{value:"<code>METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS</code>",id:"metric_runtime_stats_record_interval_ms",level:3},{value:"<code>METRIC_STATSD_ENABLED</code>",id:"metric_statsd_enabled",level:3},{value:"<code>METRIC_STATSD_ADDRESS</code>",id:"metric_statsd_address",level:3},{value:"<code>METRIC_STATSD_FLUSH_PERIOD_MS</code>",id:"metric_statsd_flush_period_ms",level:3},{value:"<code>METRIC_PROMETHEUS_ENABLED</code>",id:"metric_prometheus_enabled",level:3},{value:"<code>METRIC_PROMETHEUS_PATH</code>",id:"metric_prometheus_path",level:3},{value:"<code>METRIC_PROMETHEUS_PORT</code>",id:"metric_prometheus_port",level:3},{value:"Log",id:"log",level:2},{value:"<code>LOG_LEVEL</code>",id:"log_level",level:3},{value:"Event",id:"event",level:2},{value:"<code>EVENT_ACK</code>",id:"event_ack",level:3}],d={toc:_};function k(e){var t=e.components,l=(0,i.Z)(e,r);return(0,a.kt)("wrapper",(0,n.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"configurations"},"Configurations"),(0,a.kt)("p",null,"This page contains reference for all the application configurations for Raccoon."),(0,a.kt)("h2",{id:"table-of-contents"},"Table of Contents"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#server"},"Server")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#worker"},"Worker")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#event-distribution"},"Event Distribution")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher"},"Publisher")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#metric"},"Metric")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/raccoon/reference/configurations#log"},"Log"))),(0,a.kt)("h2",{id:"server"},"Server"),(0,a.kt)("h3",{id:"server_websocket_port"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PORT")),(0,a.kt)("p",null,"Port for the service to listen."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"8080"))),(0,a.kt)("h3",{id:"server_websocket_max_conn"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_MAX_CONN")),(0,a.kt)("p",null,"Maximum connection that can be handled by the server instance. You want to set it according to your resource utilization. You also need to check the ",(0,a.kt)("a",{parentName:"p",href:"https://docs.oracle.com/cd/E19623-01/820-6168/file-descriptor-requirements.html#:~:text=Linux%20systems%20limit%20the%20number,worker%20threads%20will%20be%20blocked."},"limit of open file descriptor allowed")," by the OS."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"30000"))),(0,a.kt)("h3",{id:"server_websocket_read_buffer_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_READ_BUFFER_SIZE")),(0,a.kt)("p",null,"Specify I/O buffer sizes in bytes: ",(0,a.kt)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers"},"Refer gorilla websocket API")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"10240"))),(0,a.kt)("h3",{id:"server_websocket_write_buffer_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_WRITE_BUFFER_SIZE")),(0,a.kt)("p",null,"Specify I/O buffer sizes in bytes: ",(0,a.kt)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers"},"Refer gorilla websocket API")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"10240"))),(0,a.kt)("h3",{id:"server_websocket_conn_id_header"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_ID_HEADER")),(0,a.kt)("p",null,"Unique identifier for the server to maintain the connection. A single uniq id can only connect once in a session. If, there is a subsequence connection with the same uniq id the connection will be rejected."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Example value: ",(0,a.kt)("inlineCode",{parentName:"li"},"X-User-ID")),(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Required"))),(0,a.kt)("h3",{id:"server_websocket_conn_group_header"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")),(0,a.kt)("p",null,"Additional identifier for the server to maintain the connection. Value of the conn group header combined with user id will act as unique identifier instead of only user id. You can use this if you want to differentiate between user groups or clients e.g(mobile, web). The group names is used as conn_group tag in some of the metrics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Example value: ",(0,a.kt)("inlineCode",{parentName:"li"},"X-User-Group")),(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional"))),(0,a.kt)("h3",{id:"server_websocket_conn_group_default"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_GROUP_DEFAULT")),(0,a.kt)("p",null,"Default connection group name. The default is fallback when ",(0,a.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," is not set or when the value of group header is empty. In case the connection group default is clashing with your actual group name, override this config."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"--default--")),(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional"))),(0,a.kt)("h3",{id:"server_websocket_ping_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PING_INTERVAL_MS")),(0,a.kt)("p",null,"Interval of each ping to client. The interval is in seconds."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"30"))),(0,a.kt)("h3",{id:"server_websocket_pong_wait_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS")),(0,a.kt)("p",null,"Wait time for client to send Pong message back after server sends Ping. When the time exceeded the connection will be dropped."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"60"))),(0,a.kt)("h3",{id:"server_websocket_write_wait_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS")),(0,a.kt)("p",null,"Timeout Deadline set on the writes. On timeout the websocket state is corrupt and all future writes will return error: ",(0,a.kt)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetWriteDeadline"},"Refer gorilla websocket API")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"5"))),(0,a.kt)("h3",{id:"server_websocket_pinger_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PINGER_SIZE")),(0,a.kt)("p",null,"Number of goroutine spawn to Ping clients."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"1"))),(0,a.kt)("h3",{id:"server_websocket_check_origin"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CHECK_ORIGIN")),(0,a.kt)("p",null,"Toggle CORS check function. Set ",(0,a.kt)("inlineCode",{parentName:"p"},"true")," to check each request origin. Set ",(0,a.kt)("inlineCode",{parentName:"p"},"false")," to disable check origin and allow every request. Check origin function check against ",(0,a.kt)("inlineCode",{parentName:"p"},"Origin")," header."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type: ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"true"))),(0,a.kt)("h3",{id:"server_cors_enabled"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_ENABLED")),(0,a.kt)("p",null,"The config decides whether to enable the cors middleware and thus allow CORS requests. This config only enables CORS for rest services. For websocket, refer ",(0,a.kt)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CHECK_ORIGIN")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"server_cors_allowed_origin"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_ORIGIN")),(0,a.kt)("p",null,"The server decides which origin to allow. The configuration is expected to space separated. Multiple values are supported. The value requies ",(0,a.kt)("inlineCode",{parentName:"p"},"SERVER_CORS_ENABLED")," to be true to take effect. If you want to allow all host headers. You can pass ",(0,a.kt)("inlineCode",{parentName:"p"},"*")," as the value."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value ``")),(0,a.kt)("h3",{id:"server_cors_allowed_methods"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_METHODS")),(0,a.kt)("p",null,"The http methods allowed when it's a cross origin request. The http methods are expected to be space separated. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value ",(0,a.kt)("inlineCode",{parentName:"li"},"GET HEAD POST OPTIONS"))),(0,a.kt)("h3",{id:"server_cors_allowed_headers"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_HEADERS")),(0,a.kt)("p",null,"The http request headers which are allowed when request is cross origin. The input expects to add any additional headers which is going to be sent by the client ex: ",(0,a.kt)("inlineCode",{parentName:"p"},"Authorization"),". Headers which are essential for the functioning of Raccoon like Content-Type, Connection-Id & Group headers are added by default and need not be passed as configuration."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value ``")),(0,a.kt)("h3",{id:"server_cors_allow_credentials"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOW_CREDENTIALS")),(0,a.kt)("p",null,"AllowCredentials can be used to specify that the user agent may pass authentication details along with the request. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"server_cors_preflight_max_age_seconds"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS")),(0,a.kt)("p",null,"Replies with a header for clients on how long to cache the response of the preflight request. It's not enforceable. The max value is 600s"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value ",(0,a.kt)("inlineCode",{parentName:"li"},"0"))),(0,a.kt)("h3",{id:"server_batch_dedup_in_connection_enabled"},(0,a.kt)("inlineCode",{parentName:"h3"},"SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED")),(0,a.kt)("p",null,"The server decides whether or not to handle duplicate batches for the active connection. If a batch is sent with a duplicate ReqGUID, the server uses best attempts to discard the duplicate batches. Set ",(0,a.kt)("inlineCode",{parentName:"p"},"true")," to enable the setting."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h2",{id:"worker"},"Worker"),(0,a.kt)("h3",{id:"worker_buffer_channel_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"WORKER_BUFFER_CHANNEL_SIZE")),(0,a.kt)("p",null,"Maximum batch that service can handle when workers are busy. When the number of batch is exceeded, the worker will backpressure causing websocket to stop reading new request."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"100"))),(0,a.kt)("h3",{id:"worker_buffer_flush_timeout_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"WORKER_BUFFER_FLUSH_TIMEOUT_MS")),(0,a.kt)("p",null,"Upon shutdown, the worker try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the worker is forcefully closed."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"5000"))),(0,a.kt)("h3",{id:"worker_pool_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"WORKER_POOL_SIZE")),(0,a.kt)("p",null,"No of workers that processes the events concurrently."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"5"))),(0,a.kt)("h3",{id:"worker_kafka_delivery_channel_size"},(0,a.kt)("inlineCode",{parentName:"h3"},"WORKER_KAFKA_DELIVERY_CHANNEL_SIZE")),(0,a.kt)("p",null,"Delivery channel is implementation detail where the kafka client asks for channel in the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go/blob/master/examples/producer_example/producer_example.go#L51"},"produce API"),". The publisher uses the channel to wait for the events to be delivered. The channel contains the status delivery of the events. Normally you won't need to touch this."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"10"))),(0,a.kt)("h2",{id:"event-distribution"},"Event Distribution"),(0,a.kt)("h3",{id:"event_distribution_publisher_pattern"},(0,a.kt)("inlineCode",{parentName:"h3"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")),(0,a.kt)("p",null,"Routes events based on given pattern and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/Event.proto#L31"},"type"),". The pattern is following ",(0,a.kt)("a",{parentName:"p",href:"https://golang.org/pkg/fmt/"},"go string format")," with event ",(0,a.kt)("inlineCode",{parentName:"p"},"type")," as second argument. The result of the string format will be the kafka topic target of the event."),(0,a.kt)("p",null,"For example, you pass ",(0,a.kt)("inlineCode",{parentName:"p"},"%s-event")," as ",(0,a.kt)("inlineCode",{parentName:"p"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN"),". If you send event with ",(0,a.kt)("inlineCode",{parentName:"p"},"click")," type, your event will be forwareded to ",(0,a.kt)("inlineCode",{parentName:"p"},"click-event")," kafka topic on the configured broker. If you send event with ",(0,a.kt)("inlineCode",{parentName:"p"},"buy")," type, your event will be forwarded to ",(0,a.kt)("inlineCode",{parentName:"p"},"buy-event"),"."),(0,a.kt)("p",null,"You can also route the events to single topic irrespective of the type. To do that you can drop ",(0,a.kt)("inlineCode",{parentName:"p"},"%s")," in the value. For example, provided ",(0,a.kt)("inlineCode",{parentName:"p"},"mobile-events")," as value. All incoming events will be routed to ",(0,a.kt)("inlineCode",{parentName:"p"},"mobile-events")," kafka topic."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Required")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"clickstream-%s-log"))),(0,a.kt)("h2",{id:"publisher"},"Publisher"),(0,a.kt)("h3",{id:"publisher_type"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_TYPE")),(0,a.kt)("p",null,"The publisher to use for transmitting events."),(0,a.kt)("p",null,"Publisher specific configuration follows the pattern ",(0,a.kt)("inlineCode",{parentName:"p"},"PUBLISHER_${TYPE}_*")," where ",(0,a.kt)("inlineCode",{parentName:"p"},"${TYPE}")," is the publisher type in upper case."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"kafka")),(0,a.kt)("li",{parentName:"ul"},"Possible values: ",(0,a.kt)("inlineCode",{parentName:"li"},"kafka"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"pubsub"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"kinesis"))),(0,a.kt)("h3",{id:"publisher_kafka_client_bootstrap_servers"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS")),(0,a.kt)("p",null,"Kafka brokers IP address where the events are published."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Example value: localhost:9092"),(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Required"))),(0,a.kt)("h3",{id:"publisher_kafka_client_acks"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_ACKS")),(0,a.kt)("p",null,"Number of replica acknowledgement before it send ack back to service."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"-1"))),(0,a.kt)("h3",{id:"publisher_kafka_client_retries"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_RETRIES")),(0,a.kt)("p",null,"Number of retries in case of failure."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"2147483647"))),(0,a.kt)("h3",{id:"publisher_kafka_client_retry_backoff_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS")),(0,a.kt)("p",null,"Backoff time on retry."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"100"))),(0,a.kt)("h3",{id:"publisher_kafka_client_statistics_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS")),(0,a.kt)("p",null,"librdkafka statistics emit interval. The application also needs to register a stats callback using rd_kafka_conf_set_stats_cb","(",")",". The granularity is 1000ms. A value of 0 disables statistics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"0"))),(0,a.kt)("h3",{id:"publisher_kafka_client_queue_buffering_max_messages"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES")),(0,a.kt)("p",null,"Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"100000"))),(0,a.kt)("h3",{id:"publisher_kafka_client_"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_CLIENT_*")),(0,a.kt)("p",null,"Kafka client config is dynamically configured. You can see for other configuration ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"here")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: see the ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"reference"))),(0,a.kt)("h3",{id:"publisher_kafka_flush_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KAFKA_FLUSH_INTERVAL_MS")),(0,a.kt)("p",null,"Upon shutdown, the publisher will try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the publisher is forcefully closed."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"1000"))),(0,a.kt)("h3",{id:"publisher_pubsub_credentials"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_CREDENTIALS")),(0,a.kt)("p",null,"Path to the file containing service account credentials. Defaults to the value of ",(0,a.kt)("inlineCode",{parentName:"p"},"GOOGLE_APPLICATION_CREDENTIALS")," environment variable. This is used to authenticate with Google Cloud Platform."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Required")," (if ",(0,a.kt)("inlineCode",{parentName:"li"},"PUBLISHER_TYPE=pubsub"),", otherwise ignored)")),(0,a.kt)("h3",{id:"publisher_pubsub_project_id"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_PROJECT_ID")),(0,a.kt)("p",null,"Destination Google Cloud Project ID. Messages will be transmitted to the PubSub topics under this project."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Required")," (if ",(0,a.kt)("inlineCode",{parentName:"li"},"PUBLISHER_TYPE=pubsub"),", otherwise ignored)")),(0,a.kt)("h3",{id:"publisher_pubsub_topic_autocreate"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_TOPIC_AUTOCREATE")),(0,a.kt)("p",null,"Whether Raccoon should create a topic if it doesn't exist."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"publisher_pubsub_topic_retention_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_TOPIC_RETENTION_MS")),(0,a.kt)("p",null,"How long PubSub should retain messages in a topic (in milliseconds). Valid values must be between 10 minutes and 31 days."),(0,a.kt)("p",null,"see ",(0,a.kt)("a",{parentName:"p",href:"https://cloud.google.com/pubsub/docs/create-topic"},"pubsub docs")," for more information."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"0"))),(0,a.kt)("h3",{id:"publisher_pubsub_publish_delay_threshold_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS")),(0,a.kt)("p",null,"Maximum time to wait for before publishing a batch of messages."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"10"))),(0,a.kt)("h3",{id:"publisher_pubsub_publish_count_threshold"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD")),(0,a.kt)("p",null,"Maximum number of message to accumulate before transmission."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"100"))),(0,a.kt)("h3",{id:"publisher_pubsub_publish_byte_threshold"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD")),(0,a.kt)("p",null,"Maximum buffer size (in bytes)"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"1000000")," (~1MB)")),(0,a.kt)("h3",{id:"publisher_pubsub_publish_timeout_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS")),(0,a.kt)("p",null,"How long to wait before aborting a publish operation."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"60000")," (1 Minute)")),(0,a.kt)("h3",{id:"publisher_kinesis_aws_region"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_AWS_REGION")),(0,a.kt)("p",null,"AWS Region of the target kinesis stream. The value of ",(0,a.kt)("inlineCode",{parentName:"p"},"AWS_REGION")," is used as fallback if this variable is not set."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Required"))),(0,a.kt)("h3",{id:"publisher_kinesis_credentials"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_CREDENTIALS")),(0,a.kt)("p",null,"Path to ",(0,a.kt)("a",{parentName:"p",href:"https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html"},"AWS Credentials file"),". "),(0,a.kt)("p",null,"You can also specify the credentials using ",(0,a.kt)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," environment variables. "),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"$HOME/.aws/credentials"))),(0,a.kt)("h3",{id:"publisher_kinesis_stream_autocreate"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_STREAM_AUTOCREATE")),(0,a.kt)("p",null,"Whether Raccon should create a stream if it doesn't exist."),(0,a.kt)("p",null,"NOTE: We recommend that you create all streams that you need to publish to ahead of time."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"publisher_kinesis_stream_mode"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_STREAM_MODE")),(0,a.kt)("p",null,"This configuration variable controls the ",(0,a.kt)("inlineCode",{parentName:"p"},"StreamMode")," of the\nstreams created by Raccon."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"ON_DEMAND")),(0,a.kt)("li",{parentName:"ul"},"Possible values: ",(0,a.kt)("inlineCode",{parentName:"li"},"ON_DEMAND"),", ",(0,a.kt)("inlineCode",{parentName:"li"},"PROVISIONED"))),(0,a.kt)("h3",{id:"publisher_kinesis_stream_shards"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_STREAM_SHARDS")),(0,a.kt)("p",null,"This controls the number of shards configured for a stream created by Raccoon."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"4"))),(0,a.kt)("h3",{id:"publisher_kinesis_stream_probe_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS")),(0,a.kt)("p",null,"This specifies the time delay between stream status checks."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"1000"))),(0,a.kt)("h3",{id:"publisher_kinesis_publish_timeout_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS")),(0,a.kt)("p",null,"How long to wait for before aborting a publish operation."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value ",(0,a.kt)("inlineCode",{parentName:"li"},"60000"))),(0,a.kt)("h2",{id:"metric"},"Metric"),(0,a.kt)("h3",{id:"metric_runtime_stats_record_interval_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS")),(0,a.kt)("p",null,"The time interval between recording runtime stats of the application in the insturmentation. It's recommended to keep this value equivalent to flush interval when using statsd and your collector's scrape interval when using prometheus as your instrumentation."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default Value: ",(0,a.kt)("inlineCode",{parentName:"li"},"10000"))),(0,a.kt)("h3",{id:"metric_statsd_enabled"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_STATSD_ENABLED")),(0,a.kt)("p",null,"Flag to enable export of statsd metric"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"metric_statsd_address"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_STATSD_ADDRESS")),(0,a.kt)("p",null,"Address to reports the service metrics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},":8125"))),(0,a.kt)("h3",{id:"metric_statsd_flush_period_ms"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_STATSD_FLUSH_PERIOD_MS")),(0,a.kt)("p",null,"Interval for the service to push metrics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"10000"))),(0,a.kt)("h3",{id:"metric_prometheus_enabled"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_ENABLED")),(0,a.kt)("p",null,"Flag to enable a prometheus http server to expose metrics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"false"))),(0,a.kt)("h3",{id:"metric_prometheus_path"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_PATH")),(0,a.kt)("p",null,"The path at which prometheus server should serve metrics."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"/metrics"))),(0,a.kt)("h3",{id:"metric_prometheus_port"},(0,a.kt)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_PORT")),(0,a.kt)("p",null,"The port number on which prometheus server will be listening for metric scraping requests."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"9090"))),(0,a.kt)("h2",{id:"log"},"Log"),(0,a.kt)("h3",{id:"log_level"},(0,a.kt)("inlineCode",{parentName:"h3"},"LOG_LEVEL")),(0,a.kt)("p",null,"Level available are ",(0,a.kt)("inlineCode",{parentName:"p"},"info")," ",(0,a.kt)("inlineCode",{parentName:"p"},"panic")," ",(0,a.kt)("inlineCode",{parentName:"p"},"fatal")," ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," ",(0,a.kt)("inlineCode",{parentName:"p"},"warn")," ",(0,a.kt)("inlineCode",{parentName:"p"},"info")," ",(0,a.kt)("inlineCode",{parentName:"p"},"debug")," ",(0,a.kt)("inlineCode",{parentName:"p"},"trace"),"."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"info"))),(0,a.kt)("h2",{id:"event"},"Event"),(0,a.kt)("h3",{id:"event_ack"},(0,a.kt)("inlineCode",{parentName:"h3"},"EVENT_ACK")),(0,a.kt)("p",null,"Based on this parameter the server decides when to send the acknowledgement to the client. Supported values are ",(0,a.kt)("inlineCode",{parentName:"p"},"0")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"1"),"."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type ",(0,a.kt)("inlineCode",{parentName:"li"},"Optional")),(0,a.kt)("li",{parentName:"ul"},"Default value: ",(0,a.kt)("inlineCode",{parentName:"li"},"0"))))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/58175526.7fd1ba94.js b/assets/js/58175526.7fd1ba94.js new file mode 100644 index 00000000..1ee37914 --- /dev/null +++ b/assets/js/58175526.7fd1ba94.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[718],{5680:(e,l,n)=>{n.d(l,{xA:()=>s,yg:()=>y});var i=n(6540);function a(e,l,n){return l in e?Object.defineProperty(e,l,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[l]=n,e}function t(e,l){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);l&&(i=i.filter((function(l){return Object.getOwnPropertyDescriptor(e,l).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var l=1;l<arguments.length;l++){var n=null!=arguments[l]?arguments[l]:{};l%2?t(Object(n),!0).forEach((function(l){a(e,l,n[l])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):t(Object(n)).forEach((function(l){Object.defineProperty(e,l,Object.getOwnPropertyDescriptor(n,l))}))}return e}function o(e,l){if(null==e)return{};var n,i,a=function(e,l){if(null==e)return{};var n,i,a={},t=Object.keys(e);for(i=0;i<t.length;i++)n=t[i],l.indexOf(n)>=0||(a[n]=e[n]);return a}(e,l);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(i=0;i<t.length;i++)n=t[i],l.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=i.createContext({}),p=function(e){var l=i.useContext(u),n=l;return e&&(n="function"==typeof e?e(l):r(r({},l),e)),n},s=function(e){var l=p(e.components);return i.createElement(u.Provider,{value:l},e.children)},_="mdxType",d={inlineCode:"code",wrapper:function(e){var l=e.children;return i.createElement(i.Fragment,{},l)}},g=i.forwardRef((function(e,l){var n=e.components,a=e.mdxType,t=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),_=p(n),g=a,y=_["".concat(u,".").concat(g)]||_[g]||d[g]||t;return n?i.createElement(y,r(r({ref:l},s),{},{components:n})):i.createElement(y,r({ref:l},s))}));function y(e,l){var n=arguments,a=l&&l.mdxType;if("string"==typeof e||a){var t=n.length,r=new Array(t);r[0]=g;var o={};for(var u in l)hasOwnProperty.call(l,u)&&(o[u]=l[u]);o.originalType=e,o[_]="string"==typeof e?e:a,r[1]=o;for(var p=2;p<t;p++)r[p]=n[p];return i.createElement.apply(null,r)}return i.createElement.apply(null,n)}g.displayName="MDXCreateElement"},5133:(e,l,n)=>{n.r(l),n.d(l,{assets:()=>u,contentTitle:()=>r,default:()=>d,frontMatter:()=>t,metadata:()=>o,toc:()=>p});var i=n(8168),a=(n(6540),n(5680));const t={toc_max_heading_level:4},r="Configurations",o={unversionedId:"reference/configurations",id:"reference/configurations",title:"Configurations",description:"This page contains reference for all the application configurations for Raccoon.",source:"@site/docs/reference/configurations.md",sourceDirName:"reference",slug:"/reference/configurations",permalink:"/raccoon/reference/configurations",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/reference/configurations.md",tags:[],version:"current",frontMatter:{toc_max_heading_level:4},sidebar:"docsSidebar",previous:{title:"Structure",permalink:"/raccoon/concepts/structure"},next:{title:"Metrics",permalink:"/raccoon/reference/metrics"}},u={},p=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Server",id:"server",level:2},{value:"<code>SERVER_WEBSOCKET_PORT</code>",id:"server_websocket_port",level:3},{value:"<code>SERVER_WEBSOCKET_MAX_CONN</code>",id:"server_websocket_max_conn",level:3},{value:"<code>SERVER_WEBSOCKET_READ_BUFFER_SIZE</code>",id:"server_websocket_read_buffer_size",level:3},{value:"<code>SERVER_WEBSOCKET_WRITE_BUFFER_SIZE</code>",id:"server_websocket_write_buffer_size",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_ID_HEADER</code>",id:"server_websocket_conn_id_header",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_GROUP_HEADER</code>",id:"server_websocket_conn_group_header",level:3},{value:"<code>SERVER_WEBSOCKET_CONN_GROUP_DEFAULT</code>",id:"server_websocket_conn_group_default",level:3},{value:"<code>SERVER_WEBSOCKET_PING_INTERVAL_MS</code>",id:"server_websocket_ping_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS</code>",id:"server_websocket_pong_wait_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS</code>",id:"server_websocket_write_wait_interval_ms",level:3},{value:"<code>SERVER_WEBSOCKET_PINGER_SIZE</code>",id:"server_websocket_pinger_size",level:3},{value:"<code>SERVER_WEBSOCKET_CHECK_ORIGIN</code>",id:"server_websocket_check_origin",level:3},{value:"<code>SERVER_CORS_ENABLED</code>",id:"server_cors_enabled",level:3},{value:"<code>SERVER_CORS_ALLOWED_ORIGIN</code>",id:"server_cors_allowed_origin",level:3},{value:"<code>SERVER_CORS_ALLOWED_METHODS</code>",id:"server_cors_allowed_methods",level:3},{value:"<code>SERVER_CORS_ALLOWED_HEADERS</code>",id:"server_cors_allowed_headers",level:3},{value:"<code>SERVER_CORS_ALLOW_CREDENTIALS</code>",id:"server_cors_allow_credentials",level:3},{value:"<code>SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS</code>",id:"server_cors_preflight_max_age_seconds",level:3},{value:"<code>SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED</code>",id:"server_batch_dedup_in_connection_enabled",level:3},{value:"Worker",id:"worker",level:2},{value:"<code>WORKER_BUFFER_CHANNEL_SIZE</code>",id:"worker_buffer_channel_size",level:3},{value:"<code>WORKER_BUFFER_FLUSH_TIMEOUT_MS</code>",id:"worker_buffer_flush_timeout_ms",level:3},{value:"<code>WORKER_POOL_SIZE</code>",id:"worker_pool_size",level:3},{value:"<code>WORKER_KAFKA_DELIVERY_CHANNEL_SIZE</code>",id:"worker_kafka_delivery_channel_size",level:3},{value:"Event Distribution",id:"event-distribution",level:2},{value:"<code>EVENT_DISTRIBUTION_PUBLISHER_PATTERN</code>",id:"event_distribution_publisher_pattern",level:3},{value:"Publishers",id:"publishers",level:2},{value:"Common",id:"common",level:3},{value:"<code>PUBLISHER_TYPE</code>",id:"publisher_type",level:4},{value:"Kafka",id:"kafka",level:3},{value:"<code>PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS</code>",id:"publisher_kafka_client_bootstrap_servers",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_ACKS</code>",id:"publisher_kafka_client_acks",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_RETRIES</code>",id:"publisher_kafka_client_retries",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS</code>",id:"publisher_kafka_client_retry_backoff_ms",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS</code>",id:"publisher_kafka_client_statistics_interval_ms",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES</code>",id:"publisher_kafka_client_queue_buffering_max_messages",level:4},{value:"<code>PUBLISHER_KAFKA_CLIENT_*</code>",id:"publisher_kafka_client_",level:4},{value:"<code>PUBLISHER_KAFKA_FLUSH_INTERVAL_MS</code>",id:"publisher_kafka_flush_interval_ms",level:4},{value:"PubSub",id:"pubsub",level:3},{value:"<code>PUBLISHER_PUBSUB_CREDENTIALS</code>",id:"publisher_pubsub_credentials",level:4},{value:"<code>PUBLISHER_PUBSUB_PROJECT_ID</code>",id:"publisher_pubsub_project_id",level:4},{value:"<code>PUBLISHER_PUBSUB_TOPIC_AUTOCREATE</code>",id:"publisher_pubsub_topic_autocreate",level:4},{value:"<code>PUBLISHER_PUBSUB_TOPIC_RETENTION_MS</code>",id:"publisher_pubsub_topic_retention_ms",level:4},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS</code>",id:"publisher_pubsub_publish_delay_threshold_ms",level:4},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD</code>",id:"publisher_pubsub_publish_count_threshold",level:4},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD</code>",id:"publisher_pubsub_publish_byte_threshold",level:4},{value:"<code>PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS</code>",id:"publisher_pubsub_publish_timeout_ms",level:4},{value:"Kinesis",id:"kinesis",level:3},{value:"<code>PUBLISHER_KINESIS_AWS_REGION</code>",id:"publisher_kinesis_aws_region",level:4},{value:"<code>PUBLISHER_KINESIS_CREDENTIALS</code>",id:"publisher_kinesis_credentials",level:4},{value:"<code>PUBLISHER_KINESIS_STREAM_AUTOCREATE</code>",id:"publisher_kinesis_stream_autocreate",level:4},{value:"<code>PUBLISHER_KINESIS_STREAM_MODE</code>",id:"publisher_kinesis_stream_mode",level:4},{value:"<code>PUBLISHER_KINESIS_STREAM_SHARDS</code>",id:"publisher_kinesis_stream_shards",level:4},{value:"<code>PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS</code>",id:"publisher_kinesis_stream_probe_interval_ms",level:4},{value:"<code>PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS</code>",id:"publisher_kinesis_publish_timeout_ms",level:4},{value:"Metric",id:"metric",level:2},{value:"<code>METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS</code>",id:"metric_runtime_stats_record_interval_ms",level:3},{value:"<code>METRIC_STATSD_ENABLED</code>",id:"metric_statsd_enabled",level:3},{value:"<code>METRIC_STATSD_ADDRESS</code>",id:"metric_statsd_address",level:3},{value:"<code>METRIC_STATSD_FLUSH_PERIOD_MS</code>",id:"metric_statsd_flush_period_ms",level:3},{value:"<code>METRIC_PROMETHEUS_ENABLED</code>",id:"metric_prometheus_enabled",level:3},{value:"<code>METRIC_PROMETHEUS_PATH</code>",id:"metric_prometheus_path",level:3},{value:"<code>METRIC_PROMETHEUS_PORT</code>",id:"metric_prometheus_port",level:3},{value:"Log",id:"log",level:2},{value:"<code>LOG_LEVEL</code>",id:"log_level",level:3},{value:"Event",id:"event",level:2},{value:"<code>EVENT_ACK</code>",id:"event_ack",level:3}],s={toc:p},_="wrapper";function d(e){let{components:l,...n}=e;return(0,a.yg)(_,(0,i.A)({},s,n,{components:l,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"configurations"},"Configurations"),(0,a.yg)("p",null,"This page contains reference for all the application configurations for Raccoon."),(0,a.yg)("h2",{id:"table-of-contents"},"Table of Contents"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#server"},"Server")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#worker"},"Worker")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#event-distribution"},"Event Distribution")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher"},"Publisher")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#metric"},"Metric")),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#log"},"Log"))),(0,a.yg)("h2",{id:"server"},"Server"),(0,a.yg)("h3",{id:"server_websocket_port"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PORT")),(0,a.yg)("p",null,"Port for the service to listen."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"8080"))),(0,a.yg)("h3",{id:"server_websocket_max_conn"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_MAX_CONN")),(0,a.yg)("p",null,"Maximum connection that can be handled by the server instance. You want to set it according to your resource utilization. You also need to check the ",(0,a.yg)("a",{parentName:"p",href:"https://docs.oracle.com/cd/E19623-01/820-6168/file-descriptor-requirements.html#:~:text=Linux%20systems%20limit%20the%20number,worker%20threads%20will%20be%20blocked."},"limit of open file descriptor allowed")," by the OS."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"30000"))),(0,a.yg)("h3",{id:"server_websocket_read_buffer_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_READ_BUFFER_SIZE")),(0,a.yg)("p",null,"Specify I/O buffer sizes in bytes: ",(0,a.yg)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers"},"Refer gorilla websocket API")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"10240"))),(0,a.yg)("h3",{id:"server_websocket_write_buffer_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_WRITE_BUFFER_SIZE")),(0,a.yg)("p",null,"Specify I/O buffer sizes in bytes: ",(0,a.yg)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers"},"Refer gorilla websocket API")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"10240"))),(0,a.yg)("h3",{id:"server_websocket_conn_id_header"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_ID_HEADER")),(0,a.yg)("p",null,"Unique identifier for the server to maintain the connection. A single uniq id can only connect once in a session. If, there is a subsequence connection with the same uniq id the connection will be rejected."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Example value: ",(0,a.yg)("inlineCode",{parentName:"li"},"X-User-ID")),(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Required"))),(0,a.yg)("h3",{id:"server_websocket_conn_group_header"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")),(0,a.yg)("p",null,"Additional identifier for the server to maintain the connection. Value of the conn group header combined with user id will act as unique identifier instead of only user id. You can use this if you want to differentiate between user groups or clients e.g(mobile, web). The group names is used as conn_group tag in some of the metrics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Example value: ",(0,a.yg)("inlineCode",{parentName:"li"},"X-User-Group")),(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional"))),(0,a.yg)("h3",{id:"server_websocket_conn_group_default"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CONN_GROUP_DEFAULT")),(0,a.yg)("p",null,"Default connection group name. The default is fallback when ",(0,a.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," is not set or when the value of group header is empty. In case the connection group default is clashing with your actual group name, override this config."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"--default--")),(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional"))),(0,a.yg)("h3",{id:"server_websocket_ping_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PING_INTERVAL_MS")),(0,a.yg)("p",null,"Interval of each ping to client. The interval is in seconds."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"30"))),(0,a.yg)("h3",{id:"server_websocket_pong_wait_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS")),(0,a.yg)("p",null,"Wait time for client to send Pong message back after server sends Ping. When the time exceeded the connection will be dropped."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"60"))),(0,a.yg)("h3",{id:"server_websocket_write_wait_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS")),(0,a.yg)("p",null,"Timeout Deadline set on the writes. On timeout the websocket state is corrupt and all future writes will return error: ",(0,a.yg)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetWriteDeadline"},"Refer gorilla websocket API")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"5"))),(0,a.yg)("h3",{id:"server_websocket_pinger_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_PINGER_SIZE")),(0,a.yg)("p",null,"Number of goroutine spawn to Ping clients."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"1"))),(0,a.yg)("h3",{id:"server_websocket_check_origin"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_WEBSOCKET_CHECK_ORIGIN")),(0,a.yg)("p",null,"Toggle CORS check function. Set ",(0,a.yg)("inlineCode",{parentName:"p"},"true")," to check each request origin. Set ",(0,a.yg)("inlineCode",{parentName:"p"},"false")," to disable check origin and allow every request. Check origin function check against ",(0,a.yg)("inlineCode",{parentName:"p"},"Origin")," header."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type: ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"true"))),(0,a.yg)("h3",{id:"server_cors_enabled"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_ENABLED")),(0,a.yg)("p",null,"The config decides whether to enable the cors middleware and thus allow CORS requests. This config only enables CORS for rest services. For websocket, refer ",(0,a.yg)("inlineCode",{parentName:"p"},"SERVER_WEBSOCKET_CHECK_ORIGIN")),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h3",{id:"server_cors_allowed_origin"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_ORIGIN")),(0,a.yg)("p",null,"The server decides which origin to allow. The configuration is expected to space separated. Multiple values are supported. The value requires ",(0,a.yg)("inlineCode",{parentName:"p"},"SERVER_CORS_ENABLED")," to be true to take effect. If you want to allow all host headers. You can pass ",(0,a.yg)("inlineCode",{parentName:"p"},"*")," as the value."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value ``")),(0,a.yg)("h3",{id:"server_cors_allowed_methods"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_METHODS")),(0,a.yg)("p",null,"The http methods allowed when it's a cross origin request. The http methods are expected to be space separated. "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value ",(0,a.yg)("inlineCode",{parentName:"li"},"GET HEAD POST OPTIONS"))),(0,a.yg)("h3",{id:"server_cors_allowed_headers"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOWED_HEADERS")),(0,a.yg)("p",null,"The http request headers which are allowed when request is cross origin. The input expects to add any additional headers which is going to be sent by the client ex: ",(0,a.yg)("inlineCode",{parentName:"p"},"Authorization"),". Headers which are essential for the functioning of Raccoon like Content-Type, Connection-Id & Group headers are added by default and need not be passed as configuration."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value ``")),(0,a.yg)("h3",{id:"server_cors_allow_credentials"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_ALLOW_CREDENTIALS")),(0,a.yg)("p",null,"AllowCredentials can be used to specify that the user agent may pass authentication details along with the request. "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h3",{id:"server_cors_preflight_max_age_seconds"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS")),(0,a.yg)("p",null,"Replies with a header for clients on how long to cache the response of the preflight request. It's not enforceable. The max value is 600s"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value ",(0,a.yg)("inlineCode",{parentName:"li"},"0"))),(0,a.yg)("h3",{id:"server_batch_dedup_in_connection_enabled"},(0,a.yg)("inlineCode",{parentName:"h3"},"SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED")),(0,a.yg)("p",null,"The server decides whether or not to handle duplicate batches for the active connection. If a batch is sent with a duplicate ReqGUID, the server uses best attempts to discard the duplicate batches. Set ",(0,a.yg)("inlineCode",{parentName:"p"},"true")," to enable the setting."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h2",{id:"worker"},"Worker"),(0,a.yg)("h3",{id:"worker_buffer_channel_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"WORKER_BUFFER_CHANNEL_SIZE")),(0,a.yg)("p",null,"Maximum batch that service can handle when workers are busy. When the number of batch is exceeded, the worker will back-pressure causing websocket to stop reading new request."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"100"))),(0,a.yg)("h3",{id:"worker_buffer_flush_timeout_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"WORKER_BUFFER_FLUSH_TIMEOUT_MS")),(0,a.yg)("p",null,"Upon shutdown, the worker try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the worker is forcefully closed."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"5000"))),(0,a.yg)("h3",{id:"worker_pool_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"WORKER_POOL_SIZE")),(0,a.yg)("p",null,"No of workers that processes the events concurrently."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"5"))),(0,a.yg)("h3",{id:"worker_kafka_delivery_channel_size"},(0,a.yg)("inlineCode",{parentName:"h3"},"WORKER_KAFKA_DELIVERY_CHANNEL_SIZE")),(0,a.yg)("p",null,"Delivery channel is implementation detail where the kafka client asks for channel in the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go/blob/master/examples/producer_example/producer_example.go#L51"},"produce API"),". The publisher uses the channel to wait for the events to be delivered. The channel contains the status delivery of the events. Normally you won't need to touch this."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"10"))),(0,a.yg)("h2",{id:"event-distribution"},"Event Distribution"),(0,a.yg)("h3",{id:"event_distribution_publisher_pattern"},(0,a.yg)("inlineCode",{parentName:"h3"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")),(0,a.yg)("p",null,"Routes events based on given pattern and ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/Event.proto#L31"},"type"),". The pattern is following ",(0,a.yg)("a",{parentName:"p",href:"https://golang.org/pkg/fmt/"},"go string format")," with event ",(0,a.yg)("inlineCode",{parentName:"p"},"type")," as second argument. The result of the string format will be the kafka topic target of the event."),(0,a.yg)("p",null,"For example, you pass ",(0,a.yg)("inlineCode",{parentName:"p"},"%s-event")," as ",(0,a.yg)("inlineCode",{parentName:"p"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN"),". If you send event with ",(0,a.yg)("inlineCode",{parentName:"p"},"click")," type, your event will be forwarded to ",(0,a.yg)("inlineCode",{parentName:"p"},"click-event")," kafka topic on the configured broker. If you send event with ",(0,a.yg)("inlineCode",{parentName:"p"},"buy")," type, your event will be forwarded to ",(0,a.yg)("inlineCode",{parentName:"p"},"buy-event"),"."),(0,a.yg)("p",null,"You can also route the events to single topic irrespective of the type. To do that you can drop ",(0,a.yg)("inlineCode",{parentName:"p"},"%s")," in the value. For example, provided ",(0,a.yg)("inlineCode",{parentName:"p"},"mobile-events")," as value. All incoming events will be routed to ",(0,a.yg)("inlineCode",{parentName:"p"},"mobile-events")," kafka topic."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Required")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"clickstream-%s-log"))),(0,a.yg)("h2",{id:"publishers"},"Publishers"),(0,a.yg)("h3",{id:"common"},"Common"),(0,a.yg)("h4",{id:"publisher_type"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_TYPE")),(0,a.yg)("p",null,"The publisher to use for transmitting events."),(0,a.yg)("p",null,"Publisher specific configuration follows the pattern ",(0,a.yg)("inlineCode",{parentName:"p"},"PUBLISHER_${TYPE}_*")," where ",(0,a.yg)("inlineCode",{parentName:"p"},"${TYPE}")," is the publisher type in upper case."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"kafka")),(0,a.yg)("li",{parentName:"ul"},"Possible values: ",(0,a.yg)("inlineCode",{parentName:"li"},"kafka"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"pubsub"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"kinesis"))),(0,a.yg)("h3",{id:"kafka"},"Kafka"),(0,a.yg)("h4",{id:"publisher_kafka_client_bootstrap_servers"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS")),(0,a.yg)("p",null,"Kafka brokers IP address where the events are published."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Example value: localhost:9092"),(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Required"))),(0,a.yg)("h4",{id:"publisher_kafka_client_acks"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_ACKS")),(0,a.yg)("p",null,"Number of replica acknowledgement before it send ack back to service."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"-1"))),(0,a.yg)("h4",{id:"publisher_kafka_client_retries"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_RETRIES")),(0,a.yg)("p",null,"Number of retries in case of failure."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"2147483647"))),(0,a.yg)("h4",{id:"publisher_kafka_client_retry_backoff_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS")),(0,a.yg)("p",null,"Backoff time on retry."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"100"))),(0,a.yg)("h4",{id:"publisher_kafka_client_statistics_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS")),(0,a.yg)("p",null,"librdkafka statistics emit interval. The application also needs to register a stats callback using rd_kafka_conf_set_stats_cb","(",")",". The granularity is 1000ms. A value of 0 disables statistics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"0"))),(0,a.yg)("h4",{id:"publisher_kafka_client_queue_buffering_max_messages"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES")),(0,a.yg)("p",null,"Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"100000"))),(0,a.yg)("h4",{id:"publisher_kafka_client_"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_CLIENT_*")),(0,a.yg)("p",null,"Kafka client config is dynamically configured. You can see other configurations ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"here"),"."),(0,a.yg)("p",null,"The configs are mapped to librdkafka configs by removing the ",(0,a.yg)("inlineCode",{parentName:"p"},"PUBLISHER_KAFKA_CLIENT_")," prefix and replacing underscore with a period."),(0,a.yg)("p",null,"Internally, this is how it looks"),(0,a.yg)("pre",null,(0,a.yg)("code",{parentName:"pre",className:"language-go",metastring:'title="config/publisher.go"',title:'"config/publisher.go"'},'var dynamicKafkaClientConfigPrefix = "PUBLISHER_KAFKA_CLIENT_"\n\ntype publisherKafka struct { /* ... */ }\n\nfunc (k publisherKafka) ToKafkaConfigMap() *confluent.ConfigMap {\n configMap := &confluent.ConfigMap{}\n for key, value := range viper.AllSettings() {\n if strings.HasPrefix(strings.ToUpper(key), dynamicKafkaClientConfigPrefix) {\n clientConfig := key[len(dynamicKafkaClientConfigPrefix):]\n configMap.SetKey(strings.Join(strings.Split(clientConfig, "_"), "."), value)\n }\n }\n return configMap\n}\n')),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: see the ",(0,a.yg)("a",{parentName:"li",href:"https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md"},"reference"))),(0,a.yg)("h4",{id:"publisher_kafka_flush_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KAFKA_FLUSH_INTERVAL_MS")),(0,a.yg)("p",null,"Upon shutdown, the publisher will try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the publisher is forcefully closed."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"1000"))),(0,a.yg)("h3",{id:"pubsub"},"PubSub"),(0,a.yg)("h4",{id:"publisher_pubsub_credentials"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_CREDENTIALS")),(0,a.yg)("p",null,"Path to the file containing service account credentials. Defaults to the value of ",(0,a.yg)("inlineCode",{parentName:"p"},"GOOGLE_APPLICATION_CREDENTIALS")," environment variable. This is used to authenticate with Google Cloud Platform."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Required")," (if ",(0,a.yg)("inlineCode",{parentName:"li"},"PUBLISHER_TYPE=pubsub"),", otherwise ignored)")),(0,a.yg)("h4",{id:"publisher_pubsub_project_id"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_PROJECT_ID")),(0,a.yg)("p",null,"Destination Google Cloud Project ID. Messages will be transmitted to the PubSub topics under this project."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Required")," (if ",(0,a.yg)("inlineCode",{parentName:"li"},"PUBLISHER_TYPE=pubsub"),", otherwise ignored)")),(0,a.yg)("h4",{id:"publisher_pubsub_topic_autocreate"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_TOPIC_AUTOCREATE")),(0,a.yg)("p",null,"Whether Raccoon should create a topic if it doesn't exist."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h4",{id:"publisher_pubsub_topic_retention_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_TOPIC_RETENTION_MS")),(0,a.yg)("p",null,"How long PubSub should retain messages in a topic (in milliseconds). Valid values must be between 10 minutes and 31 days."),(0,a.yg)("p",null,"see ",(0,a.yg)("a",{parentName:"p",href:"https://cloud.google.com/pubsub/docs/create-topic"},"pubsub docs")," for more information."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"0"))),(0,a.yg)("h4",{id:"publisher_pubsub_publish_delay_threshold_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS")),(0,a.yg)("p",null,"Maximum time to wait for before publishing a batch of messages."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"10"))),(0,a.yg)("h4",{id:"publisher_pubsub_publish_count_threshold"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD")),(0,a.yg)("p",null,"Maximum number of message to accumulate before transmission."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"100"))),(0,a.yg)("h4",{id:"publisher_pubsub_publish_byte_threshold"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD")),(0,a.yg)("p",null,"Maximum buffer size (in bytes)"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"1000000")," (~1MB)")),(0,a.yg)("h4",{id:"publisher_pubsub_publish_timeout_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS")),(0,a.yg)("p",null,"How long to wait before aborting a publish operation."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"60000")," (1 Minute)")),(0,a.yg)("h3",{id:"kinesis"},"Kinesis"),(0,a.yg)("h4",{id:"publisher_kinesis_aws_region"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_AWS_REGION")),(0,a.yg)("p",null,"AWS Region of the target kinesis stream. The value of ",(0,a.yg)("inlineCode",{parentName:"p"},"AWS_REGION")," is used as fallback if this variable is not set."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Required"))),(0,a.yg)("h4",{id:"publisher_kinesis_credentials"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_CREDENTIALS")),(0,a.yg)("p",null,"Path to ",(0,a.yg)("a",{parentName:"p",href:"https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html"},"AWS Credentials file"),". "),(0,a.yg)("p",null,"You can also specify the credentials using ",(0,a.yg)("inlineCode",{parentName:"p"},"AWS_ACCESS_KEY_ID")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"AWS_SECRET_ACCESS_KEY")," environment variables. "),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"$HOME/.aws/credentials"))),(0,a.yg)("h4",{id:"publisher_kinesis_stream_autocreate"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_STREAM_AUTOCREATE")),(0,a.yg)("p",null,"Whether Raccoon should create a stream if it doesn't exist."),(0,a.yg)("p",null,"NOTE: We recommend that you create all streams that you need to publish to ahead of time."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h4",{id:"publisher_kinesis_stream_mode"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_STREAM_MODE")),(0,a.yg)("p",null,"This configuration variable controls the ",(0,a.yg)("inlineCode",{parentName:"p"},"StreamMode")," of the\nstreams created by Raccoon."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"ON_DEMAND")),(0,a.yg)("li",{parentName:"ul"},"Possible values: ",(0,a.yg)("inlineCode",{parentName:"li"},"ON_DEMAND"),", ",(0,a.yg)("inlineCode",{parentName:"li"},"PROVISIONED"))),(0,a.yg)("h4",{id:"publisher_kinesis_stream_shards"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_STREAM_SHARDS")),(0,a.yg)("p",null,"This controls the number of shards configured for a stream created by Raccoon."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"4"))),(0,a.yg)("h4",{id:"publisher_kinesis_stream_probe_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS")),(0,a.yg)("p",null,"This specifies the time delay between stream status checks."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"1000"))),(0,a.yg)("h4",{id:"publisher_kinesis_publish_timeout_ms"},(0,a.yg)("inlineCode",{parentName:"h4"},"PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS")),(0,a.yg)("p",null,"How long to wait for before aborting a publish operation."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value ",(0,a.yg)("inlineCode",{parentName:"li"},"60000"))),(0,a.yg)("h2",{id:"metric"},"Metric"),(0,a.yg)("h3",{id:"metric_runtime_stats_record_interval_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS")),(0,a.yg)("p",null,"The time interval between recording runtime stats of the application in the instrumentation. It's recommended to keep this value equivalent to flush interval when using statsd and your collector's scrape interval when using prometheus as your instrumentation."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default Value: ",(0,a.yg)("inlineCode",{parentName:"li"},"10000"))),(0,a.yg)("h3",{id:"metric_statsd_enabled"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_STATSD_ENABLED")),(0,a.yg)("p",null,"Flag to enable export of statsd metric"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h3",{id:"metric_statsd_address"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_STATSD_ADDRESS")),(0,a.yg)("p",null,"Address to reports the service metrics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},":8125"))),(0,a.yg)("h3",{id:"metric_statsd_flush_period_ms"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_STATSD_FLUSH_PERIOD_MS")),(0,a.yg)("p",null,"Interval for the service to push metrics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"10000"))),(0,a.yg)("h3",{id:"metric_prometheus_enabled"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_ENABLED")),(0,a.yg)("p",null,"Flag to enable a prometheus http server to expose metrics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"false"))),(0,a.yg)("h3",{id:"metric_prometheus_path"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_PATH")),(0,a.yg)("p",null,"The path at which prometheus server should serve metrics."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"/metrics"))),(0,a.yg)("h3",{id:"metric_prometheus_port"},(0,a.yg)("inlineCode",{parentName:"h3"},"METRIC_PROMETHEUS_PORT")),(0,a.yg)("p",null,"The port number on which prometheus server will be listening for metric scraping requests."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"9090"))),(0,a.yg)("h2",{id:"log"},"Log"),(0,a.yg)("h3",{id:"log_level"},(0,a.yg)("inlineCode",{parentName:"h3"},"LOG_LEVEL")),(0,a.yg)("p",null,"Level available are ",(0,a.yg)("inlineCode",{parentName:"p"},"info")," ",(0,a.yg)("inlineCode",{parentName:"p"},"panic")," ",(0,a.yg)("inlineCode",{parentName:"p"},"fatal")," ",(0,a.yg)("inlineCode",{parentName:"p"},"error")," ",(0,a.yg)("inlineCode",{parentName:"p"},"warn")," ",(0,a.yg)("inlineCode",{parentName:"p"},"info")," ",(0,a.yg)("inlineCode",{parentName:"p"},"debug")," ",(0,a.yg)("inlineCode",{parentName:"p"},"trace"),"."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"info"))),(0,a.yg)("h2",{id:"event"},"Event"),(0,a.yg)("h3",{id:"event_ack"},(0,a.yg)("inlineCode",{parentName:"h3"},"EVENT_ACK")),(0,a.yg)("p",null,"Based on this parameter the server decides when to send the acknowledgement to the client. Supported values are ",(0,a.yg)("inlineCode",{parentName:"p"},"0")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"1"),"."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Type ",(0,a.yg)("inlineCode",{parentName:"li"},"Optional")),(0,a.yg)("li",{parentName:"ul"},"Default value: ",(0,a.yg)("inlineCode",{parentName:"li"},"0"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/774.5bdaf5ba.js b/assets/js/774.5bdaf5ba.js new file mode 100644 index 00000000..c3c7bb15 --- /dev/null +++ b/assets/js/774.5bdaf5ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[774],{1774:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(6540),o=n(1312),l=n(1003),r=n(5173);function c(){return a.createElement(a.Fragment,null,a.createElement(l.be,{title:(0,o.T)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.A,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/assets/js/7de6ea50.0ccc31f4.js b/assets/js/7de6ea50.0ccc31f4.js new file mode 100644 index 00000000..c9dd2bc7 --- /dev/null +++ b/assets/js/7de6ea50.0ccc31f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[226],{5680:(e,t,a)=>{a.d(t,{xA:()=>u,yg:()=>g});var n=a(6540);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function l(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var i=n.createContext({}),c=function(e){var t=n.useContext(i),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(a),d=r,g=p["".concat(i,".").concat(d)]||p[d]||m[d]||o;return a?n.createElement(g,s(s({ref:t},u),{},{components:a})):n.createElement(g,s({ref:t},u))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,s=new Array(o);s[0]=d;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[p]="string"==typeof e?e:r,s[1]=l;for(var c=2;c<o;c++)s[c]=a[c];return n.createElement.apply(null,s)}return n.createElement.apply(null,a)}d.displayName="MDXCreateElement"},9365:(e,t,a)=>{a.d(t,{A:()=>s});var n=a(6540),r=a(53);const o={tabItem:"tabItem_Ymn6"};function s(e){let{children:t,hidden:a,className:s}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.A)(o.tabItem,s),hidden:a},t)}},4865:(e,t,a)=>{a.d(t,{A:()=>m});var n=a(8168),r=a(6540),o=a(53),s=a(2303),l=a(1682),i=a(4595),c=a(3104);const u={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function p(e){var t;const{lazy:a,block:s,defaultValue:p,values:m,groupId:d,className:g}=e,h=r.Children.map(e.children,(e=>{if((0,r.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})),f=m??h.map((e=>{let{props:{value:t,label:a,attributes:n}}=e;return{value:t,label:a,attributes:n}})),y=(0,l.X)(f,((e,t)=>e.value===t.value));if(y.length>0)throw new Error(`Docusaurus error: Duplicate values "${y.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`);const b=null===p?p:p??(null==(t=h.find((e=>e.props.default)))?void 0:t.props.value)??h[0].props.value;if(null!==b&&!f.some((e=>e.value===b)))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${b}" but none of its children has the corresponding value. Available values are: ${f.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);const{tabGroupChoices:v,setTabGroupChoices:_}=(0,i.x)(),[w,N]=(0,r.useState)(b),T=[],{blockElementScrollPositionUntilNextRender:x}=(0,c.a_)();if(null!=d){const e=v[d];null!=e&&e!==w&&f.some((t=>t.value===e))&&N(e)}const E=e=>{const t=e.currentTarget,a=T.indexOf(t),n=f[a].value;n!==w&&(x(t),N(n),null!=d&&_(d,String(n)))},k=e=>{var t;let a=null;switch(e.key){case"ArrowRight":{const t=T.indexOf(e.currentTarget)+1;a=T[t]??T[0];break}case"ArrowLeft":{const t=T.indexOf(e.currentTarget)-1;a=T[t]??T[T.length-1];break}}null==(t=a)||t.focus()};return r.createElement("div",{className:(0,o.A)("tabs-container",u.tabList)},r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":s},g)},f.map((e=>{let{value:t,label:a,attributes:s}=e;return r.createElement("li",(0,n.A)({role:"tab",tabIndex:w===t?0:-1,"aria-selected":w===t,key:t,ref:e=>T.push(e),onKeyDown:k,onFocus:E,onClick:E},s,{className:(0,o.A)("tabs__item",u.tabItem,null==s?void 0:s.className,{"tabs__item--active":w===t})}),a??t)}))),a?(0,r.cloneElement)(h.filter((e=>e.props.value===w))[0],{className:"margin-top--md"}):r.createElement("div",{className:"margin-top--md"},h.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==w})))))}function m(e){const t=(0,s.A)();return r.createElement(p,(0,n.A)({key:String(t)},e))}},9358:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>g,frontMatter:()=>l,metadata:()=>c,toc:()=>p});var n=a(8168),r=(a(6540),a(5680)),o=a(4865),s=a(9365);const l={},i="Monitoring",c={unversionedId:"guides/monitoring",id:"guides/monitoring",title:"Monitoring",description:"Raccoon provides monitoring for server connection, publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd and Prometheus",source:"@site/docs/guides/monitoring.md",sourceDirName:"guides",slug:"/guides/monitoring",permalink:"/raccoon/guides/monitoring",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/monitoring.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Deployment",permalink:"/raccoon/guides/deployment"},next:{title:"Troubleshooting",permalink:"/raccoon/guides/troubleshooting"}},u={},p=[{value:"How To Setup",id:"how-to-setup",level:2},{value:"Metrics Usages",id:"metrics-usages",level:2},{value:"Data Loss",id:"data-loss",level:3},{value:"Latency",id:"latency",level:3}],m={toc:p},d="wrapper";function g(e){let{components:t,...a}=e;return(0,r.yg)(d,(0,n.A)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"monitoring"},"Monitoring"),(0,r.yg)("p",null,"Raccoon provides monitoring for server connection, publisher, resource usage, and event delivery. Reference for available metrics is available ",(0,r.yg)("a",{parentName:"p",href:"/raccoon/reference/metrics"},"here"),". The metrics are reported using ",(0,r.yg)("a",{parentName:"p",href:"https://www.datadoghq.com/blog/statsd/"},"Statsd")," and ",(0,r.yg)("a",{parentName:"p",href:"https://prometheus.io/"},"Prometheus")),(0,r.yg)("h2",{id:"how-to-setup"},"How To Setup"),(0,r.yg)(o.A,{mdxType:"Tabs"},(0,r.yg)(s.A,{value:"statsd",mdxType:"TabItem"},(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"TL;DR\n- Run Statsd supported metric collector\n- Configure `METRIC_STATSD_ADDRESS` on Raccoon to send to the metric collector\n- Visualize and create alerting from the collected metrics\n")),(0,r.yg)("p",null,"Generally, you can follow the steps above and use any metric collector that supports statsd like ",(0,r.yg)("a",{parentName:"p",href:"https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/"},"Telegraf")," or ",(0,r.yg)("a",{parentName:"p",href:"https://docs.datadoghq.com/developers/dogstatsd/?tab=hostagent"},"Datadog"),"."),(0,r.yg)("p",null,"This section will cover a setup example using ",(0,r.yg)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/telegraf/"},"Telegraf"),", ",(0,r.yg)("a",{parentName:"p",href:"https://www.influxdata.com/"},"Influx"),", ",(0,r.yg)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/kapacitor/"},"Kapacitor"),", and ",(0,r.yg)("a",{parentName:"p",href:"https://grafana.com/"},"Grafana")," stack based on the steps above."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Run Statsd Supported Metric Collector")," To enable statsd on Telegraf you need to enable statsd input on ",(0,r.yg)("inlineCode",{parentName:"p"},"telegraf.conf")," file. Following are default configurations that you can add based on statsd input ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/influxdata/telegraf/blob/master/plugins/inputs/statsd/README.md"},"readme"),"."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-toml"},'[[inputs.statsd]]\n protocol = "udp"\n max_tcp_connections = 250\n tcp_keep_alive = false\n service_address = ":8125"\n\n delete_gauges = true\n delete_counters = true\n delete_sets = true\n delete_timings = true\n\n percentiles = [50.0, 90.0, 99.0, 99.9, 99.95, 100.0]\n\n metric_separator = "_"\n\n parse_data_dog_tags = false\n datadog_extensions = false\n datadog_distributions = false\n\n allowed_pending_messages = 10000\n percentile_limit = 1000\n\n[[outputs.influxdb]]\n urls = ["http://127.0.0.1:8086"]\n database = "raccoon"\n retention_policy = "autogen"\n write_consistency = "any"\n timeout = "5s"\n')),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Configure Raccoon To Send To The Metric Collector")," After you have the collector with the port configured, you need to set ",(0,r.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#metric_statsd_address"},"METRIC_STATSD_ADDRESS")," to match the metric collector address. Suppose you deploy the telegraf using the default configuration above as sidecar or in localhost, you need to set the value to ",(0,r.yg)("inlineCode",{parentName:"p"},":8125"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Visualize And Create Alerting From The Collected Metrics")," Now that you have Raccoon and Telegraf as metric collector set, next is to use the metrics reported. You may notice that the Telegraf config above contains ",(0,r.yg)("inlineCode",{parentName:"p"},"outputs.influxdb"),". That config will send the metric received to Influxdb. Make sure you have influx service accessible from the configured URL. You can visualize the metrics using Grafana. To do that, you need to ",(0,r.yg)("a",{parentName:"p",href:"https://www.influxdata.com/blog/how-grafana-dashboard-influxdb-flux-influxql/"},"add influx datasource")," to make the data available on Grafana. After that, you can use the data to You can ",(0,r.yg)("a",{parentName:"p",href:"https://grafana.com/docs/grafana/latest/datasources/influxdb/#influxql-query-editor"},"visualize the metrics")," using Grafana. ")),(0,r.yg)(s.A,{value:"prometheus",mdxType:"TabItem"},(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-text"},"TL;DR\n- Run Prometheus\n- Configure `METRIC_PROMETHEUS_PORT` and `METRIC_PROMETHEUS_ENABLED` on Raccoon\n- Visualize and create alerting from the collected metrics\n")),(0,r.yg)("p",null,"Setting up ",(0,r.yg)("a",{parentName:"p",href:"https://prometheus.io"},"Prometheus")," is fairly straight-forward. Prometheus is available as a self-contained binary program for most platforms.\nFor alerting you can use ",(0,r.yg)("a",{parentName:"p",href:"https://prometheus.io/docs/alerting/latest/alertmanager/"},"alertmanager")," that let's you define alerts and offers integration with different notification platforms. For visualisation ",(0,r.yg)("a",{parentName:"p",href:"https://grafana.com/"},"Grafana")," comes with out-of-the-box support for prometheus as a data source."),(0,r.yg)("p",null,"You can download prometheus from their ",(0,r.yg)("a",{parentName:"p",href:"https://prometheus.io/download/"},"official website"),"."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Run Prometheus")),(0,r.yg)("p",null,"Let's explore an example setup that runs prometheus locally. Begin by creating a new directory and downloading prometheus."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"$ mkdir prometheus-for-raccoon\n$ cd prometheus-for-raccoon\n$ wget https://github.com/prometheus/prometheus/releases/download/v2.53.1/prometheus-2.53.1.linux-amd64.tar.gz\n$ tar xzvf prometheus-2.53.1.linux-amd64.tar.gz\n$ cd prometheus-2.53.1.linux-amd64\n")),(0,r.yg)("p",null,"Next, we will edit ",(0,r.yg)("inlineCode",{parentName:"p"},"prometheus.yml")," to tell prometheus to scrape metrics from raccoon. You can use any text editor that you're familiar with."),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-yaml",metastring:"title=prometheus.yml",title:"prometheus.yml"},'global:\n scrape_interval: 15s \n evaluation_interval: 15s \n\nscrape_configs:\n - job_name: "raccoon"\n static_configs:\n - targets: ["localhost:8888"]\n\n')),(0,r.yg)("p",null,"Now run prometheus "),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"$ ./prometheus --config.file=./prometheus.yml\n")),(0,r.yg)("p",null,"We have now configured prometheus to scrape metrics from ",(0,r.yg)("inlineCode",{parentName:"p"},"localhost:8888"),". We will now tell raccoon to expose prometheus metric on this port."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Configure ",(0,r.yg)("inlineCode",{parentName:"strong"},"METRIC_PROMETHEUS_PORT")," and ",(0,r.yg)("inlineCode",{parentName:"strong"},"METRIC_PROMETHEUS_ENABLED")," on Raccoon")),(0,r.yg)("p",null,"By default, raccoon doesn't expose prometheus metrics. To enable prometheus metrics, you need to set the following environment variables:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-bash"},"METRIC_PROMETHEUS_ENABLED=true\nMETRIC_PROMETHEUS_PORT=8888 \n")),(0,r.yg)("p",null,"Now when you run raccoon, prometheus will start collecting metrics from it."),(0,r.yg)("p",null,(0,r.yg)("strong",{parentName:"p"},"Visualize And Create Alerting From The Collected Metrics")," "),(0,r.yg)("p",null,"Now that you have Raccoon and Prometheus setup, next is to use the metrics reported. You can visualize the metrics using Grafana. To do that, you need to ",(0,r.yg)("a",{parentName:"p",href:"https://grafana.com/docs/grafana/latest/datasources/prometheus/"},"add prometheus datasource")," to make the data available on Grafana. After that, you can use the data to visualize the metrics using Grafana. "))),(0,r.yg)("h2",{id:"metrics-usages"},"Metrics Usages"),(0,r.yg)("p",null,"Following are key monitoring statistics that you can infer from Raccoon metrics. Refer to this section to understand how to build alerting, dashboard, or analyze the metrics."),(0,r.yg)("h3",{id:"data-loss"},"Data Loss"),(0,r.yg)("p",null,"To infer data loss, you can count ",(0,r.yg)("a",{parentName:"p",href:"/raccoon/reference/metrics#kafka_messages_delivered_total"},(0,r.yg)("inlineCode",{parentName:"a"},"kafka_messages_delivered_total"))," with tag ",(0,r.yg)("inlineCode",{parentName:"p"},"success=false"),". You can also infer the loss rate by calculating the following."),(0,r.yg)("p",null,(0,r.yg)("inlineCode",{parentName:"p"},"count(kafka_messages_delivered_total success=false)/count(kafka_messages_delivered_total)")),(0,r.yg)("p",null,"For other publishers, just replace ",(0,r.yg)("inlineCode",{parentName:"p"},"kafka")," in the metric name with the name of the publisher. For instance, analogs of ",(0,r.yg)("inlineCode",{parentName:"p"},"kafka_messages_delivered_total")," for PubSub and Kinesis would be:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#pubsub_messages_delivered_total"},(0,r.yg)("inlineCode",{parentName:"a"},"pubsub_messages_delivered_total"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#kinesis_messages_delivered_total"},(0,r.yg)("inlineCode",{parentName:"a"},"kinesis_messages_delivered_total")))),(0,r.yg)("h3",{id:"latency"},"Latency"),(0,r.yg)("p",null,"Raccoon provides fine-grained metrics that denote latency. That gives clues as to where to look in case something goes wrong. In summary, these are key metrics for latency:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#event_processing_duration_milliseconds"},(0,r.yg)("inlineCode",{parentName:"a"},"event_processing_duration_milliseconds"))," This metrics denotes overall latency. You need to look at other latency metrics to find the root cause when this metric is high."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#server_processing_latency_milliseconds"},(0,r.yg)("inlineCode",{parentName:"a"},"server_processing_latency_milliseconds"))," Correlate this metric with ",(0,r.yg)("inlineCode",{parentName:"li"},"event_processing_duration_milliseconds")," to infer whether the issue is with Raccoon itself, or something wrong with the network, or the way ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto#L47"},"sent_time")," is generated.-"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#worker_processing_duration_milliseconds"},(0,r.yg)("inlineCode",{parentName:"a"},"worker_processing_duration_milliseconds"))," High value of this metric indicates that the publisher is slow or can't keep up.")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7de6ea50.7dfb24c3.js b/assets/js/7de6ea50.7dfb24c3.js deleted file mode 100644 index 85f8daa7..00000000 --- a/assets/js/7de6ea50.7dfb24c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[510],{3905:function(e,t,a){a.d(t,{Zo:function(){return u},kt:function(){return f}});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function s(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(a),f=r,m=p["".concat(l,".").concat(f)]||p[f]||d[f]||o;return a?n.createElement(m,i(i({ref:t},u),{},{components:a})):n.createElement(m,i({ref:t},u))}));function f(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c<o;c++)i[c]=a[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}p.displayName="MDXCreateElement"},5025:function(e,t,a){a.r(t),a.d(t,{assets:function(){return u},contentTitle:function(){return l},default:function(){return f},frontMatter:function(){return s},metadata:function(){return c},toc:function(){return d}});var n=a(7462),r=a(3366),o=(a(7294),a(3905)),i=["components"],s={},l="Monitoring",c={unversionedId:"guides/monitoring",id:"guides/monitoring",title:"Monitoring",description:"Raccoon provides monitoring for server connection, Kafka publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd protocol.",source:"@site/docs/guides/monitoring.md",sourceDirName:"guides",slug:"/guides/monitoring",permalink:"/raccoon/guides/monitoring",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/monitoring.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Deployment",permalink:"/raccoon/guides/deployment"},next:{title:"Troubleshooting",permalink:"/raccoon/guides/troubleshooting"}},u={},d=[{value:"How To Setup",id:"how-to-setup",level:2},{value:"Metrics Usages",id:"metrics-usages",level:2},{value:"Data Loss",id:"data-loss",level:3},{value:"Latency",id:"latency",level:3}],p={toc:d};function f(e){var t=e.components,a=(0,r.Z)(e,i);return(0,o.kt)("wrapper",(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"monitoring"},"Monitoring"),(0,o.kt)("p",null,"Raccoon provides monitoring for server connection, Kafka publisher, resource usage, and event delivery. Reference for available metrics is available ",(0,o.kt)("a",{parentName:"p",href:"/raccoon/reference/metrics"},"here"),". The metrics are reported using ",(0,o.kt)("a",{parentName:"p",href:"https://www.datadoghq.com/blog/statsd/"},"Statsd")," protocol."),(0,o.kt)("h2",{id:"how-to-setup"},"How To Setup"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-text"},"TL;DR\n- Run Statsd supported metric collector\n- Configure `METRIC_STATSD_ADDRESS` on Raccoon to send to the metric collector\n- Visualize and create alerting from the collected metrics\n")),(0,o.kt)("p",null,"Generally, you can follow the steps above and use any metric collector that supports statsd like ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/blog/getting-started-with-sending-statsd-metrics-to-telegraf-influxdb/"},"Telegraf")," or ",(0,o.kt)("a",{parentName:"p",href:"https://docs.datadoghq.com/developers/dogstatsd/?tab=hostagent"},"Datadog"),"."),(0,o.kt)("p",null,"This section will cover a setup example using ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/telegraf/"},"Telegraf"),", ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/"},"Influx"),", ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/kapacitor/"},"Kapacitor"),", and ",(0,o.kt)("a",{parentName:"p",href:"https://grafana.com/"},"Grafana")," stack based on the steps above."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Run Statsd Supported Metric Collector")," To enable statsd on Telegraf you need to enable statsd input on ",(0,o.kt)("inlineCode",{parentName:"p"},"telegraf.conf")," file. Following are default configurations that you can add based on statsd input ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/influxdata/telegraf/blob/master/plugins/inputs/statsd/README.md"},"readme"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-text"},'[[inputs.statsd]]\n protocol = "udp"\n max_tcp_connections = 250\n tcp_keep_alive = false\n service_address = ":8125"\n\n delete_gauges = true\n delete_counters = true\n delete_sets = true\n delete_timings = true\n\n percentiles = [50.0, 90.0, 99.0, 99.9, 99.95, 100.0]\n\n metric_separator = "_"\n\n parse_data_dog_tags = false\n datadog_extensions = false\n datadog_distributions = false\n\n allowed_pending_messages = 10000\n percentile_limit = 1000\n\n[[outputs.influxdb]]\n urls = ["http://127.0.0.1:8086"]\n database = "raccoon"\n retention_policy = "autogen"\n write_consistency = "any"\n timeout = "5s"\n')),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Configure Raccoon To Send To The Metric Collector")," After you have the collector with the port configured, you need to set ",(0,o.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#metric_statsd_address"},"METRIC_STATSD_ADDRESS")," to match the metric collector address. Suppose you deploy the telegraf using the default configuration above as sidecar or in localhost, you need to set the value to ",(0,o.kt)("inlineCode",{parentName:"p"},":8125"),"."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Visualize And Create Alerting From The Collected Metrics")," Now that you have Raccoon and Telegraf as metric collector set, next is to use the metrics reported. You may notice that the Telegraf config above contains ",(0,o.kt)("inlineCode",{parentName:"p"},"outputs.influxdb"),". That config will send the metric received to Influxdb. Make sure you have influx service accessible from the configured URL. You can visualize the metrics using Grafana. To do that, you need to ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/blog/how-grafana-dashboard-influxdb-flux-influxql/"},"add influx datasource")," to make the data available on Grafana. After that, you can use the data to You can visualize the metrics using Grafana. To do that, you need to ",(0,o.kt)("a",{parentName:"p",href:"https://www.influxdata.com/blog/how-grafana-dashboard-influxdb-flux-influxql/"},"add influx datasource")," to make the data available on Grafana. After that, you can use the data to ",(0,o.kt)("a",{parentName:"p",href:"https://grafana.com/docs/grafana/latest/datasources/influxdb/#influxql-query-editor"},"make dashboard"),"."),(0,o.kt)("h2",{id:"metrics-usages"},"Metrics Usages"),(0,o.kt)("p",null,"Following are key monitoring statistics that you can infer from Raccoon metrics. Refer to this section to understand how to build alerting, dashboard, or analyze the metrics."),(0,o.kt)("h3",{id:"data-loss"},"Data Loss"),(0,o.kt)("p",null,"To infer data loss, you can count ",(0,o.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/metrics#kafka_messages_delivered_total"},(0,o.kt)("inlineCode",{parentName:"a"},"kafka_messages_delivered_total"))," with tag ",(0,o.kt)("inlineCode",{parentName:"p"},"success=false"),". You can also infer the loss rate by calculating the following."),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"count(kafka_messages_delivered_total success=false)/count(kafka_messages_delivered_total)")),(0,o.kt)("h3",{id:"latency"},"Latency"),(0,o.kt)("p",null,"Raccoon provides fine-grained metrics that denote latency. That gives clues as to where to look in case something goes wrong. In summary, these are key metrics for latency:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/metrics#event_processing_duration_milliseconds"},(0,o.kt)("inlineCode",{parentName:"a"},"event_processing_duration_milliseconds"))," This metrics denotes overall latency. You need to look at other latency metrics to find the root cause when this metric is high."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/metrics#server_processing_latency_milliseconds"},(0,o.kt)("inlineCode",{parentName:"a"},"server_processing_latency_milliseconds"))," Correlate this metric with ",(0,o.kt)("inlineCode",{parentName:"li"},"event_processing_duration_milliseconds")," to infer whether the issue is with Raccoon itself, or something wrong with the network, or the way ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto#L47"},"sent_time")," is generated.-"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://raystack.gitbook.io/raccoon/reference/metrics#worker_processing_duration_milliseconds"},(0,o.kt)("inlineCode",{parentName:"a"},"worker_processing_duration_milliseconds"))," High value of this metric indicates that the publisher is slow or can't keep up.")))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7ff2cdfe.11388b0e.js b/assets/js/7ff2cdfe.11388b0e.js new file mode 100644 index 00000000..654983a0 --- /dev/null +++ b/assets/js/7ff2cdfe.11388b0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[342],{5680:(e,t,n)=>{n.d(t,{xA:()=>s,yg:()=>d});var r=n(6540);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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),p=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=p(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,c=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=p(n),g=o,d=u["".concat(c,".").concat(g)]||u[g]||m[g]||i;return n?r.createElement(d,a(a({ref:t},s),{},{components:n})):r.createElement(d,a({ref:t},s))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,a[1]=l;for(var p=2;p<i;p++)a[p]=n[p];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},6757:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=n(8168),o=(n(6540),n(5680));const i={},a="Development Guide",l={unversionedId:"contribute/development",id:"contribute/development",title:"Development Guide",description:"This guide is targeted at developers looking to contribute to Raccoon.",source:"@site/docs/contribute/development.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/raccoon/contribute/development",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/contribute/development.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution Process",permalink:"/raccoon/contribute/contribution"},next:{title:"Release Process",permalink:"/raccoon/contribute/release"}},c={},p=[{value:"Making a Pull Request",id:"making-a-pull-request",level:2},{value:"Incorporating upstream changes from main",id:"incorporating-upstream-changes-from-main",level:3},{value:"Signing commits",id:"signing-commits",level:3},{value:"Good practices to keep in mind",id:"good-practices-to-keep-in-mind",level:3}],s={toc:p},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.yg)(u,(0,r.A)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"development-guide"},"Development Guide"),(0,o.yg)("p",null,"This guide is targeted at developers looking to contribute to Raccoon."),(0,o.yg)("h2",{id:"making-a-pull-request"},"Making a Pull Request"),(0,o.yg)("h3",{id:"incorporating-upstream-changes-from-main"},"Incorporating upstream changes from main"),(0,o.yg)("p",null,"Our preference is the use of ",(0,o.yg)("inlineCode",{parentName:"p"},"git rebase")," instead of ",(0,o.yg)("inlineCode",{parentName:"p"},"git merge")," : ",(0,o.yg)("inlineCode",{parentName:"p"},"git pull -r")),(0,o.yg)("h3",{id:"signing-commits"},"Signing commits"),(0,o.yg)("p",null,"Commits have to be signed before they are allowed to be merged into the codebase:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'# Include -s flag to sign off\ngit commit -s -m "My first commit"\n')),(0,o.yg)("h3",{id:"good-practices-to-keep-in-mind"},"Good practices to keep in mind"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Follow ",(0,o.yg)("a",{parentName:"li",href:"https://www.conventionalcommits.org/en/v1.0.0/#summary"},"conventional commits")," while composing our commit messages."),(0,o.yg)("li",{parentName:"ul"},"Add ",(0,o.yg)("inlineCode",{parentName:"li"},"WIP:")," to PR name if more work needs to be done prior to review"),(0,o.yg)("li",{parentName:"ul"},"Avoid ",(0,o.yg)("inlineCode",{parentName:"li"},"force-pushing")," as it makes reviewing difficult")),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Managing CI-test failures")),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"GitHub runner tests",(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Click ",(0,o.yg)("inlineCode",{parentName:"li"},"checks")," tab to analyse failed tests")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7ff2cdfe.60ecf897.js b/assets/js/7ff2cdfe.60ecf897.js deleted file mode 100644 index 34adedf2..00000000 --- a/assets/js/7ff2cdfe.60ecf897.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[641],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return d}});var r=n(7294);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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},s=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),m=u(n),d=o,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||i;return n?r.createElement(f,a(a({ref:t},s),{},{components:n})):r.createElement(f,a({ref:t},s))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var u=2;u<i;u++)a[u]=n[u];return r.createElement.apply(null,a)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5506:function(e,t,n){n.r(t),n.d(t,{assets:function(){return s},contentTitle:function(){return l},default:function(){return d},frontMatter:function(){return c},metadata:function(){return u},toc:function(){return p}});var r=n(7462),o=n(3366),i=(n(7294),n(3905)),a=["components"],c={},l="Development Guide",u={unversionedId:"contribute/development",id:"contribute/development",title:"Development Guide",description:"This guide is targeted at developers looking to contribute to Raccoon.",source:"@site/docs/contribute/development.md",sourceDirName:"contribute",slug:"/contribute/development",permalink:"/raccoon/contribute/development",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/contribute/development.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution Process",permalink:"/raccoon/contribute/contribution"},next:{title:"Release Process",permalink:"/raccoon/contribute/release"}},s={},p=[{value:"Making a Pull Request",id:"making-a-pull-request",level:2},{value:"Incorporating upstream changes from main",id:"incorporating-upstream-changes-from-main",level:3},{value:"Signing commits",id:"signing-commits",level:3},{value:"Good practices to keep in mind",id:"good-practices-to-keep-in-mind",level:3}],m={toc:p};function d(e){var t=e.components,n=(0,o.Z)(e,a);return(0,i.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"development-guide"},"Development Guide"),(0,i.kt)("p",null,"This guide is targeted at developers looking to contribute to Raccoon."),(0,i.kt)("h2",{id:"making-a-pull-request"},"Making a Pull Request"),(0,i.kt)("h3",{id:"incorporating-upstream-changes-from-main"},"Incorporating upstream changes from main"),(0,i.kt)("p",null,"Our preference is the use of ",(0,i.kt)("inlineCode",{parentName:"p"},"git rebase")," instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"git merge")," : ",(0,i.kt)("inlineCode",{parentName:"p"},"git pull -r")),(0,i.kt)("h3",{id:"signing-commits"},"Signing commits"),(0,i.kt)("p",null,"Commits have to be signed before they are allowed to be merged into the codebase:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'# Include -s flag to signoff\ngit commit -s -m "My first commit"\n')),(0,i.kt)("h3",{id:"good-practices-to-keep-in-mind"},"Good practices to keep in mind"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Follow ",(0,i.kt)("a",{parentName:"li",href:"https://www.conventionalcommits.org/en/v1.0.0/#summary"},"conventional commits")," while composing our commit messages."),(0,i.kt)("li",{parentName:"ul"},"Add ",(0,i.kt)("inlineCode",{parentName:"li"},"WIP:")," to PR name if more work needs to be done prior to review"),(0,i.kt)("li",{parentName:"ul"},"Avoid ",(0,i.kt)("inlineCode",{parentName:"li"},"force-pushing")," as it makes reviewing difficult")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Managing CI-test failures")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"GitHub runner tests",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Click ",(0,i.kt)("inlineCode",{parentName:"li"},"checks")," tab to analyse failed tests")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8070e160.6c0f6636.js b/assets/js/8070e160.6c0f6636.js new file mode 100644 index 00000000..065e7a57 --- /dev/null +++ b/assets/js/8070e160.6c0f6636.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[822],{9365:(e,n,a)=>{a.d(n,{A:()=>l});var t=a(6540),o=a(53);const r={tabItem:"tabItem_Ymn6"};function l(e){let{children:n,hidden:a,className:l}=e;return t.createElement("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,l),hidden:a},n)}},4865:(e,n,a)=>{a.d(n,{A:()=>g});var t=a(8168),o=a(6540),r=a(53),l=a(2303),i=a(1682),s=a(4595),c=a(3104);const p={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function u(e){var n;const{lazy:a,block:l,defaultValue:u,values:g,groupId:m,className:d}=e,y=o.Children.map(e.children,(e=>{if((0,o.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})),h=g??y.map((e=>{let{props:{value:n,label:a,attributes:t}}=e;return{value:n,label:a,attributes:t}})),v=(0,i.X)(h,((e,n)=>e.value===n.value));if(v.length>0)throw new Error(`Docusaurus error: Duplicate values "${v.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`);const E=null===u?u:u??(null==(n=y.find((e=>e.props.default)))?void 0:n.props.value)??y[0].props.value;if(null!==E&&!h.some((e=>e.value===E)))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${E}" but none of its children has the corresponding value. Available values are: ${h.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);const{tabGroupChoices:N,setTabGroupChoices:f}=(0,s.x)(),[b,k]=(0,o.useState)(E),T=[],{blockElementScrollPositionUntilNextRender:R}=(0,c.a_)();if(null!=m){const e=N[m];null!=e&&e!==b&&h.some((n=>n.value===e))&&k(e)}const C=e=>{const n=e.currentTarget,a=T.indexOf(n),t=h[a].value;t!==b&&(R(n),k(t),null!=m&&f(m,String(t)))},_=e=>{var n;let a=null;switch(e.key){case"ArrowRight":{const n=T.indexOf(e.currentTarget)+1;a=T[n]??T[0];break}case"ArrowLeft":{const n=T.indexOf(e.currentTarget)-1;a=T[n]??T[T.length-1];break}}null==(n=a)||n.focus()};return o.createElement("div",{className:(0,r.A)("tabs-container",p.tabList)},o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":l},d)},h.map((e=>{let{value:n,label:a,attributes:l}=e;return o.createElement("li",(0,t.A)({role:"tab",tabIndex:b===n?0:-1,"aria-selected":b===n,key:n,ref:e=>T.push(e),onKeyDown:_,onFocus:C,onClick:C},l,{className:(0,r.A)("tabs__item",p.tabItem,null==l?void 0:l.className,{"tabs__item--active":b===n})}),a??n)}))),a?(0,o.cloneElement)(y.filter((e=>e.props.value===b))[0],{className:"margin-top--md"}):o.createElement("div",{className:"margin-top--md"},y.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==b})))))}function g(e){const n=(0,l.A)();return o.createElement(u,(0,t.A)({key:String(n)},e))}},6750:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var t=a(8168),o=(a(6540),a(5680)),r=a(4865),l=a(9365);a(7964);const i={},s="Quickstart",c={unversionedId:"quickstart",id:"quickstart",title:"Quickstart",description:"This document will guide you on how to get Raccoon + Kafka setup running locally. This document assumes that you have Docker (with Docker Compose) and Kafka installed on your system.",source:"@site/docs/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/raccoon/quickstart",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/quickstart.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Introduction",permalink:"/raccoon/"},next:{title:"Roadmap",permalink:"/raccoon/roadmap"}},p={},u=[{value:"Run Raccoon with Docker Compose",id:"run-raccoon-with-docker-compose",level:2},{value:"Publishing Your First Event",id:"publishing-your-first-event",level:2},{value:"Where To Go Next",id:"where-to-go-next",level:2}],g={toc:u},m="wrapper";function d(e){let{components:n,...a}=e;return(0,o.yg)(m,(0,t.A)({},g,a,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"quickstart"},"Quickstart"),(0,o.yg)("p",null,"This document will guide you on how to get Raccoon + Kafka setup running locally. This document assumes that you have Docker (with Docker Compose) and Kafka installed on your system. "),(0,o.yg)("h2",{id:"run-raccoon-with-docker-compose"},"Run Raccoon with Docker Compose"),(0,o.yg)("p",null,"Here's a minimal setup that runs a single node kafka-cluster along with raccoon:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="docker-compose.yml"',title:'"docker-compose.yml"'},'networks:\n raccoon-network:\n\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:5.1.2\n hostname: zookeeper\n container_name: zookeeper\n ports:\n - "2181:2181"\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n networks:\n - raccoon-network\n\n kafka:\n image: confluentinc/cp-kafka:5.1.2\n hostname: kafka\n container_name: kafka\n depends_on:\n - zookeeper\n ports:\n - "9094:9094"\n - "9092:9092"\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: \'zookeeper:2181\'\n KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://localhost:9094\n KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT\n KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_SOCKET_REQUEST_MAX_BYTES: 1000000000\n CONFLUENT_METRICS_ENABLE: \'false\'\n links:\n - zookeeper\n networks:\n - raccoon-network\n raccoon:\n image: raystack/raccoon\n hostname: raccoon\n container_name: raccoon\n stdin_open: true\n tty: true\n depends_on:\n - kafka\n environment:\n SERVER_WEBSOCKET_PORT: "8080"\n SERVER_WEBSOCKET_CHECK_ORIGIN: "true"\n SERVER_CORS_ENABLED: "true"\n SERVER_CORS_ALLOWED_ORIGIN: "http://localhost:3000 http://localhost:8080"\n SERVER_CORS_ALLOWED_METHODS: "GET HEAD POST OPTIONS"\n SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"\n SERVER_WEBSOCKET_CONN_GROUP_HEADER: "X-User-Group"\n SERVER_GRPC_PORT: 8081\n EVENT_DISTRIBUTION_PUBLISHER_PATTERN: "event-log"\n PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "kafka:9092"\n ports:\n - "8080:8080"\n - "8081:8081"\n networks:\n - raccoon-network\n')),(0,o.yg)("p",null,"This setup is configured to publish all events to ",(0,o.yg)("inlineCode",{parentName:"p"},"event-log")," topic. You can also configure Raccoon to ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/concepts/architecture#event-distribution"},"route events to different topics based on the event type.")),(0,o.yg)("p",null,"Copy the file to your local system and run the following to start Raccoon."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ docker compose up\n")),(0,o.yg)("p",null,"To test whether Raccoon is running or not, you can try to ping the server."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ curl http://localhost:8080/ping\n")),(0,o.yg)("p",null,"To verify the event published by Raccoon. First, you need to start a Kafka listener. In a seperate terminal run:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ kafka-console-consumer --bootstrap-server localhost:9094 --topic 'event-log'\n")),(0,o.yg)("h2",{id:"publishing-your-first-event"},"Publishing Your First Event"),(0,o.yg)(r.A,{default:!0,mdxType:"Tabs"},(0,o.yg)(l.A,{value:"go",mdxType:"TabItem"},(0,o.yg)("p",null,"Make sure that ",(0,o.yg)("inlineCode",{parentName:"p"},"Go")," >= ",(0,o.yg)("inlineCode",{parentName:"p"},"1.16")," is installed on your system. See ",(0,o.yg)("a",{parentName:"p",href:"https://go.dev/doc/install"},"installation instructions")," on Go's website for more info."),(0,o.yg)("p",null,"Create a directory called ",(0,o.yg)("inlineCode",{parentName:"p"},"go-raccoon-example")," and initialize it as a go module"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ mkdir go-raccoon-example\n$ cd go-raccoon-example\n$ go mod init go-raccoon-example\n")),(0,o.yg)("p",null,"Install the raccoon client"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ go get github.com/raystack/raccoon/clients/go\n")),(0,o.yg)("p",null,"Create the ",(0,o.yg)("inlineCode",{parentName:"p"},"main.go")," file "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-go",metastring:'title="main.go" showLineNumbers',title:'"main.go"',showLineNumbers:!0},'package main\n\nimport (\n "fmt"\n "log"\n\n raccoon "github.com/raystack/raccoon/clients/go"\n "google.golang.org/protobuf/types/known/timestamppb"\n\n "github.com/google/uuid"\n "github.com/raystack/raccoon/clients/go/testdata"\n "github.com/raystack/raccoon/clients/go/ws"\n)\n\nfunc main() {\n client, err := ws.New(\n ws.WithUrl("ws://localhost:8080/api/v1/events"),\n ws.WithHeader("x-user-id", "123"),\n ws.WithHeader("x-user-type", "ACME"))\n\n if err != nil {\n log.Fatal(err)\n }\n defer client.Close()\n\n _, err = client.Send([]*raccoon.Event{\n {\n Type: "page",\n Data: &testdata.PageEvent{\n EventGuid: uuid.NewString(),\n EventName: "clicked",\n SentTime: timestamppb.Now(),\n },\n },\n })\n\n if err != nil {\n log.Fatal(err)\n }\n\n <-client.EventAcks()\n}\n')),(0,o.yg)("p",null,"Finally, run the program"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ go run main.go\n"))),(0,o.yg)(l.A,{value:"terminal",mdxType:"TabItem"},(0,o.yg)("p",null,"Make sure you have ",(0,o.yg)("inlineCode",{parentName:"p"},"curl")," installed. On a debian-based system you can install ",(0,o.yg)("inlineCode",{parentName:"p"},"curl")," via:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ sudo apt-get install -y curl\n")),(0,o.yg)("p",null,"Run the following to publish a single event to Raccoon"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},'$ curl -XPOST "http://localhost:8080/api/v1/events" \\\n -H "content-type: application/json" \\\n -H "X-User-ID: user-one" \\\n -d "\n{\n \\"req_guid\\": \\"foobar-123\\",\n \\"sent_time\\": {\n \\"seconds\\": $(date +%s),\n \\"nanos\\": $(date +%N)\n },\n \\"events\\": [\n {\n \\"type\\": \\"page\\",\n \\"eventBytes\\": \\"$(echo \\"EVENT\\" | base64)\\"\n }\n ]\n}"\n'))),(0,o.yg)(l.A,{value:"java",mdxType:"TabItem"},(0,o.yg)("p",null,"Make sure you have Java installed. Raccoon java client requires:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"JDK")," version >= 8"),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("inlineCode",{parentName:"li"},"Gradle")," version >= 7")),(0,o.yg)("p",null,"Begin by creating a new java project in a folder called ",(0,o.yg)("inlineCode",{parentName:"p"},"java-raccoon-example")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ mkdir java-raccoon-example\n$ cd java-raccoon-example\n$ gradle init --type=java-application\n")),(0,o.yg)("p",null,"Add ",(0,o.yg)("inlineCode",{parentName:"p"},"io.odpf.raccoon")," version ",(0,o.yg)("inlineCode",{parentName:"p"},"0.1.5-rc")," in your ",(0,o.yg)("inlineCode",{parentName:"p"},"build.gradle"),". It should look something like this:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-groovy"},"plugins {\n // Apply the application plugin to add support for building a CLI application in Java.\n id 'application'\n}\n\nrepositories {\n // Use Maven Central for resolving dependencies.\n mavenCentral()\n}\n\ndependencies {\n // Use JUnit test framework.\n testImplementation libs.junit\n\n // This dependency is used by the application.\n implementation libs.guava\n \n // Raccoon Client library\n implementation group: 'io.odpf', name: 'raccoon', version: '0.1.5-rc'\n}\n\n// Apply a specific Java toolchain to ease working on different environments.\njava {\n toolchain {\n languageVersion = JavaLanguageVersion.of(21)\n }\n}\n\napplication {\n // Define the main class for the application.\n mainClass = 'org.example.App'\n}\n")),(0,o.yg)("p",null,"Edit the ",(0,o.yg)("inlineCode",{parentName:"p"},"App.java")," file and add the following code:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-java",metastring:"title=src/java/org/example/App.java showLineNumbers",title:"src/java/org/example/App.java",showLineNumbers:!0},'package org.example;\n\nimport io.odpf.raccoon.client.RestConfig;\nimport io.odpf.raccoon.client.RaccoonClient;\nimport io.odpf.raccoon.client.RaccoonClientFactory;\nimport io.odpf.raccoon.model.Event;\nimport io.odpf.raccoon.model.Response;\nimport io.odpf.raccoon.model.ResponseStatus;\nimport io.odpf.raccoon.serializer.JsonSerializer;\nimport io.odpf.raccoon.wire.ProtoWire;\n\npublic class App {\n\n public static void main(String[] args) {\n RestConfig config = RestConfig.builder()\n .url("http://localhost:8080/api/v1/events")\n .header("x-user-id", "123")\n .serializer(new JsonSerializer()) // default is Json\n .marshaler(new ProtoWire()) // default is Json\n .retryMax(5) // default is 3\n .retryWait(2000) // default is one second\n .build();\n\n // get the rest client instance.\n RaccoonClient Client = RaccoonClientFactory.getRestClient(config);\n\n Response res = Client.send(new Event[]{\n new Event("page", "EVENT".getBytes())\n });\n\n if (res.isSuccess() && res.getStatus() == ResponseStatus.STATUS_SUCCESS) {\n System.out.println("The event was sent successfully");\n }\n }\n}\n\n')),(0,o.yg)("p",null,"Run the application using"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ gradle run\n"))),(0,o.yg)(l.A,{value:"js",mdxType:"TabItem"},(0,o.yg)("p",null,"Make sure you have ",(0,o.yg)("inlineCode",{parentName:"p"},"node")," >= ",(0,o.yg)("inlineCode",{parentName:"p"},"20.x")," installed. See ",(0,o.yg)("a",{parentName:"p",href:"https://nodejs.org/en/download/package-manager"},"installation instructions")," on nodejs website for more info."),(0,o.yg)("p",null,"Create a new folder called ",(0,o.yg)("inlineCode",{parentName:"p"},"js-raccoon-example")," and initalise it as a npm package."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ mkdir js-raccoon-example\n$ cd js-raccoon-example\n$ npm init\n")),(0,o.yg)("p",null,"Install the client using:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ npm install @raystack/raccoon --save\n")),(0,o.yg)("p",null,"Create a ",(0,o.yg)("inlineCode",{parentName:"p"},"main.mjs")," file with the following contents:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-js",metastring:'title="main.mjs" showLineNumbers',title:'"main.mjs"',showLineNumbers:!0},"import { RaccoonClient, SerializationType, WireType } from '@raystack/raccoon';\n\nconst logger = console;\n\n// create json messages\nconst jsonEvents = [\n {\n type: 'test-topic1',\n data: { key1: 'value1', key2: ['a', 'b'] }\n },\n {\n type: 'test-topic2',\n data: { key1: 'value2', key2: { key3: 'value3', key4: 'value4' } }\n }\n];\n\n// initialise the raccoon client with required configs\nconst raccoonClient = new RaccoonClient({\n serializationType: SerializationType.JSON,\n wireType: WireType.JSON,\n timeout: 5000,\n url: 'http://localhost:8080/api/v1/events',\n headers: {\n 'X-User-ID': 'user-1'\n }\n});\n\n// send the request\nraccoonClient\n .send(jsonEvents)\n .then((result) => {\n logger.log('Result:', result);\n })\n .catch((error) => {\n logger.error('Error:', error);\n });\n")),(0,o.yg)("p",null,"Finally run this script using:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ node main.mjs\n")))),(0,o.yg)("h2",{id:"where-to-go-next"},"Where To Go Next"),(0,o.yg)("p",null,"For more detail about publishing events to Raccoon, you can read the ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/guides/publishing"},"detailed document")," under the guides section. To understand more about how Raccoon works, you can go to the ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/concepts/architecture"},"architecture document"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8070e160.f765828c.js b/assets/js/8070e160.f765828c.js deleted file mode 100644 index e0b6aab6..00000000 --- a/assets/js/8070e160.f765828c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[651],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return h}});var r=n(7294);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 a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},s=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=l(n),h=o,m=d["".concat(u,".").concat(h)]||d[h]||p[h]||a;return n?r.createElement(m,c(c({ref:t},s),{},{components:n})):r.createElement(m,c({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){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:o,c[1]=i;for(var l=2;l<a;l++)c[l]=n[l];return r.createElement.apply(null,c)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},2257:function(e,t,n){n.r(t),n.d(t,{assets:function(){return s},contentTitle:function(){return u},default:function(){return h},frontMatter:function(){return i},metadata:function(){return l},toc:function(){return p}});var r=n(7462),o=n(3366),a=(n(7294),n(3905)),c=["components"],i={},u="Quickstart",l={unversionedId:"quickstart",id:"quickstart",title:"Quickstart",description:"This document will guide you to get Raccoon along with Kafka setup running locally. This document assumes that you have installed Docker and Kafka with host.docker.internal advertised on your machine.",source:"@site/docs/quickstart.md",sourceDirName:".",slug:"/quickstart",permalink:"/raccoon/quickstart",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/quickstart.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Introduction",permalink:"/raccoon/"},next:{title:"Roadmap",permalink:"/raccoon/roadmap"}},s={},p=[{value:"Run Raccoon With Docker",id:"run-raccoon-with-docker",level:2},{value:"Publishing Your First Event",id:"publishing-your-first-event",level:2},{value:"Where To Go Next",id:"where-to-go-next",level:2}],d={toc:p};function h(e){var t=e.components,n=(0,o.Z)(e,c);return(0,a.kt)("wrapper",(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"quickstart"},"Quickstart"),(0,a.kt)("p",null,"This document will guide you to get Raccoon along with Kafka setup running locally. This document assumes that you have installed Docker and Kafka with ",(0,a.kt)("inlineCode",{parentName:"p"},"host.docker.internal")," ",(0,a.kt)("a",{parentName:"p",href:"https://www.confluent.io/blog/kafka-listeners-explained/"},"advertised")," on your machine."),(0,a.kt)("h2",{id:"run-raccoon-with-docker"},"Run Raccoon With Docker"),(0,a.kt)("p",null,"Run the following command. Make sure to set ",(0,a.kt)("inlineCode",{parentName:"p"},"PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS")," according to your local Kafka setup."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker run -p 8080:8080 \\\n -e SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID \\\n -e PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS=host.docker.internal:9092 \\\n -e EVENT_DISTRIBUTION_PUBLISHER_PATTERN=clickstream-log \\\n raystack/raccoon:latest\n")),(0,a.kt)("p",null,"To test whether the service is running or not, you can try to ping the server."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ curl http://localhost:8080/ping\n")),(0,a.kt)("h2",{id:"publishing-your-first-event"},"Publishing Your First Event"),(0,a.kt)("p",null,"Currently, Raccoon doesn't come with a library client. To start publishing events to Raccoon, we provide you an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/tree/main/docs/example"},"example of a go client")," that you can refer to. You can also run the example right away if you have Go installed on your machine."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"# `cd` on the client example directory and run the following\n$ go run main.go sample.pb.go\n")),(0,a.kt)("p",null,"To verify the event published by Raccoon. First, you need to start a Kafka listener."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ kafka-console-consumer --bootstrap-server localhost:9092 --topic clickstream-log\n")),(0,a.kt)("h2",{id:"where-to-go-next"},"Where To Go Next"),(0,a.kt)("p",null,"For more detail about publishing events to Raccoon, you can read the ",(0,a.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/guides/publishing"},"detailed document")," under the guides section. To understand more about how Raccoon work, you can go to the ",(0,a.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/concepts/architecture"},"architecture document"),"."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8a1416ba.19537c66.js b/assets/js/8a1416ba.19537c66.js new file mode 100644 index 00000000..d9065f2a --- /dev/null +++ b/assets/js/8a1416ba.19537c66.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[699],{5680:(e,t,n)=>{n.d(t,{xA:()=>p,yg:()=>h});var a=n(6540);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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),g=o,h=u["".concat(l,".").concat(g)]||u[g]||d[g]||r;return n?a.createElement(h,s(s({ref:t},p),{},{components:n})):a.createElement(h,s({ref:t},p))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var c=2;c<r;c++)s[c]=n[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}g.displayName="MDXCreateElement"},6983:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var a=n(8168),o=(n(6540),n(5680));const r={toc_max_heading_level:4},s="Architecture",i={unversionedId:"concepts/architecture",id:"concepts/architecture",title:"Architecture",description:"Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to message queues. Following message queues are currently supported:",source:"@site/docs/concepts/architecture.md",sourceDirName:"concepts",slug:"/concepts/architecture",permalink:"/raccoon/concepts/architecture",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/concepts/architecture.md",tags:[],version:"current",frontMatter:{toc_max_heading_level:4},sidebar:"docsSidebar",previous:{title:"Troubleshooting",permalink:"/raccoon/guides/troubleshooting"},next:{title:"Structure",permalink:"/raccoon/concepts/structure"}},l={},c=[{value:"System Design",id:"system-design",level:2},{value:"Connections",id:"connections",level:2},{value:"Websockets",id:"websockets",level:3},{value:"REST",id:"rest",level:3},{value:"gRPC",id:"grpc",level:3},{value:"Event Delivery Gurantee (at-least-once for most time)",id:"event-delivery-gurantee-at-least-once-for-most-time",level:3},{value:"Acknowledging events",id:"acknowledging-events",level:2},{value:"EVENT_ACK = 0",id:"event_ack--0",level:3},{value:"EVENT_ACK = 1",id:"event_ack--1",level:3},{value:"Supported Protocols and Data formats",id:"supported-protocols-and-data-formats",level:2},{value:"Request and Response Models",id:"request-and-response-models",level:2},{value:"Protobufs",id:"protobufs",level:3},{value:"JSON",id:"json",level:3},{value:"Event Distribution",id:"event-distribution",level:3},{value:"Event Deserialization",id:"event-deserialization",level:3},{value:"Channels",id:"channels",level:3},{value:"Keeping connections alive",id:"keeping-connections-alive",level:3},{value:"Components",id:"components",level:2},{value:"Producer",id:"producer",level:3},{value:"Apache Kafka",id:"apache-kafka",level:4},{value:"Google Cloud PubSub",id:"google-cloud-pubsub",level:4},{value:"AWS Kinesis Data Streams",id:"aws-kinesis-data-streams",level:4},{value:"Observability Stack",id:"observability-stack",level:3},{value:"StatD",id:"statd",level:4},{value:"Prometheus",id:"prometheus",level:4}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.yg)(u,(0,a.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"architecture"},"Architecture"),(0,o.yg)("p",null,"Raccoon written in ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/golang"},"GO")," is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to message queues. Following message queues are currently supported:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Apache Kafka"),(0,o.yg)("li",{parentName:"ul"},"Google Cloud PubSub "),(0,o.yg)("li",{parentName:"ul"},"AWS Kinesis Data Streams")),(0,o.yg)("p",null,"Raccoon supports websocket, REST and gRPC protocols for clients to send events. With websocket it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websocket and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch ","(","array",")"," of events in protobuf format. Refer ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/guides/publishing#data-formatters"},"here")," for data definitions format that Raccoon accepts."),(0,o.yg)("p",null,"Raccoon was built with the primary purpose to source or collect user behaviour data in near-real time. User behaviour data is a stream of events that occur when users traverse through a mobile app or website. Raccoon powers analytics systems, big data pipelines and other disparate consumers by providing high volume, high throughput ingestion APIs consuming real time data. Raccoon\u2019s key architecture principle is a realization of an event agnostic backend ","(","accepts events of any type without the type awareness",")",". It is this capability that enables Raccoon to evolve into a strong player in the ingestion/collector ecosystem that has real time streaming/analytical needs."),(0,o.yg)("h2",{id:"system-design"},"System Design"),(0,o.yg)("p",null,(0,o.yg)("img",{alt:"HLD",src:n(4267).A,width:"2838",height:"1040"})),(0,o.yg)("p",null,"At a high level, the following sequence details the architecture."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Raccoon accepts events through one of the supported protocols."),(0,o.yg)("li",{parentName:"ul"},"The events are deserialized using the correct deserializer and then forwarded to the buffered channel."),(0,o.yg)("li",{parentName:"ul"},"A pool of worker go routines works off the buffered channel"),(0,o.yg)("li",{parentName:"ul"},"Each worker iterates over the events' batch, determines the topic based on the type and serializes the bytes to the Producer synchronously.")),(0,o.yg)("p",null,"Note: The internals of each of the components like channel size, buffer sizes, publisher properties etc., are configurable enabling Raccoon to be provisioned according to the system/event characteristics and load."),(0,o.yg)("h2",{id:"connections"},"Connections"),(0,o.yg)("h3",{id:"websockets"},"Websockets"),(0,o.yg)("p",null,"Raccoon supports long-running persistent WebSocket connections with the client. Once a client makes an HTTP request with a WebSocket upgrade header, raccoon upgrades the HTTP request to a WebSocket connection end of which a persistent connection is established with the client."),(0,o.yg)("p",null,"The following sequence outlines the connection handling by Raccoon:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Clients make websocket connections to Raccoon by performing a http GET API call, with headers to upgrade to websocket."),(0,o.yg)("li",{parentName:"ul"},"Raccoon uses ",(0,o.yg)("a",{parentName:"li",href:"https://github.com/gorilla/websocket"},"gorilla websocket")," handlers and for each websocket connection the handlers spawn a goroutine to handle incoming requests."),(0,o.yg)("li",{parentName:"ul"},"After the websocket connection has been established, clients can send the events."),(0,o.yg)("li",{parentName:"ul"},"Construct connection identifier from the request header. The identifier is constructed from the value of ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," header. For example, Raccoon is configured with ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID"),". Raccoon will check the value of X-User-ID header and make it an identifier. Raccoon then uses this identifier to check if there is already an existing connection with the same identifier. If the same connection already exists, Raccoon will disconnect the connection with an appropriate error message as a response proto.",(0,o.yg)("ul",{parentName:"li"},(0,o.yg)("li",{parentName:"ul"},"Optionally, you can also configure ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," to support multi-tenancy. For example, you want to use an instance of Raccoon with multiple mobile clients. You can configure raccoon with ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER=X-Mobile-Client"),". Then, Raccoon will use the value of X-Mobile-Client along with X-User-ID as identifier. The uniqueness becomes the combination of X-User-ID value with X-Mobile-Client value. This way, Raccoon can maintain the same X-User-ID within different X-Mobile-Client."))),(0,o.yg)("li",{parentName:"ul"},"Verify if the total connections have reached the configured limit based on ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_MAX_CONN")," configuration. On reaching the max connections, Raccoon disconnects the connection with an appropriate error message as a response proto."),(0,o.yg)("li",{parentName:"ul"},"Upgrade the connection and persist the identifier."),(0,o.yg)("li",{parentName:"ul"},"Add ping/pong handlers on this connection, read timeout deadline. More about these handlers in the following sections"),(0,o.yg)("li",{parentName:"ul"},"At this point, the connection is completely upgraded and Raccoon is ready to accept SendEventRequest. The handler handles each SendEventRequest by sending it to the events-channel. The events can be published by the publisher either synchronously or asynchronous based on the configuration."),(0,o.yg)("li",{parentName:"ul"},"When the connection is closed. Raccoon clean up the connection along with the identifier. The same identifier then can be reused on the upcoming connection.")),(0,o.yg)("h3",{id:"rest"},"REST"),(0,o.yg)("p",null,"Client connects to the server with the same endpoint but with POST HTTP method. As it is a rest endpoint each request is uniquely handled."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Connection identifier is constructed from the values of ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," header here too.")),(0,o.yg)("h3",{id:"grpc"},"gRPC"),(0,o.yg)("p",null,"It is recommended to generate the gRPC client for Raccoon's ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/EventService.proto"},"EventService")," and use that client to do gRPC request. Currently only unary requests are supported."),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Client's ",(0,o.yg)("inlineCode",{parentName:"li"},"SendEvent")," method is called to send the event."),(0,o.yg)("li",{parentName:"ul"},"Connection identifier is constructed from the values of ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,o.yg)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," in gRPC metadata.")),(0,o.yg)("p",null,"Clients can send the request anytime as long as the websocket connection is alive whereas with REST and gRPC requests can be sent only once."),(0,o.yg)("h3",{id:"event-delivery-gurantee-at-least-once-for-most-time"},"Event Delivery Gurantee ","(","at-least-once for most time",")"),(0,o.yg)("p",null,"The server for the most times provide at-least-once event delivery guarantee."),(0,o.yg)("p",null,"Event data loss happens in the following scenarios:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},"When the server shuts down, events in-flight in the buffer or those stored in the internal channels are potentially lost. The server performs, on a best-effort basis, to send all the events within a configured shutdown timeout ",(0,o.yg)("inlineCode",{parentName:"p"},"WORKER_BUFFER_FLUSH_TIMEOUT_MS"),". The default time is set to 5000 ms within which it is expected that all the events are sent by then.")),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},"When the downstream message queue is facing a downtime"),(0,o.yg)("p",{parentName:"li"},"Every event sent from the client is stored in-memory in the buffered channels ","(","explained in the ",(0,o.yg)("inlineCode",{parentName:"p"},"Acknowledging events")," section",")",". The workers pull the events from this channel and send it to Producer for publishing. The server does not maintain any event persistence. This is a conscious decision to enable a simpler, performant ingestion design for the server. In future: Server can be augmented for zero-data loss or at-least-once guarantees through intermediate event persistence."))),(0,o.yg)("h2",{id:"acknowledging-events"},"Acknowledging events"),(0,o.yg)("p",null,"Event acknowledgements was designed to signify if the events batch is received and sent successfully. This will enable the clients to retry on failed event delivery. Raccoon chooses when to send event acknowledgement based on the configuration parameter ",(0,o.yg)("inlineCode",{parentName:"p"},"EVENT_ACK"),"."),(0,o.yg)("h3",{id:"event_ack--0"},"EVENT_ACK = 0"),(0,o.yg)("p",null,"Raccoon sends the acknowledgments as soon as it receives and deserializes the events successfully using the proto ",(0,o.yg)("inlineCode",{parentName:"p"},"SendEventRequest"),". This configuration is recommended when low latency takes precedence over end to end acknowledgement. The acks are sent even before it is produced to downstream message queue. The following picture depicts the sequence of the event ack."),(0,o.yg)("p",null,(0,o.yg)("img",{src:n(8818).A,width:"4288",height:"423"})),(0,o.yg)("p",null,"Pros:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Performant as it does not wait for producer/network round trip for each batch of events.")),(0,o.yg)("p",null,"Cons:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Potential data-loss and the clients do not get a chance to retry/resend the events. The possibility of data-loss occurs when the downstream message queue is experiencing downtime.")),(0,o.yg)("h3",{id:"event_ack--1"},"EVENT_ACK = 1"),(0,o.yg)("p",null,"Raccoon sends the acknowledgments after the events are acknowledged successfully from the downstream message queue. This configuration is recommended when reliable end-to-end acknowledgements are required. Here the underlying publisher acknowledgement is leveraged."),(0,o.yg)("p",null,(0,o.yg)("img",{src:n(7407).A,width:"4290",height:"423"})),(0,o.yg)("p",null,"Pros:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Minimal data loss, clients can retry/resend events in case of downtime/broker failures.")),(0,o.yg)("p",null,"Cons:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Increased end to end latency as clients need to wait for the event to be published.")),(0,o.yg)("p",null,"Considering that kafka is set up in a clustered, cross-region, cross-zone environment, the chances of it going down are unlikely. In case if it does, the amount of events lost is negligible considering it is a streaming system and is expected to forward millions of events/sec."),(0,o.yg)("p",null,"PubSub and Kinesis offer strong SLAs (>=99.95% and >=99.9%) so they are least likey to be unavailable. However, you may hit rate limits for these services, so we advise that you provision your infrastructure sufficiently to avoid it. In case a rate-limit is hit, Raccoon will report the message as undelivered."),(0,o.yg)("p",null,"When an SendEventRequest is sent to Raccoon over any connection be it Websocket/HTTP/gRPC a corresponding response is sent by the server indicating whether the event was consumed successfully or not."),(0,o.yg)("h2",{id:"supported-protocols-and-data-formats"},"Supported Protocols and Data formats"),(0,o.yg)("table",null,(0,o.yg)("thead",{parentName:"table"},(0,o.yg)("tr",{parentName:"thead"},(0,o.yg)("th",{parentName:"tr",align:"center"},"Protocol"),(0,o.yg)("th",{parentName:"tr",align:"center"},"Data Format"),(0,o.yg)("th",{parentName:"tr",align:"center"},"Version"))),(0,o.yg)("tbody",{parentName:"table"},(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:"center"},"WebSocket"),(0,o.yg)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,o.yg)("td",{parentName:"tr",align:"center"},"v0.1.0")),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:"center"},"WebSocket"),(0,o.yg)("td",{parentName:"tr",align:"center"},"JSON"),(0,o.yg)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:"center"},"REST API"),(0,o.yg)("td",{parentName:"tr",align:"center"},"JSON"),(0,o.yg)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:"center"},"REST API"),(0,o.yg)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,o.yg)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:"center"},"gRPC"),(0,o.yg)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,o.yg)("td",{parentName:"tr",align:"center"},"v0.1.2")))),(0,o.yg)("h2",{id:"request-and-response-models"},"Request and Response Models"),(0,o.yg)("h3",{id:"protobufs"},"Protobufs"),(0,o.yg)("p",null,"When an ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventRequest")," proto below containing events are sent over the wire"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-protobuf"},"message SendEventRequest {\n //unique guid generated by the client for this request\n string req_guid = 1;\n // time probably when the client sent it\n google.protobuf.Timestamp sent_time = 2;\n // actual events\n repeated Event events = 3;\n}\n")),(0,o.yg)("p",null,"a corresponding ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventResponse")," is sent by the server."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-protobuf"},"message SendEventResponse {\n Status status = 1;\n Code code = 2;\n /* time when the response is generated */\n int64 sent_time = 3;\n /* failure reasons if any */\n string reason = 4;\n /* Usually detailing the success/failures */\n map<string, string> data = 5;\n}\n")),(0,o.yg)("h3",{id:"json"},"JSON"),(0,o.yg)("p",null,"When a JSON event like the one mentioned below is sent a corresponding JSON response is sent by the server."),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Request")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{\n "req_guid": "1234abcd",\n "sent_time": {\n "seconds": 1638154927,\n "nanos": 376499000\n },\n "events": [\n {\n "eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",\n "type": "booking"\n }\n ]\n}\n')),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Response")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'{\n "status": 1,\n "code": 1,\n "sent_time": 1638155915,\n "data": {\n "req_guid": "1234abcd"\n }\n}\n')),(0,o.yg)("h3",{id:"event-distribution"},"Event Distribution"),(0,o.yg)("p",null,"Event distribution works by finding the type for each event in the batch and sending them to appropriate message queue topic. The topic name is determined by the following code"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-go"},'topic := strings.Replace(p.topicFormat, "%s", event.Type, 1)\n')),(0,o.yg)("p",null,"where:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("strong",{parentName:"li"},"topicFormat")," - is the pattern configured via ",(0,o.yg)("inlineCode",{parentName:"li"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")," "),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("strong",{parentName:"li"},"type")," - is the type set by the client on the Event")),(0,o.yg)("p",null,"For eg. setting the"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log\n")),(0,o.yg)("p",null,"and a type such as ",(0,o.yg)("inlineCode",{parentName:"p"},"type=viewed")," in the ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"event")," format"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-protobuf"},"message Event {\n /*\n `eventBytes` is where you put bytes serialized event.\n */\n bytes eventBytes = 1;\n /*\n `type` denotes an event type that the producer of this proto message may set.\n It is currently used by raccoon to distribute events to respective message queue topics. However the\n users of this proto can use this type to set strings which can be processed in their\n ingestion systems to distribute or perform other functions.\n */\n string type = 2;\n }\n")),(0,o.yg)("p",null,"will have the event sent to a topic like"),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"topic-viewed-log")),(0,o.yg)("p",null,"The event distribution does not depend on any partition logic. So events can be randomly distributed to any available partition."),(0,o.yg)("h3",{id:"event-deserialization"},"Event Deserialization"),(0,o.yg)("p",null,"The top level wrapper ",(0,o.yg)("inlineCode",{parentName:"p"},"SendEventRequest")," is deserialized which provides a list of events of type ",(0,o.yg)("inlineCode",{parentName:"p"},"Event")," proto. This event wrapper composes of serialized bytes, which is the actual event, set in the field ",(0,o.yg)("inlineCode",{parentName:"p"},"bytes")," inside the ",(0,o.yg)("inlineCode",{parentName:"p"},"Event")," proto. Raccoon does not open this underlying bytes. The deserialization is used to unwrap the event type and determine the topic that the ",(0,o.yg)("inlineCode",{parentName:"p"},"eventBytes")," ","(","an event",")"," need to be sent to."),(0,o.yg)("h3",{id:"channels"},"Channels"),(0,o.yg)("p",null,"Buffered Channels are used to store the incoming events' batch. The channel sizes can be configured based on the load & capacity."),(0,o.yg)("h3",{id:"keeping-connections-alive"},"Keeping connections alive"),(0,o.yg)("p",null,"The server ensures that the connections are recyclable. It adopts mechanisms to check connection time idleness. The handlers ping clients very 30 seconds ","(","configurable",")",". If the client does not respond within a stipulated time the connection is marked as corrupt. Every subsequent read/write message there after on this connection fails. Raccoon removes the connections post this. Clients can also ping the server while the server responds with pongs to these pings. Clients can programmatically reconnect on failed or corrupt server connections."),(0,o.yg)("h2",{id:"components"},"Components"),(0,o.yg)("h3",{id:"producer"},"Producer"),(0,o.yg)("p",null,"Raccoon supports a number of destination event storage systems. Following is a list of currently supported systems, along with their status. "),(0,o.yg)("table",null,(0,o.yg)("thead",{parentName:"table"},(0,o.yg)("tr",{parentName:"thead"},(0,o.yg)("th",{parentName:"tr",align:null},"Name"),(0,o.yg)("th",{parentName:"tr",align:null},"Version"),(0,o.yg)("th",{parentName:"tr",align:null},"Status"))),(0,o.yg)("tbody",{parentName:"table"},(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:null},"Apache Kafka"),(0,o.yg)("td",{parentName:"tr",align:null},"v0.1.0"),(0,o.yg)("td",{parentName:"tr",align:null},(0,o.yg)("inlineCode",{parentName:"td"},"STABLE"))),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:null},"Google Cloud PubSub"),(0,o.yg)("td",{parentName:"tr",align:null},"v0.2.3"),(0,o.yg)("td",{parentName:"tr",align:null},(0,o.yg)("inlineCode",{parentName:"td"},"ALPHA"))),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:null},"AWS Kinesis Data Streams"),(0,o.yg)("td",{parentName:"tr",align:null},"v0.2.5"),(0,o.yg)("td",{parentName:"tr",align:null},(0,o.yg)("inlineCode",{parentName:"td"},"ALPHA"))))),(0,o.yg)("h4",{id:"apache-kafka"},"Apache Kafka"),(0,o.yg)("p",null,"Raccoon uses ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go"},"confluent go kafka")," as the producer client to publish events. Publishing events are light weight and relies on kafka producer's retries. Confluent internally uses librdkafka which produces events asynchronously. Application writes messages using a functional based producer API"),(0,o.yg)("p",null,(0,o.yg)("inlineCode",{parentName:"p"},"Produce(message, deliveryChannel)")," -- ",(0,o.yg)("inlineCode",{parentName:"p"},"deliveryChannel")," is where the delivery reports or acknowledgements are received."),(0,o.yg)("p",null,"Raccoon internally checks for these delivery reports before pulling the next batch of events. On failed deliveries the appropriate metrics are updated. This mechanism makes the events delivery synchronous and a reliable events delivery."),(0,o.yg)("h4",{id:"google-cloud-pubsub"},"Google Cloud PubSub"),(0,o.yg)("p",null,"Raccoon uses ",(0,o.yg)("a",{parentName:"p",href:"https://pkg.go.dev/cloud.google.com/go/pubsub"},"cloud.google.com/go/pubsub")," as the producer client for publishing events to Google Cloud PubSub."),(0,o.yg)("p",null,"The Google Cloud PubSub SDK internally buffers messages in batches before sending them downstream. You can control this buffering behaviour by tuning the following env variables:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher_pubsub_publish_count_threshold"},(0,o.yg)("inlineCode",{parentName:"a"},"PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD"))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher_pubsub_publish_byte_threshold"},(0,o.yg)("inlineCode",{parentName:"a"},"PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD"))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations#publisher_pubsub_publish_delay_threshold_ms"},(0,o.yg)("inlineCode",{parentName:"a"},"PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS")))),(0,o.yg)("p",null,"The defaults for these settings are optimal for near-realtime uses cases."),(0,o.yg)("h4",{id:"aws-kinesis-data-streams"},"AWS Kinesis Data Streams"),(0,o.yg)("p",null,"Raccoon uses ",(0,o.yg)("a",{parentName:"p",href:"https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/kinesis"},"github.com/aws/aws-sdk-go-v2/service/kinesis")," as the producer client for publishing events to AWS Kinesis."),(0,o.yg)("p",null,"In particular, ",(0,o.yg)("inlineCode",{parentName:"p"},"kinesis.PutRecord()")," is used for sending messages downstream. This means that the messages are sent immediately without any buffering at the SDK level. Each message is given a random partition key (using ",(0,o.yg)("inlineCode",{parentName:"p"},"rand.Int31()"),") so that messages are evenly distributed amongst available shards. "),(0,o.yg)("p",null,"In the future, Raccoon may support a more robust partition selection mechanism that has stronger distribution guarantees."),(0,o.yg)("h3",{id:"observability-stack"},"Observability Stack"),(0,o.yg)("p",null,"Raccoon supports ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/statsd/statsd"},"StatsD")," and ",(0,o.yg)("a",{parentName:"p",href:"https://prometheus.io/"},"Prometheus")," as telemetry systems."),(0,o.yg)("h4",{id:"statd"},(0,o.yg)("a",{parentName:"h4",href:"https://github.com/statsd/statsd"},"StatD")),(0,o.yg)("p",null,"A recommended choice for observability stack would be to host ",(0,o.yg)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/telegraf/"},"telegraf")," as the receiver of these measurements and export it to ",(0,o.yg)("a",{parentName:"p",href:"https://www.influxdata.com/get-influxdb/"},"influx")," database for storage, ",(0,o.yg)("a",{parentName:"p",href:"https://grafana.com/"},"grafana")," to build dashboards using Influx as the source."),(0,o.yg)("h4",{id:"prometheus"},(0,o.yg)("a",{parentName:"h4",href:"https://prometheus.io/"},"Prometheus")),(0,o.yg)("p",null,"Prometheus operates on a pull model and comes with it's own time-series database. You don't need any additional components apart from the prometheus to start collecting and storing metrics. ",(0,o.yg)("a",{parentName:"p",href:"https://grafana.com/"},"Grafana")," can be used to build dashboards using Prometheus as a data source."))}d.isMDXComponent=!0},7407:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/raccoon_async-293af9c9ceab1777e1780db272c51fa5.png"},4267:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/raccoon_hld-6627a7d982b7dd633d7214a85eacb31e.png"},8818:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/raccoon_sync-3682a8af8546dae4d1ed0f7026fc1f60.png"}}]); \ No newline at end of file diff --git a/assets/js/8a1416ba.ac09958b.js b/assets/js/8a1416ba.ac09958b.js deleted file mode 100644 index 71d183bb..00000000 --- a/assets/js/8a1416ba.ac09958b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[886],{3905:function(e,t,n){n.d(t,{Zo:function(){return p},kt:function(){return u}});var a=n(7294);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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),h=c(n),u=o,m=h["".concat(l,".").concat(u)]||h[u]||d[u]||r;return n?a.createElement(m,i(i({ref:t},p),{},{components:n})):a.createElement(m,i({ref:t},p))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var c=2;c<r;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},4730:function(e,t,n){n.r(t),n.d(t,{assets:function(){return p},contentTitle:function(){return l},default:function(){return u},frontMatter:function(){return s},metadata:function(){return c},toc:function(){return d}});var a=n(7462),o=n(3366),r=(n(7294),n(3905)),i=["components"],s={},l="Architecture",c={unversionedId:"concepts/architecture",id:"concepts/architecture",title:"Architecture",description:"Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to Kafka. Raccoon supports websockets, REST and gRPC protocols for clients to send events. With wesockets it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websockets and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch \\(array\\) of events in protobuf format. Refer here for data definitions format that Raccoon accepts.",source:"@site/docs/concepts/architecture.md",sourceDirName:"concepts",slug:"/concepts/architecture",permalink:"/raccoon/concepts/architecture",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/concepts/architecture.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Troubleshooting",permalink:"/raccoon/guides/troubleshooting"},next:{title:"Structure",permalink:"/raccoon/concepts/structure"}},p={},d=[{value:"System Design",id:"system-design",level:2},{value:"Connections",id:"connections",level:2},{value:"Websockets",id:"websockets",level:3},{value:"REST",id:"rest",level:3},{value:"gRPC",id:"grpc",level:3},{value:"Event Delivery Gurantee (at-least-once for most time)",id:"event-delivery-gurantee-at-least-once-for-most-time",level:3},{value:"Acknowledging events",id:"acknowledging-events",level:2},{value:"EVENT_ACK = 0",id:"event_ack--0",level:3},{value:"EVENT_ACK = 1",id:"event_ack--1",level:3},{value:"Supported Protocols and Data formats",id:"supported-protocols-and-data-formats",level:2},{value:"Request and Response Models",id:"request-and-response-models",level:2},{value:"Protobufs",id:"protobufs",level:3},{value:"JSON",id:"json",level:3},{value:"Event Distribution",id:"event-distribution",level:3},{value:"Event Deserialization",id:"event-deserialization",level:3},{value:"Channels",id:"channels",level:3},{value:"Keeping connections alive",id:"keeping-connections-alive",level:3},{value:"Components",id:"components",level:2},{value:"Kafka producer",id:"kafka-producer",level:3},{value:"Observability Stack",id:"observability-stack",level:3}],h={toc:d};function u(e){var t=e.components,s=(0,o.Z)(e,i);return(0,r.kt)("wrapper",(0,a.Z)({},h,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"architecture"},"Architecture"),(0,r.kt)("p",null,"Raccoon written in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/golang"},"GO")," is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to Kafka. Raccoon supports websockets, REST and gRPC protocols for clients to send events. With wesockets it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websockets and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch ","(","array",")"," of events in protobuf format. Refer ",(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/guides/publishing#data-formatters"},"here")," for data definitions format that Raccoon accepts."),(0,r.kt)("p",null,"Raccoon was built with a primary purpose to source or collect user behaviour data in near-real time. User behaviour data is a stream of events that occur when users traverse through a mobile app or website. Raccoon powers analytics systems, big data pipelines and other disparate consumers by providing high volume, high throughput ingestion APIs consuming real time data. Raccoon\u2019s key architecture principle is a realization of an event agnostic backend ","(","accepts events of any type without the type awareness",")",". It is this capability that enables Raccoon to evolve into a strong player in the ingestion/collector ecosystem that has real time streaming/analytical needs."),(0,r.kt)("h2",{id:"system-design"},"System Design"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"HLD",src:n(3952).Z,width:"2838",height:"1040"})),(0,r.kt)("p",null,"At a high level, the following sequence details the architecture."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Raccoon accepts events through one of the supported protocols."),(0,r.kt)("li",{parentName:"ul"},"The events are deserialized using the correct deserializer and then forwarded to the buffered channel."),(0,r.kt)("li",{parentName:"ul"},"A pool of worker go routines works off the buffered channel"),(0,r.kt)("li",{parentName:"ul"},"Each worker iterates over the events' batch, determines the topic based on the type and serializes the bytes to the Kafka producer synchronously.")),(0,r.kt)("p",null,"Note: The internals of each of the components like channel size, buffer sizes, publisher properties etc., are configurable enabling Raccoon to be provisioned according to the system/event characteristics and load."),(0,r.kt)("h2",{id:"connections"},"Connections"),(0,r.kt)("h3",{id:"websockets"},"Websockets"),(0,r.kt)("p",null,"Raccoon supports long-running persistent WebSocket connections with the client. Once a client makes an HTTP request with a WebSocket upgrade header, raccoon upgrades the HTTP request to a WebSocket connection end of which a persistent connection is established with the client."),(0,r.kt)("p",null,"The following sequence outlines the connection handling by Raccoon:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Clients make websocket connections to Raccoon by performing a http GET API call, with headers to upgrade to websocket."),(0,r.kt)("li",{parentName:"ul"},"Raccoon uses ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/gorilla/websocket"},"gorilla websocket")," handlers and for each websocket connection the handlers spawn a goroutine to handle incoming requests."),(0,r.kt)("li",{parentName:"ul"},"After the websocket connection has been established, clients can send the events."),(0,r.kt)("li",{parentName:"ul"},"Construct connection identifier from the request header. The identifier is constructed from the value of ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," header. For example, Raccoon is configured with ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID"),". Raccoon will check the value of X-User-ID header and make it an identifier. Raccoon then uses this identifier to check if there is already an existing connection with the same identifier. If the same connection already exists, Raccoon will disconnect the connection with an appropriate error message as a response proto.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Optionally, you can also configure ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," to support multi-tenancy. For example, you want to use an instance of Raccoon with multiple mobile clients. You can configure raccoon with ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER=X-Mobile-Client"),". Then, Raccoon will use the value of X-Mobile-Client along with X-User-ID as identifier. The uniqueness becomes the combination of X-User-ID value with X-Mobile-Client value. This way, Raccoon can maintain the same X-User-ID within different X-Mobile-Client."))),(0,r.kt)("li",{parentName:"ul"},"Verify if the total connections have reached the configured limit based on ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_MAX_CONN")," configuration. On reaching the max connections, Raccoon disconnects the connection with an appropriate error message as a response proto."),(0,r.kt)("li",{parentName:"ul"},"Upgrade the connection and persist the identifier."),(0,r.kt)("li",{parentName:"ul"},"Add ping/pong handlers on this connection, read timeout deadline. More about these handlers in the following sections"),(0,r.kt)("li",{parentName:"ul"},"At this point, the connection is completely upgraded and Raccoon is ready to accept SendEventRequest. The handler handles each SendEventRequest by sending it to the events-channel. The events can be published by the publisher either synchronously or asynchronous based on the configuration."),(0,r.kt)("li",{parentName:"ul"},"When the connection is closed. Raccoon clean up the connection along with the identifier. The same identifier then can be reused on the upcoming connection.")),(0,r.kt)("h3",{id:"rest"},"REST"),(0,r.kt)("p",null,"Client connects to the server with the same endpoint but with POST HTTP method. As it is a rest endpoint each request is uniquely handled."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Connection identifier is constructed from the values of ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," header here too.")),(0,r.kt)("h3",{id:"grpc"},"gRPC"),(0,r.kt)("p",null,"It is recommended to generate the gRPC client for Raccoon's ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/EventService.proto"},"EventService")," and use that client to do gRPC request. Currently only unary requests are supported."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Client's ",(0,r.kt)("inlineCode",{parentName:"li"},"SendEvent")," method is called to send the event."),(0,r.kt)("li",{parentName:"ul"},"Connection identifier is constructed from the values of ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_ID_HEADER")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"SERVER_WEBSOCKET_CONN_GROUP_HEADER")," in gRPC metadata.")),(0,r.kt)("p",null,"Clients can send the request anytime as long as the websocket connection is alive whereas with REST and gRPC requests can be sent only once."),(0,r.kt)("h3",{id:"event-delivery-gurantee-at-least-once-for-most-time"},"Event Delivery Gurantee ","(","at-least-once for most time",")"),(0,r.kt)("p",null,"The server for the most times provide at-least-once event delivery gurantee."),(0,r.kt)("p",null,"Event data loss happens in the following scenarios:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When the server shutsdown, events in-flight in the kafka buffer or those stored in the internal channels are potentially lost. The server performs, on a best-effort basis, sending all the events to kafka within a configured shutdown time ",(0,r.kt)("inlineCode",{parentName:"p"},"WORKER_BUFFER_FLUSH_TIMEOUT_MS"),". The default time is set to 5000 ms within which it is expected that all the events are sent by then.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When the upstream kafka cluster is facing a downtime"),(0,r.kt)("p",{parentName:"li"},"Every event sent from the client is stored in-memory in the buffered channels ","(","explained in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Acknowledging events")," section",")",". The workers pull the events from this channel and publishes to kafka. The server does not maintain any event peristence. This is a conscious decision to enable a simpler, performant ingestion design for the server. The buffer/retries of failed events is relied upon Kafka's internal buffer/retries respectively. In future: Server can be augmented for zero-data loss or at-least-once guarantees through intermediate event persitence."))),(0,r.kt)("h2",{id:"acknowledging-events"},"Acknowledging events"),(0,r.kt)("p",null,"Event acknowledgements was designed to signify if the events batch is received and sent to Kafka successfully. This will enable the clients to retry on failed event delivery. Raccoon chooses when to send event acknowledgement based on the configuration parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"EVENT_ACK"),"."),(0,r.kt)("h3",{id:"event_ack--0"},"EVENT_ACK = 0"),(0,r.kt)("p",null,"Raccoon sends the acknowledgments as soon as it receives and deserializes the events successfully using the proto ",(0,r.kt)("inlineCode",{parentName:"p"},"SendEventRequest"),". This configuration is recommended when low latency takes precedence over end to end acknowledgement. The acks are sent even before it is produced to Kafka. The following picture depicts the sequence of the event ack."),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4597).Z,width:"4288",height:"423"})),(0,r.kt)("p",null,"Pros:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Performant as it does not wait for kafka/network round trip for each batch of events.")),(0,r.kt)("p",null,"Cons:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Potential data-loss and the clients do not get a chance to retry/resend the events. The possiblity of data-loss occurs when the kafka borker cluster is facing a downtime.")),(0,r.kt)("h3",{id:"event_ack--1"},"EVENT_ACK = 1"),(0,r.kt)("p",null,"Raccoon sends the acknowledgments after the events are acknowledged successfully from the Kafka brokers. This configuration is recommended when reliable end-to-end acknowledgements are required. Here the underlying publisher acknowledgement is leveraged."),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(11).Z,width:"4290",height:"423"})),(0,r.kt)("p",null,"Pros:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Minimal data loss, clients can retry/resend events in case of downtime/broker failures.")),(0,r.kt)("p",null,"Cons:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Increased end to end latency as clients need to wait for the event to be published.")),(0,r.kt)("p",null,"Considering that kafka is set up in a clustered, cross-region, cross-zone environment, the chances of it going down are mostly unlikely. In case if it does, the amount of events lost is negligible considering it is a streaming system and is expected to forward millions of events/sec."),(0,r.kt)("p",null,"When an SendEventRequest is sent to Raccoon over any connection be it Websocket/HTTP/gRPC a corresponding response is sent by the server inidcating whether the event was consumed successfully or not."),(0,r.kt)("h2",{id:"supported-protocols-and-data-formats"},"Supported Protocols and Data formats"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Protocol"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Data Format"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Version"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"WebSocket"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,r.kt)("td",{parentName:"tr",align:"center"},"v0.1.0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"WebSocket"),(0,r.kt)("td",{parentName:"tr",align:"center"},"JSON"),(0,r.kt)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"REST API"),(0,r.kt)("td",{parentName:"tr",align:"center"},"JSON"),(0,r.kt)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"REST API"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,r.kt)("td",{parentName:"tr",align:"center"},"v0.1.2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"gRPC"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Protobufs"),(0,r.kt)("td",{parentName:"tr",align:"center"},"v0.1.2")))),(0,r.kt)("h2",{id:"request-and-response-models"},"Request and Response Models"),(0,r.kt)("h3",{id:"protobufs"},"Protobufs"),(0,r.kt)("p",null,"When an ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventRequest")," proto below containing events are sent over the wire"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"message SendEventRequest {\n //unique guid generated by the client for this request\n string req_guid = 1;\n // time probably when the client sent it\n google.protobuf.Timestamp sent_time = 2;\n // actual events\n repeated Event events = 3;\n}\n")),(0,r.kt)("p",null,"a corresponding ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/v1beta1/raccoon.proto"},"SendEventResponse")," is sent by the server."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"message SendEventResponse {\n Status status = 1;\n Code code = 2;\n /* time when the response is generated */\n int64 sent_time = 3;\n /* failure reasons if any */\n string reason = 4;\n /* Usually detailing the success/failures */\n map<string, string> data = 5;\n}\n")),(0,r.kt)("h3",{id:"json"},"JSON"),(0,r.kt)("p",null,"When a JSON event like the one metoined below is sent a corresponding JSON response is sent by the server."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Request")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "req_guid": "1234abcd",\n "sent_time": {\n "seconds": 1638154927,\n "nanos": 376499000\n },\n "events": [\n {\n "eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",\n "type": "booking"\n }\n ]\n}\n')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Response")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "status": 1,\n "code": 1,\n "sent_time": 1638155915,\n "data": {\n "req_guid": "1234abcd"\n }\n}\n')),(0,r.kt)("h3",{id:"event-distribution"},"Event Distribution"),(0,r.kt)("p",null,"Event distribution works by finding the type for each event in the batch and sending them to appropriate kafka topic. The topic name is determined by the following code"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"topic := fmt.Sprintf(pr.topicFormat, event.Type)\n")),(0,r.kt)("p",null,"where ",(0,r.kt)("strong",{parentName:"p"},"topicformat")," - is the configured pattern ",(0,r.kt)("inlineCode",{parentName:"p"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")," ",(0,r.kt)("strong",{parentName:"p"},"type")," - is the type set by the client when the event proto is generated"),(0,r.kt)("p",null,"For eg. setting the"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log\n")),(0,r.kt)("p",null,"and a type such as ",(0,r.kt)("inlineCode",{parentName:"p"},"type=viewed")," in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/blob/main/raystack/raccoon/Event.proto"},"event")," format"),(0,r.kt)("p",null,"and a type such as ",(0,r.kt)("inlineCode",{parentName:"p"},"type=viewed")," in the event format"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"message Event {\n /*\n `eventBytes` is where you put bytes serialized event.\n */\n bytes eventBytes = 1;\n /*\n `type` denotes an event type that the producer of this proto message may set.\n It is currently used by raccoon to distribute events to respective Kafka topics. However the\n users of this proto can use this type to set strings which can be processed in their\n ingestion systems to distribute or perform other functions.\n */\n string type = 2;\n }\n")),(0,r.kt)("p",null,"will have the event sent to a topic like"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"topic-viewed-log")),(0,r.kt)("p",null,"The event distribution does not depend on any partition logic. So events can be randomnly distrbuted to any kafka partition."),(0,r.kt)("h3",{id:"event-deserialization"},"Event Deserialization"),(0,r.kt)("p",null,"The top level wrapper ",(0,r.kt)("inlineCode",{parentName:"p"},"SendEventRequest")," is deserialized which provides a list of events of type ",(0,r.kt)("inlineCode",{parentName:"p"},"Event")," proto. This event wrapper composes of serialized bytes, which is the actual event, set in the field ",(0,r.kt)("inlineCode",{parentName:"p"},"bytes")," inside the ",(0,r.kt)("inlineCode",{parentName:"p"},"Event")," proto. Raccoon does not open this underlying bytes. The deserialization is used to unwrap the event type and determine the topic that the ",(0,r.kt)("inlineCode",{parentName:"p"},"eventBytes")," ","(","an event",")"," need to be sent to."),(0,r.kt)("h3",{id:"channels"},"Channels"),(0,r.kt)("p",null,"Buffered Channels are used to store the incoming events' batch. The channel sizes can be configured based on the load & capacity."),(0,r.kt)("h3",{id:"keeping-connections-alive"},"Keeping connections alive"),(0,r.kt)("p",null,"The server ensures that the connections are recyclable. It adopts mechanisms to check connection time idleness. The handlers ping clients very 30 seconds ","(","configurable",")",". If the client does not respond within a stipulated time the connection is marked as corrupt. Every subsequent read/write message there after on this connection fails. Raccoon removes the connections post this. Clients can also ping the server while the server responds with pongs to these pings. Clients can programmtically reconnect on failed or corrupt server connections."),(0,r.kt)("h2",{id:"components"},"Components"),(0,r.kt)("h3",{id:"kafka-producer"},"Kafka producer"),(0,r.kt)("p",null,"Raccoon uses ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/confluentinc/confluent-kafka-go"},"confluent go kafka")," as the producer client to publish events. Publishing events are light weight and relies on kafka producer's retries. Confluent internally uses librdkafka which produces events asynchronously. Application writes messages using a functional based producer API"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Produce(message, deliveryChannel)")," -- ",(0,r.kt)("inlineCode",{parentName:"p"},"deliveryChannel")," is where the delivery reports or acknowledgements are received."),(0,r.kt)("p",null,"Raccoon internally checks for these delivery reports before pulling the next batch of events. On failed deliveries the appropriate metrics are updated. This mechanism makes the events delivery synchronous and a reliable events delivery."),(0,r.kt)("h3",{id:"observability-stack"},"Observability Stack"),(0,r.kt)("p",null,"Raccoon internally uses ",(0,r.kt)("a",{parentName:"p",href:"https://gopkg.in/alexcesaro/statsd.v2"},"statsd")," go module client to export metrics in StatsD line protocol format. A recommended choice for observability stack would be to host ",(0,r.kt)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/telegraf/"},"telegraf")," as the receiver of these measurements and expoert it to ",(0,r.kt)("a",{parentName:"p",href:"https://www.influxdata.com/get-influxdb/"},"influx"),", influx to store the metrics, ",(0,r.kt)("a",{parentName:"p",href:"https://grafana.com/"},"grafana")," to build dashboards using Influx as the source."))}u.isMDXComponent=!0},11:function(e,t,n){t.Z=n.p+"assets/images/raccoon_async-293af9c9ceab1777e1780db272c51fa5.png"},3952:function(e,t,n){t.Z=n.p+"assets/images/raccoon_hld-6627a7d982b7dd633d7214a85eacb31e.png"},4597:function(e,t,n){t.Z=n.p+"assets/images/raccoon_sync-3682a8af8546dae4d1ed0f7026fc1f60.png"}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.01815371.js b/assets/js/935f2afb.01815371.js new file mode 100644 index 00000000..9a3dbd7a --- /dev/null +++ b/assets/js/935f2afb.01815371.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[581],{5610:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docsSidebar":[{"type":"link","label":"Introduction","href":"/raccoon/","docId":"introduction"},{"type":"link","label":"Quickstart","href":"/raccoon/quickstart","docId":"quickstart"},{"type":"link","label":"Roadmap","href":"/raccoon/roadmap","docId":"roadmap"},{"type":"category","label":"Guides","items":[{"type":"link","label":"Overview","href":"/raccoon/guides/overview","docId":"guides/overview"},{"type":"link","label":"Publishing Events","href":"/raccoon/guides/publishing","docId":"guides/publishing"},{"type":"link","label":"Deployment","href":"/raccoon/guides/deployment","docId":"guides/deployment"},{"type":"link","label":"Monitoring","href":"/raccoon/guides/monitoring","docId":"guides/monitoring"},{"type":"link","label":"Troubleshooting","href":"/raccoon/guides/troubleshooting","docId":"guides/troubleshooting"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Concepts","items":[{"type":"link","label":"Architecture","href":"/raccoon/concepts/architecture","docId":"concepts/architecture"},{"type":"link","label":"Structure","href":"/raccoon/concepts/structure","docId":"concepts/structure"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Reference","items":[{"type":"link","label":"Configurations","href":"/raccoon/reference/configurations","docId":"reference/configurations"},{"type":"link","label":"Metrics","href":"/raccoon/reference/metrics","docId":"reference/metrics"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Contribute","items":[{"type":"link","label":"Contribution Process","href":"/raccoon/contribute/contribution","docId":"contribute/contribution"},{"type":"link","label":"Development Guide","href":"/raccoon/contribute/development","docId":"contribute/development"},{"type":"link","label":"Release Process","href":"/raccoon/contribute/release","docId":"contribute/release"}],"collapsed":false,"collapsible":true}]},"docs":{"concepts/architecture":{"id":"concepts/architecture","title":"Architecture","description":"Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to message queues. Following message queues are currently supported:","sidebar":"docsSidebar"},"concepts/structure":{"id":"concepts/structure","title":"Structure","description":"This document describes high-level code structure of the project. You\'ll find this part useful when you want to get started to contribute to Raccoon.","sidebar":"docsSidebar"},"contribute/contribution":{"id":"contribute/contribution","title":"Contribution Process","description":"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:","sidebar":"docsSidebar"},"contribute/development":{"id":"contribute/development","title":"Development Guide","description":"This guide is targeted at developers looking to contribute to Raccoon.","sidebar":"docsSidebar"},"contribute/release":{"id":"contribute/release","title":"Release Process","description":"For maintainers, please read the sections below as a guide to create a new release.","sidebar":"docsSidebar"},"guides/deployment":{"id":"guides/deployment","title":"Deployment","description":"This section contains guides and suggestions related to Raccoon deployment.","sidebar":"docsSidebar"},"guides/monitoring":{"id":"guides/monitoring","title":"Monitoring","description":"Raccoon provides monitoring for server connection, publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd and Prometheus","sidebar":"docsSidebar"},"guides/overview":{"id":"guides/overview","title":"Overview","description":"The following topics will describe how to manage Raccoon throughout its lifecycle.","sidebar":"docsSidebar"},"guides/publishing":{"id":"guides/publishing","title":"Publishing Events","description":"EndPoints","sidebar":"docsSidebar"},"guides/troubleshooting":{"id":"guides/troubleshooting","title":"Troubleshooting","description":"Scale Up Racoon","sidebar":"docsSidebar"},"introduction":{"id":"introduction","title":"Introduction","description":"Raccoon is a high-throughput, low-latency service that provides an API to ingest clickstream data from mobile apps and sites and publish it to a message queue for stream processing. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch \\\\(array\\\\) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.","sidebar":"docsSidebar"},"quickstart":{"id":"quickstart","title":"Quickstart","description":"This document will guide you on how to get Raccoon + Kafka setup running locally. This document assumes that you have Docker (with Docker Compose) and Kafka installed on your system.","sidebar":"docsSidebar"},"reference/benchmarks":{"id":"reference/benchmarks","title":"Benchmarks","description":"This page contains performance benchmarks for raccoon."},"reference/configurations":{"id":"reference/configurations","title":"Configurations","description":"This page contains reference for all the application configurations for Raccoon.","sidebar":"docsSidebar"},"reference/metrics":{"id":"reference/metrics","title":"Metrics","description":"Raccoon supports statsd and prometheus as two ways to report metrics. For statsd, we recommend using Telegraf as a collection agent.","sidebar":"docsSidebar"},"roadmap":{"id":"roadmap","title":"Roadmap","description":"In the following section, you can learn what features we\'re working on, what stage they\'re in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the discussions on the Raccoon Github forum.","sidebar":"docsSidebar"},"support":{"id":"support","title":"Need help?","description":"Need a bit of help? We\'re here for you. Check out our current issues, GitHub discussions, or get support through Slack."}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.8601da9a.js b/assets/js/935f2afb.8601da9a.js deleted file mode 100644 index 062ac3a6..00000000 --- a/assets/js/935f2afb.8601da9a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[53],{1109:function(e){e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docsSidebar":[{"type":"link","label":"Introduction","href":"/raccoon/","docId":"introduction"},{"type":"link","label":"Quickstart","href":"/raccoon/quickstart","docId":"quickstart"},{"type":"link","label":"Roadmap","href":"/raccoon/roadmap","docId":"roadmap"},{"type":"category","label":"Guides","items":[{"type":"link","label":"Overview","href":"/raccoon/guides/overview","docId":"guides/overview"},{"type":"link","label":"Publishing Events","href":"/raccoon/guides/publishing","docId":"guides/publishing"},{"type":"link","label":"Deployment","href":"/raccoon/guides/deployment","docId":"guides/deployment"},{"type":"link","label":"Monitoring","href":"/raccoon/guides/monitoring","docId":"guides/monitoring"},{"type":"link","label":"Troubleshooting","href":"/raccoon/guides/troubleshooting","docId":"guides/troubleshooting"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Concepts","items":[{"type":"link","label":"Architecture","href":"/raccoon/concepts/architecture","docId":"concepts/architecture"},{"type":"link","label":"Structure","href":"/raccoon/concepts/structure","docId":"concepts/structure"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Reference","items":[{"type":"link","label":"Configurations","href":"/raccoon/reference/configurations","docId":"reference/configurations"},{"type":"link","label":"Metrics","href":"/raccoon/reference/metrics","docId":"reference/metrics"}],"collapsed":false,"collapsible":true},{"type":"category","label":"Contribute","items":[{"type":"link","label":"Contribution Process","href":"/raccoon/contribute/contribution","docId":"contribute/contribution"},{"type":"link","label":"Development Guide","href":"/raccoon/contribute/development","docId":"contribute/development"},{"type":"link","label":"Release Process","href":"/raccoon/contribute/release","docId":"contribute/release"}],"collapsed":false,"collapsible":true},{"type":"link","label":"Roadmap","href":"/raccoon/roadmap","docId":"roadmap"}]},"docs":{"concepts/architecture":{"id":"concepts/architecture","title":"Architecture","description":"Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to Kafka. Raccoon supports websockets, REST and gRPC protocols for clients to send events. With wesockets it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websockets and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch \\\\(array\\\\) of events in protobuf format. Refer here for data definitions format that Raccoon accepts.","sidebar":"docsSidebar"},"concepts/structure":{"id":"concepts/structure","title":"Structure","description":"This document describes high-level code structure of the project. You\'ll find this part useful when you want to get started to contribute to Raccoon.","sidebar":"docsSidebar"},"contribute/contribution":{"id":"contribute/contribution","title":"Contribution Process","description":"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:","sidebar":"docsSidebar"},"contribute/development":{"id":"contribute/development","title":"Development Guide","description":"This guide is targeted at developers looking to contribute to Raccoon.","sidebar":"docsSidebar"},"contribute/release":{"id":"contribute/release","title":"Release Process","description":"For maintainers, please read the sections below as a guide to create a new release.","sidebar":"docsSidebar"},"guides/deployment":{"id":"guides/deployment","title":"Deployment","description":"This section contains guides and suggestions related to Raccoon deployment.","sidebar":"docsSidebar"},"guides/monitoring":{"id":"guides/monitoring","title":"Monitoring","description":"Raccoon provides monitoring for server connection, Kafka publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd protocol.","sidebar":"docsSidebar"},"guides/overview":{"id":"guides/overview","title":"Overview","description":"The following topics will describe how to manage Raccoon throughout its lifecycle.","sidebar":"docsSidebar"},"guides/publishing":{"id":"guides/publishing","title":"Publishing Events","description":"EndPoints","sidebar":"docsSidebar"},"guides/troubleshooting":{"id":"guides/troubleshooting","title":"Troubleshooting","description":"Scale Up Racoon","sidebar":"docsSidebar"},"introduction":{"id":"introduction","title":"Introduction","description":"Raccoon is high throughput, low-latency service that provides an API to ingest clickstream data from mobile apps; and sites and publish it to Kafka. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch \\\\(array\\\\) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.","sidebar":"docsSidebar"},"quickstart":{"id":"quickstart","title":"Quickstart","description":"This document will guide you to get Raccoon along with Kafka setup running locally. This document assumes that you have installed Docker and Kafka with host.docker.internal advertised on your machine.","sidebar":"docsSidebar"},"reference/benchmarks":{"id":"reference/benchmarks","title":"Benchmarks","description":"This page contains performance benchmarks for raccoon."},"reference/configurations":{"id":"reference/configurations","title":"Configurations","description":"This page contains reference for all the application configurations for Raccoon.","sidebar":"docsSidebar"},"reference/metrics":{"id":"reference/metrics","title":"Metrics","description":"Raccoon uses Statsd protocol as way to report metrics. You can capture the metrics using any supported statsd collector like Telegraf. This page contains reference for all the metrics for Raccoon.","sidebar":"docsSidebar"},"roadmap":{"id":"roadmap","title":"Roadmap","description":"In the following section, you can learn what features we\'re working on, what stage they\'re in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the discussions on the Raccoon Github forum.","sidebar":"docsSidebar"},"support":{"id":"support","title":"Need help?","description":"Need a bit of help? We\'re here for you. Check out our current issues, GitHub discussions, or get support through Slack."}}}')}}]); \ No newline at end of file diff --git a/assets/js/972.7d6af76f.js b/assets/js/972.7d6af76f.js deleted file mode 100644 index 80d9dbfa..00000000 --- a/assets/js/972.7d6af76f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[972],{4972:function(e,t,n){n.r(t),n.d(t,{default:function(){return i}});var a=n(7294),o=n(5999),l=n(1944),r=n(5257);function i(){return a.createElement(a.Fragment,null,a.createElement(l.d,{title:(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/assets/js/a09c2993.e261a802.js b/assets/js/a09c2993.e261a802.js new file mode 100644 index 00000000..1d183088 --- /dev/null +++ b/assets/js/a09c2993.e261a802.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[899],{5680:(e,t,r)=>{r.d(t,{xA:()=>u,yg:()=>m});var n=r(6540);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),g=a,m=p["".concat(c,".").concat(g)]||p[g]||d[g]||o;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=g;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:a,i[1]=s;for(var l=2;l<o;l++)i[l]=r[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}g.displayName="MDXCreateElement"},6740:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(8168),a=(r(6540),r(5680));const o={id:"introduction",slug:"/"},i="Introduction",s={unversionedId:"introduction",id:"introduction",title:"Introduction",description:"Raccoon is a high-throughput, low-latency service that provides an API to ingest clickstream data from mobile apps and sites and publish it to a message queue for stream processing. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch \\(array\\) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/",permalink:"/raccoon/",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",slug:"/"},sidebar:"docsSidebar",next:{title:"Quickstart",permalink:"/raccoon/quickstart"}},c={},l=[{value:"Key Features",id:"key-features",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Usage",id:"usage",level:2}],u={toc:l},p="wrapper";function d(e){let{components:t,...o}=e;return(0,a.yg)(p,(0,n.A)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"introduction"},"Introduction"),(0,a.yg)("p",null,"Raccoon is a high-throughput, low-latency service that provides an API to ingest clickstream data from mobile apps and sites and publish it to a message queue for stream processing. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch ","(","array",")"," of events in protobuf format. Refer ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/tree/main/raystack/raccoon"},"here")," for the protobuf definition format that Raccoon accepts."),(0,a.yg)("p",null,(0,a.yg)("img",{alt:"Overiew",src:r(7147).A,width:"622",height:"336"})),(0,a.yg)("h2",{id:"key-features"},"Key Features"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Event Agnostic")," - Raccoon API is event agnostic. This allows you to push any event with any schema."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Event Distribution")," - Events are distributed to message queue topics based on the event meta-data."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"High performance")," - Long-running persistent, peer-to-peer connection reduce connection set up overheads. Websocket provides reduced battery consumption for mobile apps ","(","based on usage statistics",")"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Guaranteed Event Delivery")," - Server acknowledgments based on delivery. Currently, it acknowledges failures/successes. Additionally, users can augment the server for zero-data loss or at-least-once guarantees."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Reduced payload sizes")," - Protobuf based"),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("strong",{parentName:"li"},"Metrics:")," - Built-in monitoring includes latency and active connections.")),(0,a.yg)("h2",{id:"use-cases"},"Use Cases"),(0,a.yg)("p",null,"Raccoon can be used as an event collector, event distributor, and forwarder of events generated from mobile/web/IoT front-ends as it provides a high volume, high throughput, low latency event-agnostic APIs. In addition, it can serve the needs of data ingestion in near-real-time. Some domains where Raccoon could be used are listed below."),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Adtech streams: Where users can ingest digital marketing data from external sources into the organization's backends"),(0,a.yg)("li",{parentName:"ul"},"Clickstream: Where apps can stream user behavior data in real-time"),(0,a.yg)("li",{parentName:"ul"},"Edge systems: Where devices ","(","say in the IoT world",")"," need to send data to the cloud."),(0,a.yg)("li",{parentName:"ul"},"Event Sourcing: Such as stock update dashboards, autonomous/self-drive use cases")),(0,a.yg)("h2",{id:"usage"},"Usage"),(0,a.yg)("p",null,"Explore the following resources to get started with Raccoon:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/guides/overview"},"Guides")," provide information on deployment and client samples."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/concepts/architecture"},"Concepts")," describe all important Raccoon concepts."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/reference/configurations"},"Reference")," contains details about configurations, metrics, and other aspects of Raccoon."),(0,a.yg)("li",{parentName:"ul"},(0,a.yg)("a",{parentName:"li",href:"/raccoon/contribute/contribution"},"Contribute")," contains resources for anyone who wants to contribute to Raccoon.")))}d.isMDXComponent=!0},7147:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/overview-1cc94b25597f055e7f611940bf8ab655.svg"}}]); \ No newline at end of file diff --git a/assets/js/a09c2993.f32be3e9.js b/assets/js/a09c2993.f32be3e9.js deleted file mode 100644 index 60793477..00000000 --- a/assets/js/a09c2993.f32be3e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[128],{3905:function(e,t,n){n.d(t,{Zo:function(){return l},kt:function(){return f}});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(n),f=a,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return n?r.createElement(m,i(i({ref:t},l),{},{components:n})):r.createElement(m,i({ref:t},l))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var u=2;u<o;u++)i[u]=n[u];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},8495:function(e,t,n){n.r(t),n.d(t,{assets:function(){return l},contentTitle:function(){return s},default:function(){return f},frontMatter:function(){return c},metadata:function(){return u},toc:function(){return d}});var r=n(7462),a=n(3366),o=(n(7294),n(3905)),i=["components"],c={id:"introduction",slug:"/"},s="Introduction",u={unversionedId:"introduction",id:"introduction",title:"Introduction",description:"Raccoon is high throughput, low-latency service that provides an API to ingest clickstream data from mobile apps; and sites and publish it to Kafka. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch \\(array\\) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/",permalink:"/raccoon/",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/introduction.md",tags:[],version:"current",frontMatter:{id:"introduction",slug:"/"},sidebar:"docsSidebar",next:{title:"Quickstart",permalink:"/raccoon/quickstart"}},l={},d=[{value:"Key Features",id:"key-features",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"Usage",id:"usage",level:2}],p={toc:d};function f(e){var t=e.components,c=(0,a.Z)(e,i);return(0,o.kt)("wrapper",(0,r.Z)({},p,c,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"Raccoon is high throughput, low-latency service that provides an API to ingest clickstream data from mobile apps; and sites and publish it to Kafka. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch ","(","array",")"," of events in protobuf format. Refer ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/tree/main/raystack/raccoon"},"here")," for the protobuf definition format that Raccoon accepts."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Overiew",src:n(4530).Z,width:"622",height:"336"})),(0,o.kt)("h2",{id:"key-features"},"Key Features"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Event Agnostic")," - Raccoon API is event agnostic. This allows you to push any event with any schema."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Event Distribution")," - Events are distributed to Kafka topics based on the event meta-data"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"High performance")," - Long-running persistent, peer-to-peer connection reduce connection set up overheads. Websocket provides reduced battery consumption for mobile apps ","(","based on usage statistics",")"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Guaranteed Event Delivery")," - Server acknowledgments based on delivery. Currently, it acknowledges failures/successes. Additionally, users can augment the server for zero-data loss or at-least-once guarantees."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Reduced payload sizes")," - Protobuf based"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Metrics:")," - Built-in monitoring includes latency and active connections.")),(0,o.kt)("h2",{id:"use-cases"},"Use Cases"),(0,o.kt)("p",null,"Raccoon can be used as an event collector, event distributor, and forwarder of events generated from mobile/web/IoT front-ends as it provides a high volume, high throughput, low latency event-agnostic APIs. In addition, it can serve the needs of data ingestion in near-real-time. Some domains where Raccoon could be used are listed below."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Adtech streams: Where users can ingest digital marketing data from external sources into the organization backends"),(0,o.kt)("li",{parentName:"ul"},"Clickstream: Where apps can stream user behavior data in real-time"),(0,o.kt)("li",{parentName:"ul"},"Edge systems: Where devices ","(","say in the IoT world",")"," need to send data to the cloud."),(0,o.kt)("li",{parentName:"ul"},"Event Sourcing: Such as Stock updates dashboards, autonomous/self-drive use cases")),(0,o.kt)("h2",{id:"usage"},"Usage"),(0,o.kt)("p",null,"Explore the following resources to get started with Raccoon:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/tree/48f454ac63a94d7c462d2146f115ba9a1789e1dc/docs/docs/guides/README.md"},"Guides")," provide information on deployment and client samples."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/tree/48f454ac63a94d7c462d2146f115ba9a1789e1dc/docs/docs/concepts/README.md"},"Concepts")," describe all important Raccoon concepts."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/tree/48f454ac63a94d7c462d2146f115ba9a1789e1dc/docs/docs/reference/README.md"},"Reference")," contains details about configurations, metrics, and other aspects of Raccoon."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/tree/48f454ac63a94d7c462d2146f115ba9a1789e1dc/docs/docs/contribute/contribution.md"},"Contribute")," contains resources for anyone who wants to contribute to Raccoon.")))}f.isMDXComponent=!0},4530:function(e,t,n){t.Z=n.p+"assets/images/overview-1cc94b25597f055e7f611940bf8ab655.svg"}}]); \ No newline at end of file diff --git a/assets/js/c5e4a08a.5a0c4a86.js b/assets/js/c5e4a08a.5a0c4a86.js new file mode 100644 index 00000000..3fdeef19 --- /dev/null +++ b/assets/js/c5e4a08a.5a0c4a86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[758],{5680:(e,n,o)=>{o.d(n,{xA:()=>u,yg:()=>h});var t=o(6540);function r(e,n,o){return n in e?Object.defineProperty(e,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[n]=o,e}function i(e,n){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),o.push.apply(o,t)}return o}function a(e){for(var n=1;n<arguments.length;n++){var o=null!=arguments[n]?arguments[n]:{};n%2?i(Object(o),!0).forEach((function(n){r(e,n,o[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):i(Object(o)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(o,n))}))}return e}function c(e,n){if(null==e)return{};var o,t,r=function(e,n){if(null==e)return{};var o,t,r={},i=Object.keys(e);for(t=0;t<i.length;t++)o=i[t],n.indexOf(o)>=0||(r[o]=e[o]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)o=i[t],n.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=t.createContext({}),l=function(e){var n=t.useContext(s),o=n;return e&&(o="function"==typeof e?e(n):a(a({},n),e)),o},u=function(e){var n=l(e.components);return t.createElement(s.Provider,{value:n},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},g=t.forwardRef((function(e,n){var o=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(o),g=r,h=p["".concat(s,".").concat(g)]||p[g]||d[g]||i;return o?t.createElement(h,a(a({ref:n},u),{},{components:o})):t.createElement(h,a({ref:n},u))}));function h(e,n){var o=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=o.length,a=new Array(i);a[0]=g;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c[p]="string"==typeof e?e:r,a[1]=c;for(var l=2;l<i;l++)a[l]=o[l];return t.createElement.apply(null,a)}return t.createElement.apply(null,o)}g.displayName="MDXCreateElement"},8567:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var t=o(8168),r=(o(6540),o(5680));const i={},a="Overview",c={unversionedId:"guides/overview",id:"guides/overview",title:"Overview",description:"The following topics will describe how to manage Raccoon throughout its lifecycle.",source:"@site/docs/guides/overview.md",sourceDirName:"guides",slug:"/guides/overview",permalink:"/raccoon/guides/overview",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Roadmap",permalink:"/raccoon/roadmap"},next:{title:"Publishing Events",permalink:"/raccoon/guides/publishing"}},s={},l=[{value:"Publishing Events",id:"publishing-events",level:3},{value:"Deploying Raccoon",id:"deploying-raccoon",level:3},{value:"Monitoring Raccoon with exposed metrics",id:"monitoring-raccoon-with-exposed-metrics",level:3},{value:"Troubleshooting Raccoon",id:"troubleshooting-raccoon",level:3}],u={toc:l},p="wrapper";function d(e){let{components:n,...o}=e;return(0,r.yg)(p,(0,t.A)({},u,o,{components:n,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"overview"},"Overview"),(0,r.yg)("p",null,"The following topics will describe how to manage Raccoon throughout its lifecycle."),(0,r.yg)("h3",{id:"publishing-events"},(0,r.yg)("a",{parentName:"h3",href:"/raccoon/guides/publishing"},"Publishing Events")),(0,r.yg)("p",null,"Raccoon is designed to handle any type of event. This section contains step by step guide on how to publish events to Raccoon through the API interface."),(0,r.yg)("h3",{id:"deploying-raccoon"},(0,r.yg)("a",{parentName:"h3",href:"/raccoon/guides/deployment"},"Deploying Raccoon")),(0,r.yg)("p",null,"Raccoon can run inside VMs or containers in a fully managed runtime environment like Kubernetes. This section contains guides, best practices, and advice related to deploying Raccoon in production."),(0,r.yg)("h3",{id:"monitoring-raccoon-with-exposed-metrics"},(0,r.yg)("a",{parentName:"h3",href:"/raccoon/guides/deployment"},"Monitoring Raccoon with exposed metrics")),(0,r.yg)("p",null,"Always know what\u2019s going on with your deployment with built-in ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/raystack/firehose/blob/main/docs/assets/firehose-grafana-dashboard.json"},"monitoring")," of throughput, response times, errors and more. This section contains guides, best practices, and advice related to managing Raccoon in production."),(0,r.yg)("h3",{id:"troubleshooting-raccoon"},(0,r.yg)("a",{parentName:"h3",href:"/raccoon/guides/troubleshooting"},"Troubleshooting Raccoon")),(0,r.yg)("p",null,"Raccoon scales in an instant, both vertically and horizontally for high-performance event ingestion. This section contains guides, best practices, and advice related to troubleshooting issues with Raccoon in production."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c5e4a08a.7f8ec798.js b/assets/js/c5e4a08a.7f8ec798.js deleted file mode 100644 index 1d948ac0..00000000 --- a/assets/js/c5e4a08a.7f8ec798.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[266],{3905:function(e,n,t){t.d(n,{Zo:function(){return u},kt:function(){return g}});var o=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,o)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?i(Object(t),!0).forEach((function(n){r(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function c(e,n){if(null==e)return{};var t,o,r=function(e,n){if(null==e)return{};var t,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)t=i[o],n.indexOf(t)>=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)t=i[o],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=o.createContext({}),l=function(e){var n=o.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},u=function(e){var n=l(e.components);return o.createElement(s.Provider,{value:n},e.children)},p={inlineCode:"code",wrapper:function(e){var n=e.children;return o.createElement(o.Fragment,{},n)}},d=o.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(t),g=r,f=d["".concat(s,".").concat(g)]||d[g]||p[g]||i;return t?o.createElement(f,a(a({ref:n},u),{},{components:t})):o.createElement(f,a({ref:n},u))}));function g(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,a=new Array(i);a[0]=d;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var l=2;l<i;l++)a[l]=t[l];return o.createElement.apply(null,a)}return o.createElement.apply(null,t)}d.displayName="MDXCreateElement"},4967:function(e,n,t){t.r(n),t.d(n,{assets:function(){return u},contentTitle:function(){return s},default:function(){return g},frontMatter:function(){return c},metadata:function(){return l},toc:function(){return p}});var o=t(7462),r=t(3366),i=(t(7294),t(3905)),a=["components"],c={},s="Overview",l={unversionedId:"guides/overview",id:"guides/overview",title:"Overview",description:"The following topics will describe how to manage Raccoon throughout its lifecycle.",source:"@site/docs/guides/overview.md",sourceDirName:"guides",slug:"/guides/overview",permalink:"/raccoon/guides/overview",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/overview.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Roadmap",permalink:"/raccoon/roadmap"},next:{title:"Publishing Events",permalink:"/raccoon/guides/publishing"}},u={},p=[{value:'Publishing Events <a id="creating-firehose"></a>',id:"publishing-events-",level:3},{value:'Deploying Raccoon <a id="deploying-firehose"></a>',id:"deploying-raccoon-",level:3},{value:'Monitoring Raccoon with exposed metrics <a id="monitoring-firehose-with-exposed-metrics"></a>',id:"monitoring-raccoon-with-exposed-metrics-",level:3},{value:'Troubleshooting Raccoon <a id="troubleshooting-firehose"></a>',id:"troubleshooting-raccoon-",level:3}],d={toc:p};function g(e){var n=e.components,t=(0,r.Z)(e,a);return(0,i.kt)("wrapper",(0,o.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"overview"},"Overview"),(0,i.kt)("p",null,"The following topics will describe how to manage Raccoon throughout its lifecycle."),(0,i.kt)("h3",{id:"publishing-events-"},"Publishing Events ",(0,i.kt)("a",{id:"creating-firehose"})),(0,i.kt)("p",null,"Raccoon is designed to handle any type of event. This section contains step by step guide on how to publish events to Raccoon through the API interface."),(0,i.kt)("p",null,'{% page-ref page="publishing.md" %}'),(0,i.kt)("h3",{id:"deploying-raccoon-"},"Deploying Raccoon ",(0,i.kt)("a",{id:"deploying-firehose"})),(0,i.kt)("p",null,"Raccoon can run inside VMs or containers in a fully managed runtime environment like Kubernetes. This section contains guides, best practices, and advice related to deploying Raccoon in production."),(0,i.kt)("p",null,'{% page-ref page="deployment.md" %}'),(0,i.kt)("h3",{id:"monitoring-raccoon-with-exposed-metrics-"},"Monitoring Raccoon with exposed metrics ",(0,i.kt)("a",{id:"monitoring-firehose-with-exposed-metrics"})),(0,i.kt)("p",null,"Always know what\u2019s going on with your deployment with built-in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/raystack/firehose/blob/main/docs/assets/firehose-grafana-dashboard.json"},"monitoring")," of throughput, response times, errors and more. This section contains guides, best practices, and advice related to managing Raccoon in production."),(0,i.kt)("p",null,'{% page-ref page="monitoring.md" %}'),(0,i.kt)("h3",{id:"troubleshooting-raccoon-"},"Troubleshooting Raccoon ",(0,i.kt)("a",{id:"troubleshooting-firehose"})),(0,i.kt)("p",null,"Raccoon scales in an instant, both vertically and horizontally for high-performance event ingestion. This section contains guides, best practices, and advice related to troubleshooting issues with Raccoon in production."),(0,i.kt)("p",null,'{% page-ref page="troubleshooting.md" %}'))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/caaf7770.1f2988c7.js b/assets/js/caaf7770.1f2988c7.js new file mode 100644 index 00000000..c99d33e2 --- /dev/null +++ b/assets/js/caaf7770.1f2988c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[669],{5680:(e,n,t)=>{t.d(n,{xA:()=>p,yg:()=>d});var a=t(6540);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function s(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?r(Object(t),!0).forEach((function(n){o(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function l(e,n){if(null==e)return{};var t,a,o=function(e,n){if(null==e)return{};var t,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)t=r[a],n.indexOf(t)>=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)t=r[a],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var i=a.createContext({}),c=function(e){var n=a.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):s(s({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(i.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},g=a.forwardRef((function(e,n){var t=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(t),g=o,d=u["".concat(i,".").concat(g)]||u[g]||m[g]||r;return t?a.createElement(d,s(s({ref:n},p),{},{components:t})):a.createElement(d,s({ref:n},p))}));function d(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var r=t.length,s=new Array(r);s[0]=g;var l={};for(var i in n)hasOwnProperty.call(n,i)&&(l[i]=n[i]);l.originalType=e,l[u]="string"==typeof e?e:o,s[1]=l;for(var c=2;c<r;c++)s[c]=t[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,t)}g.displayName="MDXCreateElement"},9365:(e,n,t)=>{t.d(n,{A:()=>s});var a=t(6540),o=t(53);const r={tabItem:"tabItem_Ymn6"};function s(e){let{children:n,hidden:t,className:s}=e;return a.createElement("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,s),hidden:t},n)}},4865:(e,n,t)=>{t.d(n,{A:()=>m});var a=t(8168),o=t(6540),r=t(53),s=t(2303),l=t(1682),i=t(4595),c=t(3104);const p={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function u(e){var n;const{lazy:t,block:s,defaultValue:u,values:m,groupId:g,className:d}=e,y=o.Children.map(e.children,(e=>{if((0,o.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})),h=m??y.map((e=>{let{props:{value:n,label:t,attributes:a}}=e;return{value:n,label:t,attributes:a}})),f=(0,l.X)(h,((e,n)=>e.value===n.value));if(f.length>0)throw new Error(`Docusaurus error: Duplicate values "${f.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`);const b=null===u?u:u??(null==(n=y.find((e=>e.props.default)))?void 0:n.props.value)??y[0].props.value;if(null!==b&&!h.some((e=>e.value===b)))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${b}" but none of its children has the corresponding value. Available values are: ${h.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);const{tabGroupChoices:v,setTabGroupChoices:_}=(0,i.x)(),[N,k]=(0,o.useState)(b),T=[],{blockElementScrollPositionUntilNextRender:E}=(0,c.a_)();if(null!=g){const e=v[g];null!=e&&e!==N&&h.some((n=>n.value===e))&&k(e)}const w=e=>{const n=e.currentTarget,t=T.indexOf(n),a=h[t].value;a!==N&&(E(n),k(a),null!=g&&_(g,String(a)))},R=e=>{var n;let t=null;switch(e.key){case"ArrowRight":{const n=T.indexOf(e.currentTarget)+1;t=T[n]??T[0];break}case"ArrowLeft":{const n=T.indexOf(e.currentTarget)-1;t=T[n]??T[T.length-1];break}}null==(n=t)||n.focus()};return o.createElement("div",{className:(0,r.A)("tabs-container",p.tabList)},o.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":s},d)},h.map((e=>{let{value:n,label:t,attributes:s}=e;return o.createElement("li",(0,a.A)({role:"tab",tabIndex:N===n?0:-1,"aria-selected":N===n,key:n,ref:e=>T.push(e),onKeyDown:R,onFocus:w,onClick:w},s,{className:(0,r.A)("tabs__item",p.tabItem,null==s?void 0:s.className,{"tabs__item--active":N===n})}),t??n)}))),t?(0,o.cloneElement)(y.filter((e=>e.props.value===N))[0],{className:"margin-top--md"}):o.createElement("div",{className:"margin-top--md"},y.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==N})))))}function m(e){const n=(0,s.A)();return o.createElement(u,(0,a.A)({key:String(n)},e))}},2163:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var a=t(8168),o=(t(6540),t(5680)),r=t(4865),s=t(9365);const l={},i="Deployment",c={unversionedId:"guides/deployment",id:"guides/deployment",title:"Deployment",description:"This section contains guides and suggestions related to Raccoon deployment.",source:"@site/docs/guides/deployment.md",sourceDirName:"guides",slug:"/guides/deployment",permalink:"/raccoon/guides/deployment",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/deployment.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Publishing Events",permalink:"/raccoon/guides/publishing"},next:{title:"Monitoring",permalink:"/raccoon/guides/monitoring"}},p={},u=[{value:"Kubernetes",id:"kubernetes",level:2},{value:"Manifest",id:"manifest",level:3},{value:"Helm",id:"helm",level:3},{value:"Production Checklist",id:"production-checklist",level:2},{value:"Key Configurations",id:"key-configurations",level:3}],m={toc:u},g="wrapper";function d(e){let{components:n,...t}=e;return(0,o.yg)(g,(0,a.A)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"deployment"},"Deployment"),(0,o.yg)("p",null,"This section contains guides and suggestions related to Raccoon deployment."),(0,o.yg)("h2",{id:"kubernetes"},"Kubernetes"),(0,o.yg)("p",null,"Using ",(0,o.yg)("a",{parentName:"p",href:"https://hub.docker.com/r/raystack/raccoon"},"Raccoon docker image"),", you can deploy Raccoon on ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/"},"Kubernetes")," by specifying the image on the ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-a-deployment"},"manifest"),". We also provide ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/charts/tree/main/stable/raccoon"},"Helm chart")," to ease Kubernetes deployment. In this section we will cover simple deployment on Kubernetes using manifest and Helm."),(0,o.yg)("h3",{id:"manifest"},"Manifest"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Prerequisite")),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Kubernetes cluster setup"),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("a",{parentName:"li",href:"https://kubernetes.io/docs/tasks/tools/#kubectl"},"Kubectl")," installed")),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Creating Kubernetes Resources")," You need at least 2 manifests for Raccoon. For ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/deployment"},"deployment")," and for ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/"},"configmap"),". Prepare both manifest as YAML file. You can fill in the configuration as needed."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="configmap.yml"',title:'"configmap.yml"'},'apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: raccoon-config\n namespace: default\n labels:\n application: raccoon\ndata:\n PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "host.docker.internal:9093"\n SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"\n SERVER_WEBSOCKET_PORT: "8080"\n\n # depending on what monitoring stack you wish to use\n # you can remove the statsd or prometheus config below\n METRIC_STATSD_ENABLED: true\n METRIC_STATSD_ADDRESS: "host.docker.internal:8125"\n METRIC_PROMETHEUS_ENABLED: true\n METRIC_PROMETHEUS_PORT: "9090"\n\n')),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="deployment.yaml"',title:'"deployment.yaml"'},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: raccoon\n labels:\n application: raccoon\nspec:\n replicas: 1\n selector:\n matchLabels:\n application: raccoon\n template:\n metadata:\n labels:\n application: raccoon\n annotations:\n # these are only necessary if you plan to use prometheus\n # to collect metrics from raccoon. See \"Setting up monitoring\" below\n # for more information.\n prometheus.io/scrape: 'true'\n prometheus.io/path: 'metrics'\n prometheus.io/port: '9090'\n spec:\n containers:\n - name: raccoon\n image: \"raystack/raccoon:latest\"\n imagePullPolicy: IfNotPresent\n resources:\n limits:\n cpu: 200m\n memory: 512Mi\n requests:\n cpu: 200m\n memory: 512Mi\n envFrom:\n - configMapRef:\n name: raccoon-config\n env:\n - name: POD_NAME\n valueFrom:\n fieldRef:\n fieldPath: metadata.name\n - name: NODE_NAME\n valueFrom:\n fieldRef:\n fieldPath: spec.nodeName\n\n")),(0,o.yg)("p",null,"Suppose you save them as ",(0,o.yg)("inlineCode",{parentName:"p"},"configmap.yaml")," and ",(0,o.yg)("inlineCode",{parentName:"p"},"deployment.yaml"),". The next step is to apply the manifests to the Kubernetes cluster using ",(0,o.yg)("inlineCode",{parentName:"p"},"kubectl")," command."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -f configmap.yaml -f deployment.yaml\n")),(0,o.yg)("p",null,"You'll find the resources are created. To see the status of the deployment, you can run following commands."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"# Check deployment status\n$ kubectl get deployment raccoon\n# Check configmap status\n$ kubectl get configmap raccoon-config\n")),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Configuration")," You can add or modify the configurations inside ",(0,o.yg)("inlineCode",{parentName:"p"},"configmap.yaml")," above. However, when you change the configmap, you also need to restart the deployment."),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Exposing Raccoon")," To make Raccoon accessible to the public, you need to setup the Kubernetes ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/service/"},"service")," and ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/"},"ingress"),". This setup may vary according to your need. There is plenty ",(0,o.yg)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"},"ingress controller")," you can choose. But first, you need to make sure that Websocket works with your choice of ingress controller."),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Setting up monitoring")),(0,o.yg)("p",null,"Raccoon supports ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/statsd/statsd"},"statsd")," and ",(0,o.yg)("a",{parentName:"p",href:"https://prometheus.io/"},"prometheus")," as monitoring backends. The following section will guide on how to setup each of these."),(0,o.yg)(r.A,{mdxType:"Tabs"},(0,o.yg)(s.A,{value:"statsd",mdxType:"TabItem"},(0,o.yg)("p",null,"The recommended way of interfacing with statsd is to use ",(0,o.yg)("a",{parentName:"p",href:"https://www.influxdata.com/time-series-platform/telegraf/"},"telegraf"),".\ntelegraf is the open source server agent to help you collect metrics from your applications and push them to different data sources."),(0,o.yg)("p",null,"There are 2 options to integrate with Telegraf. One is to have Telegraf as a separate service and another is to have Telegraf as a sidecar. To have telegraf as a sidecar, you only need to add another configmap and another Telegraf container on the deployment above. You can add the container under ",(0,o.yg)("inlineCode",{parentName:"p"},"spec.template.spec.containers"),". Then, you can use default ",(0,o.yg)("inlineCode",{parentName:"p"},"METRIC_STATSD_ADDRESS")," which is ",(0,o.yg)("inlineCode",{parentName:"p"},":8125"),". Following is an example of Telegraf manifests that push to Influxdb."),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="deployment.yaml"',title:'"deployment.yaml"'},"\n---\ncontainers:\n - image: telegraf:1.7.4-alpine\n imagePullPolicy: IfNotPresent\n name: telegrafd\n resources:\n limits:\n cpu: 50m\n memory: 64Mi\n requests:\n cpu: 50m\n memory: 64Mi\n volumeMounts:\n - mountPath: /etc/telegraf\n name: telegraf-conf\nvolumes:\n - configMap:\n defaultMode: 420\n name: test-raccoon-telegraf-config\n name: telegraf-conf\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="telegraf-conf.yaml"',title:'"telegraf-conf.yaml"'},'apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: telegraf-conf\n namespace: default\ndata:\n telegraf.conf: |\n [global_tags]\n app = "test-raccoon"\n [agent]\n collection_jitter = "0s"\n debug = false\n flush_interval = "10s"\n flush_jitter = "0s"\n interval = "10s"\n logfile = ""\n metric_batch_size = 1000\n metric_buffer_limit = 10000\n omit_hostname = false\n precision = ""\n quiet = false\n round_interval = true\n [[outputs.influxdb]]\n urls = ["http://localhost:8086"]\n database = "test-db"\n retention_policy = "autogen"\n write_consistency = "any"\n timeout = "5s"\n [[inputs.statsd]]\n allowed_pending_messages = 10000\n delete_counters = true\n delete_gauges = true\n delete_sets = true\n delete_timings = true\n metric_separator = "."\n parse_data_dog_tags = true\n percentile_limit = 1000\n percentiles = [\n 50,\n 95,\n 99\n ]\n service_address = ":8125"\n'))),(0,o.yg)(s.A,{value:"prometheus",mdxType:"TabItem"},(0,o.yg)("p",null,"You can run prometheus as a seperate service on your kubernetes cluster and configure it to scrape the metrics from your raccoon deployment."),(0,o.yg)("p",null,"Here's an example setup:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="prometheus-conf.yaml"',title:'"prometheus-conf.yaml"'},"apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: prometheus-config\n labels:\n app: prometheus\ndata:\n prometheus.yml: |\n global:\n scrape_interval: 15s\n evaluation_interval: 15s\n scrape_configs:\n - job_name: 'kubernetes-pods'\n kubernetes_sd_configs:\n - role: pod\n relabel_configs:\n - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n action: keep\n regex: true\n - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]\n action: replace\n target_label: __metrics_path__\n regex: (.+)\n replacement: ${1}\n - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]\n action: replace\n target_label: __address__\n regex: (.+):(?:\\d+);(\\d+)\n replacement: ${1}:${2}\n\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="prometheus-deployment.yaml"',title:'"prometheus-deployment.yaml"'},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: prometheus\n labels:\n app: prometheus\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: prometheus\n template:\n metadata:\n labels:\n app: prometheus\n spec:\n serviceAccountName: prometheus\n containers:\n - name: prometheus\n image: prom/prometheus:latest\n args:\n - --config.file=/etc/prometheus/prometheus.yml\n - --storage.tsdb.path=/prometheus/\n ports:\n - containerPort: 9090\n volumeMounts:\n - name: prometheus-config-volume\n mountPath: /etc/prometheus/\n volumes:\n - name: prometheus-config-volume\n configMap:\n name: prometheus-config\n\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="prometheus-service-account.yml"',title:'"prometheus-service-account.yml"'},"apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: prometheus\n labels:\n app: prometheus\n\n")),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="prometheus-cluster-role.yml"',title:'"prometheus-cluster-role.yml"'},'apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n name: prometheus\nrules:\n- apiGroups: [""]\n resources:\n - nodes\n - nodes/proxy\n - services\n - endpoints\n - pods\n verbs: ["get", "list", "watch"]\n\n')),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-yaml",metastring:'title="prometheus-cluster-role-binding.yml"',title:'"prometheus-cluster-role-binding.yml"'},"apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n name: prometheus\nroleRef:\n apiGroup: rbac.authorization.k8s.io\n kind: ClusterRole\n name: prometheus\nsubjects:\n- kind: ServiceAccount\n name: prometheus\n namespace: default\n\n")),(0,o.yg)("p",null,"Create these files on your local system that's configured to talk to your Kubernetes cluster, then deploy prometheus by running:"),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -f prometheus-service-account.yml\n$ kubectl apply -f prometheus-cluster-role-binding.yml\n$ kubectl apply -f prometheus-cluster-role.yml\n$ kubectl apply -f prometheus-conf.yml\n$ kubectl apply -f prometheus-deployment.yml\n")),(0,o.yg)("p",null,"This setups uses prometheus's ",(0,o.yg)("a",{parentName:"p",href:"https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config"},"kubernetes_sd_config"),", which is a feature that allows prometheus to leverage service discovery to find the pods that you wish to scrape metrics from."))),(0,o.yg)("h3",{id:"helm"},"Helm"),(0,o.yg)("p",null,(0,o.yg)("strong",{parentName:"p"},"Prerequisite")),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},"Kubernetes cluster setup"),(0,o.yg)("li",{parentName:"ul"},"Helm installed")),(0,o.yg)("p",null,"Raccoon has a Helm chart maintained on ",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/charts/tree/main/stable/raccoon"},"different repository"),". Refer to the repository for a complete deployment guide."),(0,o.yg)("h2",{id:"production-checklist"},"Production Checklist"),(0,o.yg)("p",null,"Before going to production, we recommend the following setup tips."),(0,o.yg)("h3",{id:"key-configurations"},"Key Configurations"),(0,o.yg)("p",null,"Followings are main configurations closely related to deployment that you need to pay attention:"),(0,o.yg)("ul",null,(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#server_websocket_port"},(0,o.yg)("inlineCode",{parentName:"a"},"SERVER_WEBSOCKET_PORT")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#event_distribution_publisher_pattern"},(0,o.yg)("inlineCode",{parentName:"a"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#publisher_kafka_client_bootstrap_servers"},(0,o.yg)("inlineCode",{parentName:"a"},"PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#metric_statsd_address"},(0,o.yg)("inlineCode",{parentName:"a"},"METRIC_STATSD_ADDRESS")))),(0,o.yg)("li",{parentName:"ul"},(0,o.yg)("p",{parentName:"li"},(0,o.yg)("a",{parentName:"p",href:"/raccoon/reference/configurations#server_websocket_conn_id_header"},(0,o.yg)("inlineCode",{parentName:"a"},"SERVER_WEBSOCKET_CONN_ID_HEADER"))),(0,o.yg)("p",{parentName:"li"},(0,o.yg)("strong",{parentName:"p"},"TLS/HTTPS")),(0,o.yg)("p",{parentName:"li"},"Raccoon doesn't provide HTTPS on the application level. To enable HTTPS, you can maintain API gateway which terminates SSL connection. From API gateway onward, the connection is considered to be safe. For example, if you are deploying on Kubernetes, you can have an ingress setup and have SSL termination."),(0,o.yg)("p",{parentName:"li"},(0,o.yg)("strong",{parentName:"p"},"Authentication")),(0,o.yg)("p",{parentName:"li"},"Raccoon doesn't provide authentication on its own. However, you can still enable authentication by having it as a separate service. Then, you can use an API gateway to validate the authentication using a token."),(0,o.yg)("p",{parentName:"li"},(0,o.yg)("strong",{parentName:"p"},"Test The Setup")),(0,o.yg)("p",{parentName:"li"},"To make sure the deployment can handle the load, you need to test it with the same number of connections and request you are expecting. You can find a guide on how to publish events ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/guides/publishing"},"here"),". You can also check client example ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/quickstart##publishing-your-first-event"},"here"),". If there is something wrong with Raccoon, you can check the ",(0,o.yg)("a",{parentName:"p",href:"/raccoon/guides/troubleshooting"},"troubleshooting")," section."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/caaf7770.85207c38.js b/assets/js/caaf7770.85207c38.js deleted file mode 100644 index 367c1d95..00000000 --- a/assets/js/caaf7770.85207c38.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[119],{3905:function(e,t,n){n.d(t,{Zo:function(){return p},kt:function(){return d}});var a=n(7294);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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},r=Object.keys(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a<r.length;a++)n=r[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(n),d=o,f=m["".concat(l,".").concat(d)]||m[d]||u[d]||r;return n?a.createElement(f,i(i({ref:t},p),{},{components:n})):a.createElement(f,i({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var c=2;c<r;c++)i[c]=n[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},5667:function(e,t,n){n.r(t),n.d(t,{assets:function(){return p},contentTitle:function(){return l},default:function(){return d},frontMatter:function(){return s},metadata:function(){return c},toc:function(){return u}});var a=n(7462),o=n(3366),r=(n(7294),n(3905)),i=["components"],s={},l="Deployment",c={unversionedId:"guides/deployment",id:"guides/deployment",title:"Deployment",description:"This section contains guides and suggestions related to Raccoon deployment.",source:"@site/docs/guides/deployment.md",sourceDirName:"guides",slug:"/guides/deployment",permalink:"/raccoon/guides/deployment",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/guides/deployment.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Publishing Events",permalink:"/raccoon/guides/publishing"},next:{title:"Monitoring",permalink:"/raccoon/guides/monitoring"}},p={},u=[{value:"Kubernetes",id:"kubernetes",level:2},{value:"Manifest",id:"manifest",level:3},{value:"Helm",id:"helm",level:3},{value:"Production Checklist",id:"production-checklist",level:2},{value:"Key Configurations",id:"key-configurations",level:3}],m={toc:u};function d(e){var t=e.components,n=(0,o.Z)(e,i);return(0,r.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"deployment"},"Deployment"),(0,r.kt)("p",null,"This section contains guides and suggestions related to Raccoon deployment."),(0,r.kt)("h2",{id:"kubernetes"},"Kubernetes"),(0,r.kt)("p",null,"Using ",(0,r.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/raystack/raccoon"},"Raccoon docker image"),", you can deploy Raccoon on ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/"},"Kubernetes")," by specifying the image on the ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-a-deployment"},"manifest"),". We also provide ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/charts/tree/main/stable/raccoon"},"Helm chart")," to ease Kubernetes deployment. In this section we will cover simple deployment on Kubernetes using manifest and Helm."),(0,r.kt)("h3",{id:"manifest"},"Manifest"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Prerequisite")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Kubernetes cluster setup"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/tasks/tools/#kubectl"},"Kubectl")," installed")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Creating Kubernetes Resources")," You need at least 2 manifests for Raccoon. For ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/deployment"},"deployment")," and for ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/"},"configmap"),". Prepare both manifest as YAML file. You can fill in the configuration as needed."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"configmap.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: raccoon-config\n namespace: default\n labels:\n application: raccoon\ndata:\n METRIC_STATSD_ADDRESS: "host.docker.internal:8125"\n PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "host.docker.internal:9093"\n SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"\n SERVER_WEBSOCKET_PORT: "8080"\n')),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"deployment.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: raccoon\n labels:\n application: raccoon\nspec:\n replicas: 1\n selector:\n matchLabels:\n application: raccoon\n template:\n metadata:\n labels:\n application: raccoon\n spec:\n containers:\n - name: raccoon\n image: "raystack/raccoon:latest"\n imagePullPolicy: IfNotPresent\n resources:\n limits:\n cpu: 200m\n memory: 512Mi\n requests:\n cpu: 200m\n memory: 512Mi\n envFrom:\n - configMapRef:\n name: raccoon-config\n env:\n - name: POD_NAME\n valueFrom:\n fieldRef:\n fieldPath: metadata.name\n - name: NODE_NAME\n valueFrom:\n fieldRef:\n fieldPath: spec.nodeName\n volumes:\n')),(0,r.kt)("p",null,"Suppose you save them as ",(0,r.kt)("inlineCode",{parentName:"p"},"configmap.yaml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"deployment.yaml"),". The next step is to apply the manifests to the Kubeenetes cluster using ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl")," command."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ kubectl apply -f configmap.yaml -f deployment.yaml\n")),(0,r.kt)("p",null,"You'll find the resources are created. To see the status of the deployment, you can run following commands."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Check deployment status\n$ kubectl get deployment raccoon\n# Check configmap status\n$ kubectl get configmap raccoon-config\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Configuration")," You can add or modify the configurations inside ",(0,r.kt)("inlineCode",{parentName:"p"},"configmap.yaml")," above. However, when you change the configmap, you also need to restart the deployment."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Exposing Raccoon")," To make Raccoon accessible to the public, you need to setup the Kubernetes ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/service/"},"service")," and ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress/"},"ingress"),". This setup may vary according to your need. There is plenty ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/"},"ingress controller")," you can choose. But first, you need to make sure that Websocket works with your choice of ingress controller."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Integrating With Telegraf")," There are 2 options to integrate with Telegraf. One is to have Telegraf as separate service another is to have Telegraf as a sidecar. To have telegraf as a sidecar, you only need to add another configmap and another Telegraf container on the deployment above. You can add the container under ",(0,r.kt)("inlineCode",{parentName:"p"},"spec.template.spec.containers"),". Then, you can use default ",(0,r.kt)("inlineCode",{parentName:"p"},"METRIC_STATSD_ADDRESS")," which is ",(0,r.kt)("inlineCode",{parentName:"p"},":8125"),". Following is an example of Telegraf manifests that push to Influxdb."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"deployment.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"\n---\ncontainers:\n - image: telegraf:1.7.4-alpine\n imagePullPolicy: IfNotPresent\n name: telegrafd\n resources:\n limits:\n cpu: 50m\n memory: 64Mi\n requests:\n cpu: 50m\n memory: 64Mi\n volumeMounts:\n - mountPath: /etc/telegraf\n name: telegraf-conf\nvolumes:\n - configMap:\n defaultMode: 420\n name: test-raccoon-telegraf-config\n name: telegraf-conf\n")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"telegraf-conf.yaml")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: telegraf-conf\n namespace: default\ndata:\n telegraf.conf: |\n [global_tags]\n app = "test-raccoon"\n [agent]\n collection_jitter = "0s"\n debug = false\n flush_interval = "10s"\n flush_jitter = "0s"\n interval = "10s"\n logfile = ""\n metric_batch_size = 1000\n metric_buffer_limit = 10000\n omit_hostname = false\n precision = ""\n quiet = false\n round_interval = true\n [[outputs.influxdb]]\n urls = ["http://localhost:8086"]\n database = "test-db"\n retention_policy = "autogen"\n write_consistency = "any"\n timeout = "5s"\n [[inputs.statsd]]\n allowed_pending_messages = 10000\n delete_counters = true\n delete_gauges = true\n delete_sets = true\n delete_timings = true\n metric_separator = "."\n parse_data_dog_tags = true\n percentile_limit = 1000\n percentiles = [\n 50,\n 95,\n 99\n ]\n service_address = ":8125"\n')),(0,r.kt)("h3",{id:"helm"},"Helm"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Prerequisite")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Kubernetes cluster setup"),(0,r.kt)("li",{parentName:"ul"},"Helm installed")),(0,r.kt)("p",null,"Raccoon has a Helm chart maintained on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/charts/tree/main/stable/raccoon"},"different repository"),". Refer to the repository for a complete deployment guide."),(0,r.kt)("h2",{id:"production-checklist"},"Production Checklist"),(0,r.kt)("p",null,"Before going to production, we recommend the following setup tips."),(0,r.kt)("h3",{id:"key-configurations"},"Key Configurations"),(0,r.kt)("p",null,"Followings are main configurations closely related to deployment that you need to pay attention:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#server_websocket_port"},(0,r.kt)("inlineCode",{parentName:"a"},"SERVER_WEBSOCKET_PORT")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#event_distribution_publisher_pattern"},(0,r.kt)("inlineCode",{parentName:"a"},"EVENT_DISTRIBUTION_PUBLISHER_PATTERN")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#publisher_kafka_client_bootstrap_servers"},(0,r.kt)("inlineCode",{parentName:"a"},"PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#metric_statsd_address"},(0,r.kt)("inlineCode",{parentName:"a"},"METRIC_STATSD_ADDRESS")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/reference/configurations#server_websocket_conn_id_header"},(0,r.kt)("inlineCode",{parentName:"a"},"SERVER_WEBSOCKET_CONN_ID_HEADER"))),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"TLS/HTTPS")),(0,r.kt)("p",{parentName:"li"},"Raccoon doesn't provide HTTPS on the application level. To enable HTTPS, you can maintain API gateway which terminates SSL connection. From API gateway onward, the connection is considered to be safe. For example, if you are deploying on Kubernetes, you can have an ingress setup and have SSL termination."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Authentication")),(0,r.kt)("p",{parentName:"li"},"Raccoon doesn't provide authentication on its own. However, you can still enable authentication by having it as a separate service. Then, you can use an API gateway to validate the authentication using a token."),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Test The Setup")),(0,r.kt)("p",{parentName:"li"},"To make sure the deployment can handle the load, you need to test it with the same number of connections and request you are expecting. You can find a guide on how to publish events ",(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/guides/publishing"},"here"),". You can also check example client ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/tree/main/docs/example"},"here"),". If there is something wrong with Raccon, you can check the ",(0,r.kt)("a",{parentName:"p",href:"https://raystack.gitbook.io/raccoon/guides/troubleshooting"},"troubleshooting")," section."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9e16301.16abe1ad.js b/assets/js/d9e16301.16abe1ad.js new file mode 100644 index 00000000..dc07606f --- /dev/null +++ b/assets/js/d9e16301.16abe1ad.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[416],{5680:(e,t,r)=>{r.d(t,{xA:()=>p,yg:()=>f});var n=r(6540);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),i=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=i(e.components);return n.createElement(u.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,u=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),l=i(r),y=o,f=l["".concat(u,".").concat(y)]||l[y]||d[y]||s;return r?n.createElement(f,a(a({ref:t},p),{},{components:r})):n.createElement(f,a({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,a=new Array(s);a[0]=y;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[l]="string"==typeof e?e:o,a[1]=c;for(var i=2;i<s;i++)a[i]=r[i];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}y.displayName="MDXCreateElement"},6073:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>i});var n=r(8168),o=(r(6540),r(5680));const s={},a="Need help?",c={unversionedId:"support",id:"support",title:"Need help?",description:"Need a bit of help? We're here for you. Check out our current issues, GitHub discussions, or get support through Slack.",source:"@site/docs/support.md",sourceDirName:".",slug:"/support",permalink:"/raccoon/support",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/support.md",tags:[],version:"current",frontMatter:{}},u={},i=[{value:"Slack",id:"slack",level:3},{value:"Issues",id:"issues",level:3},{value:"Discussions",id:"discussions",level:3}],p={toc:i},l="wrapper";function d(e){let{components:t,...r}=e;return(0,o.yg)(l,(0,n.A)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.yg)("h1",{id:"need-help"},"Need help?"),(0,o.yg)("p",null,"Need a bit of help? We're here for you. Check out our current issues, GitHub discussions, or get support through Slack."),(0,o.yg)("h3",{id:"slack"},"Slack"),(0,o.yg)("p",null,"The Raccoon team has an open source slack workspace to discuss development and support. Most of the Raccoon discussions happen in #contribution channel.\n",(0,o.yg)("a",{parentName:"p",href:"https://raystack-community.slack.com/"},"Join us on Slack")),(0,o.yg)("h3",{id:"issues"},"Issues"),(0,o.yg)("p",null,"Have a general issue or bug that you've found? We'd love to hear about it in our GitHub issues. Feature requests are welcome too!\n",(0,o.yg)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/issues"},"Go to issues")),(0,o.yg)("h3",{id:"discussions"},"Discussions"),(0,o.yg)("p",null,"For help and questions about best practices, join our GitHub discussions. Browse and ask questions.\n",(0,o.yg)("a",{parentName:"p",href:"https://github.com/orgs/raystack/discussions"},"Go to discussions")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9e16301.fae6ae96.js b/assets/js/d9e16301.fae6ae96.js deleted file mode 100644 index 625ffd6e..00000000 --- a/assets/js/d9e16301.fae6ae96.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[217],{3905:function(e,t,r){r.d(t,{Zo:function(){return p},kt:function(){return d}});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?s(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},s=Object.keys(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),a=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},p=function(e){var t=a(e.components);return n.createElement(i.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,s=e.originalType,i=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),f=a(r),d=o,h=f["".concat(i,".").concat(d)]||f[d]||l[d]||s;return r?n.createElement(h,u(u({ref:t},p),{},{components:r})):n.createElement(h,u({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=r.length,u=new Array(s);u[0]=f;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c.mdxType="string"==typeof e?e:o,u[1]=c;for(var a=2;a<s;a++)u[a]=r[a];return n.createElement.apply(null,u)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},7243:function(e,t,r){r.r(t),r.d(t,{assets:function(){return p},contentTitle:function(){return i},default:function(){return d},frontMatter:function(){return c},metadata:function(){return a},toc:function(){return l}});var n=r(7462),o=r(3366),s=(r(7294),r(3905)),u=["components"],c={},i="Need help?",a={unversionedId:"support",id:"support",title:"Need help?",description:"Need a bit of help? We're here for you. Check out our current issues, GitHub discussions, or get support through Slack.",source:"@site/docs/support.md",sourceDirName:".",slug:"/support",permalink:"/raccoon/support",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/support.md",tags:[],version:"current",frontMatter:{}},p={},l=[{value:"Slack",id:"slack",level:3},{value:"Issues",id:"issues",level:3},{value:"Discussions",id:"discussions",level:3}],f={toc:l};function d(e){var t=e.components,r=(0,o.Z)(e,u);return(0,s.kt)("wrapper",(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"need-help"},"Need help?"),(0,s.kt)("p",null,"Need a bit of help? We're here for you. Check out our current issues, GitHub discussions, or get support through Slack."),(0,s.kt)("h3",{id:"slack"},"Slack"),(0,s.kt)("p",null,"The Raccoon team has an open source slack workspace to discuss development and support. Most of the Raccoon discussions happen in #contribution channel.\n",(0,s.kt)("a",{parentName:"p",href:"https://raystack-community.slack.com/"},"Join us on Slack")),(0,s.kt)("h3",{id:"issues"},"Issues"),(0,s.kt)("p",null,"Have a general issue or bug that you've found? We'd love to hear about it in our GitHub issues. This can be feature requests too!\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/raystack/raccoon/issues"},"Go to issues")),(0,s.kt)("h3",{id:"discussions"},"Discussions"),(0,s.kt)("p",null,"For help and questions about best practices, join our GitHub discussions. Browse and ask questions.\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/orgs/raystack/discussions"},"Go to discussions")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3275a05.0ac1d642.js b/assets/js/f3275a05.0ac1d642.js new file mode 100644 index 00000000..1b5409b3 --- /dev/null +++ b/assets/js/f3275a05.0ac1d642.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[24],{5680:(e,t,n)=>{n.d(t,{xA:()=>l,yg:()=>d});var o=n(6540);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),u=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=u(e.components);return o.createElement(s.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},g=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=u(n),g=r,d=m["".concat(s,".").concat(g)]||m[g]||p[g]||a;return n?o.createElement(d,i(i({ref:t},l),{},{components:n})):o.createElement(d,i({ref:t},l))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=g;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[m]="string"==typeof e?e:r,i[1]=c;for(var u=2;u<a;u++)i[u]=n[u];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}g.displayName="MDXCreateElement"},2536:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=n(8168),r=(n(6540),n(5680));const a={},i="Contribution Process",c={unversionedId:"contribute/contribution",id:"contribute/contribution",title:"Contribution Process",description:"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:",source:"@site/docs/contribute/contribution.md",sourceDirName:"contribute",slug:"/contribute/contribution",permalink:"/raccoon/contribute/contribution",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/contribute/contribution.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Metrics",permalink:"/raccoon/reference/metrics"},next:{title:"Development Guide",permalink:"/raccoon/contribute/development"}},s={},u=[{value:"How can I contribute?",id:"how-can-i-contribute",level:2},{value:"Becoming a maintainer",id:"becoming-a-maintainer",level:2},{value:"Guidelines",id:"guidelines",level:2}],l={toc:u},m="wrapper";function p(e){let{components:t,...n}=e;return(0,r.yg)(m,(0,o.A)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.yg)("h1",{id:"contribution-process"},"Contribution Process"),(0,r.yg)("p",null,"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("a",{parentName:"li",href:"/raccoon/concepts/architecture"},"Concepts")," section will explain you about Raccoon architecture,"),(0,r.yg)("li",{parentName:"ul"},"Our ",(0,r.yg)("a",{parentName:"li",href:"/raccoon/roadmap"},"roadmap")," is the 10k foot view of how we envision Raccoon to evolve"),(0,r.yg)("li",{parentName:"ul"},"Github ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/issues"},"issues")," track the ongoing and reported issues.")),(0,r.yg)("h2",{id:"how-can-i-contribute"},"How can I contribute?"),(0,r.yg)("p",null,"We use RFCS and GitHub issues to communicate ideas."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"You can report a bug or suggest a feature enhancement or can just ask questions. Reach out on Github discussions for this purpose."),(0,r.yg)("li",{parentName:"ul"},"You are also welcome to add new features, improve monitoring,logging and code quality."),(0,r.yg)("li",{parentName:"ul"},"You can help with documenting new features or improve existing documentation."),(0,r.yg)("li",{parentName:"ul"},"You can also review and accept other contributions if you are a maintainer.")),(0,r.yg)("p",null,"Please submit a PR to the master branch of the Raccoon repository once you are ready to submit your contribution. Code submission to Raccoon, including submission from project maintainers, require review and approval from maintainers or code owners. PRs that are submitted by the general public need to pass the build. Once build is passed community members will help to review the pull request."),(0,r.yg)("h2",{id:"becoming-a-maintainer"},"Becoming a maintainer"),(0,r.yg)("p",null,"We are always interested in adding new maintainers. What we look for is a series of contributions, good taste, and an ongoing interest in the project."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"maintainers will have write access to the Raccoon repositories."),(0,r.yg)("li",{parentName:"ul"},"There is no strict protocol for becoming a maintainer or PMC member. Candidates for new maintainers are typically people that are active contributors and community members."),(0,r.yg)("li",{parentName:"ul"},"Candidates for new maintainers can also be suggested by current maintainers or PMC members."),(0,r.yg)("li",{parentName:"ul"},"If you would like to become a maintainer, you should start contributing to Raccoon in any of the ways mentioned. You might also want to talk to other maintainers and ask for their advice and guidance.")),(0,r.yg)("h2",{id:"guidelines"},"Guidelines"),(0,r.yg)("p",null,"Please follow these practices for you change to get merged fast and smoothly:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Contributions can only be accepted if they contain appropriate testing ","(","Unit and Integration Tests.",")"),(0,r.yg)("li",{parentName:"ul"},"If you are introducing a completely new feature or making any major changes in an existing one, we recommend to start with an RFC and get consensus on the basic design first."),(0,r.yg)("li",{parentName:"ul"},"Make sure your local build is running with all the tests and ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/golang/lint"},"golint")," checks passing."),(0,r.yg)("li",{parentName:"ul"},"Docs live in the code repo under ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/docs/README.md"},(0,r.yg)("inlineCode",{parentName:"a"},"docs"))," so that changes to that can be done in the same PR as changes to the code.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f3275a05.a35654d9.js b/assets/js/f3275a05.a35654d9.js deleted file mode 100644 index 96d8c912..00000000 --- a/assets/js/f3275a05.a35654d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[403],{3905:function(e,t,n){n.d(t,{Zo:function(){return l},kt:function(){return d}});var o=n(7294);function r(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),u=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},l=function(e){var t=u(e.components);return o.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(n),d=r,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||i;return n?o.createElement(f,a(a({ref:t},l),{},{components:n})):o.createElement(f,a({ref:t},l))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var u=2;u<i;u++)a[u]=n[u];return o.createElement.apply(null,a)}return o.createElement.apply(null,n)}p.displayName="MDXCreateElement"},5057:function(e,t,n){n.r(t),n.d(t,{assets:function(){return l},contentTitle:function(){return s},default:function(){return d},frontMatter:function(){return c},metadata:function(){return u},toc:function(){return m}});var o=n(7462),r=n(3366),i=(n(7294),n(3905)),a=["components"],c={},s="Contribution Process",u={unversionedId:"contribute/contribution",id:"contribute/contribution",title:"Contribution Process",description:"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:",source:"@site/docs/contribute/contribution.md",sourceDirName:"contribute",slug:"/contribute/contribution",permalink:"/raccoon/contribute/contribution",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/contribute/contribution.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Metrics",permalink:"/raccoon/reference/metrics"},next:{title:"Development Guide",permalink:"/raccoon/contribute/development"}},l={},m=[{value:"How can I contribute?",id:"how-can-i-contribute",level:2},{value:"Becoming a maintainer",id:"becoming-a-maintainer",level:2},{value:"Guidelines",id:"guidelines",level:2}],p={toc:m};function d(e){var t=e.components,n=(0,r.Z)(e,a);return(0,i.kt)("wrapper",(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contribution-process"},"Contribution Process"),(0,i.kt)("p",null,"The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/contribute/contribution"},"Concepts")," section will explain you about Raccoon architecture,"),(0,i.kt)("li",{parentName:"ul"},"Our ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/docs/roadmap.md"},"roadmap")," is the 10k foot view of how we envision Raccoon to evolve"),(0,i.kt)("li",{parentName:"ul"},"Github ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/issues"},"issues")," track the ongoing and reported issues.")),(0,i.kt)("h2",{id:"how-can-i-contribute"},"How can I contribute?"),(0,i.kt)("p",null,"We use RFCS and GitHub issues to communicate ideas."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"You can report a bug or suggest a feature enhancement or can just ask questions. Reach out on Github discussions for this purpose."),(0,i.kt)("li",{parentName:"ul"},"You are also welcome to add new features, improve monitoring,logging and code quality."),(0,i.kt)("li",{parentName:"ul"},"You can help with documenting new features or improve existing documentation."),(0,i.kt)("li",{parentName:"ul"},"You can also review and accept other contributions if you are a maintainer.")),(0,i.kt)("p",null,"Please submit a PR to the master branch of the Raccoon repository once you are ready to submit your contribution. Code submission to Raccoon, including submission from project maintainers, require review and approval from maintainers or code owners. PRs that are submitted by the general public need to pass the build. Once build is passed community members will help to review the pull request."),(0,i.kt)("h2",{id:"becoming-a-maintainer"},"Becoming a maintainer"),(0,i.kt)("p",null,"We are always interested in adding new maintainers. What we look for is a series of contributions, good taste, and an ongoing interest in the project."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"maintainers will have write access to the Raccoon repositories."),(0,i.kt)("li",{parentName:"ul"},"There is no strict protocol for becoming a maintainer or PMC member. Candidates for new maintainers are typically people that are active contributors and community members."),(0,i.kt)("li",{parentName:"ul"},"Candidates for new maintainers can also be suggested by current maintainers or PMC members."),(0,i.kt)("li",{parentName:"ul"},"If you would like to become a maintainer, you should start contributing to Raccoon in any of the ways mentioned. You might also want to talk to other maintainers and ask for their advice and guidance.")),(0,i.kt)("h2",{id:"guidelines"},"Guidelines"),(0,i.kt)("p",null,"Please follow these practices for you change to get merged fast and smoothly:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Contributions can only be accepted if they contain appropriate testing ","(","Unit and Integration Tests.",")"),(0,i.kt)("li",{parentName:"ul"},"If you are introducing a completely new feature or making any major changes in an existing one, we recommend to start with an RFC and get consensus on the basic design first."),(0,i.kt)("li",{parentName:"ul"},"Make sure your local build is running with all the tests and ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/golang/lint"},"golint")," checks passing."),(0,i.kt)("li",{parentName:"ul"},"Docs live in the code repo under ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/raystack/raccoon/docs/README.md"},(0,i.kt)("inlineCode",{parentName:"a"},"docs"))," so that changes to that can be done in the same PR as changes to the code.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fadecd94.40fd13e7.js b/assets/js/fadecd94.40fd13e7.js deleted file mode 100644 index 71d6e10f..00000000 --- a/assets/js/fadecd94.40fd13e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[338],{3905:function(e,t,i){i.d(t,{Zo:function(){return I},kt:function(){return Z}});var n=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function o(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function l(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?o(Object(i),!0).forEach((function(t){a(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):o(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function c(e,t){if(null==e)return{};var i,n,a=function(e,t){if(null==e)return{};var i,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)i=o[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var d=n.createContext({}),r=function(e){var t=n.useContext(d),i=t;return e&&(i="function"==typeof e?e(t):l(l({},t),e)),i},I=function(e){var t=r(e.components);return n.createElement(d.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var i=e.components,a=e.mdxType,o=e.originalType,d=e.parentName,I=c(e,["components","mdxType","originalType","parentName"]),p=r(i),Z=a,m=p["".concat(d,".").concat(Z)]||p[Z]||s[Z]||o;return i?n.createElement(m,l(l({ref:t},I),{},{components:i})):n.createElement(m,l({ref:t},I))}));function Z(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=i.length,l=new Array(o);l[0]=p;var c={};for(var d in t)hasOwnProperty.call(t,d)&&(c[d]=t[d]);c.originalType=e,c.mdxType="string"==typeof e?e:a,l[1]=c;for(var r=2;r<o;r++)l[r]=i[r];return n.createElement.apply(null,l)}return n.createElement.apply(null,i)}p.displayName="MDXCreateElement"},527:function(e,t,i){i.r(t),i.d(t,{assets:function(){return I},contentTitle:function(){return d},default:function(){return Z},frontMatter:function(){return c},metadata:function(){return r},toc:function(){return s}});var n=i(7462),a=i(3366),o=(i(7294),i(3905)),l=["components"],c={},d="Structure",r={unversionedId:"concepts/structure",id:"concepts/structure",title:"Structure",description:"This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon.",source:"@site/docs/concepts/structure.md",sourceDirName:"concepts",slug:"/concepts/structure",permalink:"/raccoon/concepts/structure",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/concepts/structure.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Architecture",permalink:"/raccoon/concepts/architecture"},next:{title:"Configurations",permalink:"/raccoon/reference/configurations"}},I={},s=[{value:"Highlevel View",id:"highlevel-view",level:2},{value:"Code Map",id:"code-map",level:2},{value:"<code>http</code>",id:"http",level:3},{value:"<code>http/websocket</code>",id:"httpwebsocket",level:4},{value:"<code>http/rest</code>",id:"httprest",level:4},{value:"<code>http/gRPC</code>",id:"httpgrpc",level:4},{value:"<code>worker</code>",id:"worker",level:3},{value:"<code>publisher</code>",id:"publisher",level:3},{value:"<code>app</code>",id:"app",level:3},{value:"<code>config</code>",id:"config",level:3},{value:"<code>serialization</code>",id:"serialization",level:3},{value:"<code>deserialization</code>",id:"deserialization",level:3},{value:"<code>identification</code>",id:"identification",level:3},{value:"Code Generation",id:"code-generation",level:2},{value:"Request, Response, and Events Proto",id:"request-response-and-events-proto",level:3}],p={toc:s};function Z(e){var t=e.components,c=(0,a.Z)(e,l);return(0,o.kt)("wrapper",(0,n.Z)({},p,c,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"structure"},"Structure"),(0,o.kt)("p",null,"This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon."),(0,o.kt)("h2",{id:"highlevel-view"},"Highlevel View"),(0,o.kt)("p",null,"The core structure of Raccoon is the server itself. After the server is started, data flows from ",(0,o.kt)("inlineCode",{parentName:"p"},"websocket")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"worker")," to ",(0,o.kt)("inlineCode",{parentName:"p"},"publisher"),". ",(0,o.kt)("inlineCode",{parentName:"p"},"websocket")," manages websocket server, handle incoming connection, and incoming request. ",(0,o.kt)("inlineCode",{parentName:"p"},"worker")," acts as a buffer and interface for various types of server and publisher down the roadmap. ",(0,o.kt)("inlineCode",{parentName:"p"},"publisher")," contains logic to publish the events to the downstream pipeline. ",(0,o.kt)("img",{alt:"high-level",src:i(7082).Z,width:"377",height:"131"})," All the components above are initialized on ",(0,o.kt)("inlineCode",{parentName:"p"},"app"),". ",(0,o.kt)("inlineCode",{parentName:"p"},"app")," package is the starting point of Raccoon."),(0,o.kt)("h2",{id:"code-map"},"Code Map"),(0,o.kt)("p",null,"This section talks briefly about the content of various important packages. You can use this to guess the code location when you need to make changes."),(0,o.kt)("h3",{id:"http"},(0,o.kt)("inlineCode",{parentName:"h3"},"http")),(0,o.kt)("p",null,"Contains all the http related code including code related to ",(0,o.kt)("inlineCode",{parentName:"p"},"websocket"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"rest")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"grpc"),". It also has code pertaining to the http server that serves both WebSocket and REST APIs."),(0,o.kt)("h4",{id:"httpwebsocket"},(0,o.kt)("inlineCode",{parentName:"h4"},"http/websocket")),(0,o.kt)("p",null,"Contains server-related code along with request/response handlers and ",(0,o.kt)("a",{parentName:"p",href:"/raccoon/concepts/architecture#connections"},"connection management"),"."),(0,o.kt)("h4",{id:"httprest"},(0,o.kt)("inlineCode",{parentName:"h4"},"http/rest")),(0,o.kt)("p",null,"Contains server-side code along with resquest/response handler for the REST endpoint."),(0,o.kt)("h4",{id:"httpgrpc"},(0,o.kt)("inlineCode",{parentName:"h4"},"http/gRPC")),(0,o.kt)("p",null,"Contains server-side handlers for gRPC server."),(0,o.kt)("h3",{id:"worker"},(0,o.kt)("inlineCode",{parentName:"h3"},"worker")),(0,o.kt)("p",null,"Buffer from when the events are processed and before events are published. This will also act as interface that connects server and publisher when in the future. Currently, ",(0,o.kt)("inlineCode",{parentName:"p"},"worker")," is tightly coupled with ",(0,o.kt)("inlineCode",{parentName:"p"},"websocket")," server and ",(0,o.kt)("inlineCode",{parentName:"p"},"kafka")," publisher."),(0,o.kt)("h3",{id:"publisher"},(0,o.kt)("inlineCode",{parentName:"h3"},"publisher")),(0,o.kt)("p",null,"Does the actual publishing to the downstream pipeline. Currently, only support Kafka publisher."),(0,o.kt)("h3",{id:"app"},(0,o.kt)("inlineCode",{parentName:"h3"},"app")),(0,o.kt)("p",null,"The starting point of Raccoon. It initializes server, worker, publisher, and other components that require initialization like a metric reporter."),(0,o.kt)("h3",{id:"config"},(0,o.kt)("inlineCode",{parentName:"h3"},"config")),(0,o.kt)("p",null,"Load and store application configurations. Contains mapping of environment configuration with configuration on the code."),(0,o.kt)("h3",{id:"serialization"},(0,o.kt)("inlineCode",{parentName:"h3"},"serialization")),(0,o.kt)("p",null,"Contains the common serialization code for both JSON and Protobufs along with common interface."),(0,o.kt)("h3",{id:"deserialization"},(0,o.kt)("inlineCode",{parentName:"h3"},"deserialization")),(0,o.kt)("p",null,"Contains the common deserialization code along with common interface."),(0,o.kt)("h3",{id:"identification"},(0,o.kt)("inlineCode",{parentName:"h3"},"identification")),(0,o.kt)("p",null,"Contains the code for connection identification."),(0,o.kt)("h2",{id:"code-generation"},"Code Generation"),(0,o.kt)("h3",{id:"request-response-and-events-proto"},"Request, Response, and Events Proto"),(0,o.kt)("p",null,"Raccoon depends on ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/raystack/proton/tree/main/raystack/raccoon"},"Proton")," repository. Proton is a repository to store all Raystack Protobuf files. Code to serde the request and response are generated using Protobuf. You can check how the code is generated on ",(0,o.kt)("inlineCode",{parentName:"p"},"Makefile"),"."))}Z.isMDXComponent=!0},7082:function(e,t){t.Z="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIzNzdweCIgaGVpZ2h0PSIxMzFweCIgdmlld0JveD0iLTAuNSAtMC41IDM3NyAxMzEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDthcHAuZGlhZ3JhbXMubmV0JnF1b3Q7IG1vZGlmaWVkPSZxdW90OzIwMjEtMDUtMTBUMDg6MDA6MzYuMTE2WiZxdW90OyBhZ2VudD0mcXVvdDs1LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzkwLjAuNDQzMC45MyBTYWZhcmkvNTM3LjM2JnF1b3Q7IHZlcnNpb249JnF1b3Q7MTQuNi4zJnF1b3Q7IGV0YWc9JnF1b3Q7OG1abDdaX2l4OEUyUlVXOUctS0UmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7OVRiand5clY0WGU3YUhpLTJNbmUmcXVvdDsmZ3Q7MVpaTmM1c3dFSVovRFhkQWZMakgrQ1B0b1ozcGpBODV5MmdMcWdYTENCSHMvUG9Lc3hoVE9kTjBtaG5TazZWWHE5WHV3eXVNeHpibDZiUG1kZkVOQlNndjlNWEpZMXN2RElNb1RPeFByNXdISlkxSXlMVVVGRFFKZS9rQ0pQcWt0bEpBTXdzMGlNckllaTVtV0ZXUW1abkd0Y1p1SHZZRDFmelVtdWZnQ1B1TUsxZDlrc0lVZzdxSy9Vbi9Bakl2eHBNRG4xWktQZ2FUMEJSY1lIY2pzWjNITmhyUkRLUHl0QUhWd3h1NURQc2VYMW05RnFhaE1tL1pFQTRibnJscXFUZXF5NXpIWmpXMmxZQSszdmZZdWl1a2dYM05zMzYxczQvWGFvVXBsWjBGZGtqcFFCczR2VnBTY0czVU9nU3dCS1BQTm1UY0VLZkRGakpIa0VUeElIUVRhNWFTWTRwYnpveW9jbnErK1RYNWhNQU9pTUo5SXV6UFJFQllOOUFVdFNrd3g0cXIzYVN1NTh5bW1LK0lOWkg2Q2NhY3lkcThOWGlQWTMvUWpHS0RyYzVJaXNqNFhPZEFBSkkzczlhZ3VKSFA4K3ovZ2kxeXNEM0JvY0hzYUd0YjNGRXIvemRIamNLTm96NzVycUdTZC9CVC9MLzRLWEg5bEM3bnA4VDFFK29qNk1YTnhQd0Z6WlE2Vkw2M0J5V2I0Z09BaWNJRndhd2NNQTkxN1NDeHpabDUzMXpKdkxManpEWnBHYkoxajBEYWYvb0hXaWlsRU1NVmhFYSs4TU1sVlErMFJsbVpTOFh4Mm91M2ZTNTc2NXJoQXZhcEc2UHhDQnRVYVBOdUs2emduUXc0dmxLdW5HUG1jSTd1Y0E3L25yT2RUdDhpbDdXYkx6cTIrd1U9Jmx0Oy9kaWFncmFtJmd0OyZsdDsvbXhmaWxlJmd0OyI+PGRlZnMvPjxnPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIzNzYiIGhlaWdodD0iMTMwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cGF0aCBkPSJNIDExMyA2NSBMIDEzMyA2NSBMIDEyMyA2NSBMIDEzNi42MyA2NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48cGF0aCBkPSJNIDE0MS44OCA2NSBMIDEzNC44OCA2OC41IEwgMTM2LjYzIDY1IEwgMTM0Ljg4IDYxLjUgWiIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIyMyIgeT0iMzUiIHdpZHRoPSI5MCIgaGVpZ2h0PSI2MCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDg4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNjVweDsgbWFyZ2luLWxlZnQ6IDI0cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPldlYnNvY2tldDwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2OCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V2Vic29ja2V0PC90ZXh0Pjwvc3dpdGNoPjwvZz48cGF0aCBkPSJNIDIzMyA2NSBMIDI1MyA2NSBMIDI0MyA2NSBMIDI1Ni42MyA2NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48cGF0aCBkPSJNIDI2MS44OCA2NSBMIDI1NC44OCA2OC41IEwgMjU2LjYzIDY1IEwgMjU0Ljg4IDYxLjUgWiIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIxNDMiIHk9IjM1IiB3aWR0aD0iOTAiIGhlaWdodD0iNjAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDY1cHg7IG1hcmdpbi1sZWZ0OiAxNDRweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+V29ya2VyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjE4OCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V29ya2VyPC90ZXh0Pjwvc3dpdGNoPjwvZz48cmVjdCB4PSIyNjMiIHk9IjM1IiB3aWR0aD0iOTAiIGhlaWdodD0iNjAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDY1cHg7IG1hcmdpbi1sZWZ0OiAyNjRweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+UHVibGlzaGVyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjMwOCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UHVibGlzaGVyPC90ZXh0Pjwvc3dpdGNoPjwvZz48cmVjdCB4PSIxNjgiIHk9IjgiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxOHB4OyBtYXJnaW4tbGVmdDogMTg4cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3dyYXA7ICI+QXBwPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjE4OCIgeT0iMjIiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+QXBwPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PHN3aXRjaD48ZyByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiLz48YSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC01KSIgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZGlhZ3JhbXMubmV0L2RvYy9mYXEvc3ZnLWV4cG9ydC10ZXh0LXByb2JsZW1zIiB0YXJnZXQ9Il9ibGFuayI+PHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMHB4IiB4PSI1MCUiIHk9IjEwMCUiPlZpZXdlciBkb2VzIG5vdCBzdXBwb3J0IGZ1bGwgU1ZHIDEuMTwvdGV4dD48L2E+PC9zd2l0Y2g+PC9zdmc+"}}]); \ No newline at end of file diff --git a/assets/js/fadecd94.e09f5515.js b/assets/js/fadecd94.e09f5515.js new file mode 100644 index 00000000..ff6f3cdd --- /dev/null +++ b/assets/js/fadecd94.e09f5515.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[771],{5680:(e,i,n)=>{n.d(i,{xA:()=>s,yg:()=>m});var t=n(6540);function a(e,i,n){return i in e?Object.defineProperty(e,i,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[i]=n,e}function c(e,i){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);i&&(t=t.filter((function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var i=1;i<arguments.length;i++){var n=null!=arguments[i]?arguments[i]:{};i%2?c(Object(n),!0).forEach((function(i){a(e,i,n[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):c(Object(n)).forEach((function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(n,i))}))}return e}function o(e,i){if(null==e)return{};var n,t,a=function(e,i){if(null==e)return{};var n,t,a={},c=Object.keys(e);for(t=0;t<c.length;t++)n=c[t],i.indexOf(n)>=0||(a[n]=e[n]);return a}(e,i);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(t=0;t<c.length;t++)n=c[t],i.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var d=t.createContext({}),r=function(e){var i=t.useContext(d),n=i;return e&&(n="function"==typeof e?e(i):l(l({},i),e)),n},s=function(e){var i=r(e.components);return t.createElement(d.Provider,{value:i},e.children)},I="mdxType",Z={inlineCode:"code",wrapper:function(e){var i=e.children;return t.createElement(t.Fragment,{},i)}},p=t.forwardRef((function(e,i){var n=e.components,a=e.mdxType,c=e.originalType,d=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),I=r(n),p=a,m=I["".concat(d,".").concat(p)]||I[p]||Z[p]||c;return n?t.createElement(m,l(l({ref:i},s),{},{components:n})):t.createElement(m,l({ref:i},s))}));function m(e,i){var n=arguments,a=i&&i.mdxType;if("string"==typeof e||a){var c=n.length,l=new Array(c);l[0]=p;var o={};for(var d in i)hasOwnProperty.call(i,d)&&(o[d]=i[d]);o.originalType=e,o[I]="string"==typeof e?e:a,l[1]=o;for(var r=2;r<c;r++)l[r]=n[r];return t.createElement.apply(null,l)}return t.createElement.apply(null,n)}p.displayName="MDXCreateElement"},1427:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>l,default:()=>Z,frontMatter:()=>c,metadata:()=>o,toc:()=>r});var t=n(8168),a=(n(6540),n(5680));const c={},l="Structure",o={unversionedId:"concepts/structure",id:"concepts/structure",title:"Structure",description:"This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon.",source:"@site/docs/concepts/structure.md",sourceDirName:"concepts",slug:"/concepts/structure",permalink:"/raccoon/concepts/structure",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/concepts/structure.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Architecture",permalink:"/raccoon/concepts/architecture"},next:{title:"Configurations",permalink:"/raccoon/reference/configurations"}},d={},r=[{value:"High level View",id:"high-level-view",level:2},{value:"Code Map",id:"code-map",level:2},{value:"<code>service</code>",id:"service",level:3},{value:"<code>service/rest</code>",id:"servicerest",level:4},{value:"<code>service/rest/websocket</code>",id:"servicerestwebsocket",level:4},{value:"<code>service/gRPC</code>",id:"servicegrpc",level:4},{value:"<code>worker</code>",id:"worker",level:3},{value:"<code>publisher</code>",id:"publisher",level:3},{value:"<code>app</code>",id:"app",level:3},{value:"<code>config</code>",id:"config",level:3},{value:"<code>serialization</code>",id:"serialization",level:3},{value:"<code>deserialization</code>",id:"deserialization",level:3},{value:"<code>identification</code>",id:"identification",level:3},{value:"Code Generation",id:"code-generation",level:2},{value:"Request, Response, and Events Proto",id:"request-response-and-events-proto",level:3}],s={toc:r},I="wrapper";function Z(e){let{components:i,...c}=e;return(0,a.yg)(I,(0,t.A)({},s,c,{components:i,mdxType:"MDXLayout"}),(0,a.yg)("h1",{id:"structure"},"Structure"),(0,a.yg)("p",null,"This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon."),(0,a.yg)("h2",{id:"high-level-view"},"High level View"),(0,a.yg)("p",null,"The core structure of Raccoon is the server itself. After the server is started, data flows from ",(0,a.yg)("inlineCode",{parentName:"p"},"websocket")," to ",(0,a.yg)("inlineCode",{parentName:"p"},"worker")," to ",(0,a.yg)("inlineCode",{parentName:"p"},"publisher"),". ",(0,a.yg)("inlineCode",{parentName:"p"},"websocket")," manages websocket server, handle incoming connection, and incoming request. ",(0,a.yg)("inlineCode",{parentName:"p"},"worker")," acts as a buffer and interface for various types of server and publisher down the roadmap. ",(0,a.yg)("inlineCode",{parentName:"p"},"publisher")," contains logic to publish the events to the downstream pipeline. ",(0,a.yg)("img",{alt:"high-level",src:n(4534).A,width:"377",height:"131"})," All the components above are initialized on ",(0,a.yg)("inlineCode",{parentName:"p"},"app"),". ",(0,a.yg)("inlineCode",{parentName:"p"},"app")," package is the starting point of Raccoon."),(0,a.yg)("h2",{id:"code-map"},"Code Map"),(0,a.yg)("p",null,"This section talks briefly about the content of various important packages. You can use this to guess the code location when you need to make changes."),(0,a.yg)("h3",{id:"service"},(0,a.yg)("inlineCode",{parentName:"h3"},"service")),(0,a.yg)("p",null,"Contains all backend related code including code related to ",(0,a.yg)("inlineCode",{parentName:"p"},"websocket"),", ",(0,a.yg)("inlineCode",{parentName:"p"},"rest")," and ",(0,a.yg)("inlineCode",{parentName:"p"},"grpc"),". It also has code pertaining to the http server that serves both WebSocket and REST APIs."),(0,a.yg)("h4",{id:"servicerest"},(0,a.yg)("inlineCode",{parentName:"h4"},"service/rest")),(0,a.yg)("p",null,"Contains server-side code along with request/response handler for the REST endpoint."),(0,a.yg)("h4",{id:"servicerestwebsocket"},(0,a.yg)("inlineCode",{parentName:"h4"},"service/rest/websocket")),(0,a.yg)("p",null,"Contains server-related code along with request/response handlers and ",(0,a.yg)("a",{parentName:"p",href:"/raccoon/concepts/architecture#connections"},"connection management"),"."),(0,a.yg)("h4",{id:"servicegrpc"},(0,a.yg)("inlineCode",{parentName:"h4"},"service/gRPC")),(0,a.yg)("p",null,"Contains server-side handlers for gRPC server."),(0,a.yg)("h3",{id:"worker"},(0,a.yg)("inlineCode",{parentName:"h3"},"worker")),(0,a.yg)("p",null,"Buffer from when the events are processed and before events are published. This will also act as interface that connects server and publisher."),(0,a.yg)("h3",{id:"publisher"},(0,a.yg)("inlineCode",{parentName:"h3"},"publisher")),(0,a.yg)("p",null,"Does the actual publishing to the downstream message queue.\nCurrently Supports:"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},"Apache Kafka"),(0,a.yg)("li",{parentName:"ul"},"Google Cloud Pub/Sub"),(0,a.yg)("li",{parentName:"ul"},"Amazon Web Services Kinesis")),(0,a.yg)("h3",{id:"app"},(0,a.yg)("inlineCode",{parentName:"h3"},"app")),(0,a.yg)("p",null,"The starting point of Raccoon. It initializes server, worker, publisher, and other components that require initialization like a metric reporter."),(0,a.yg)("h3",{id:"config"},(0,a.yg)("inlineCode",{parentName:"h3"},"config")),(0,a.yg)("p",null,"Load and store application configurations. Contains mapping of environment configuration with configuration on the code."),(0,a.yg)("h3",{id:"serialization"},(0,a.yg)("inlineCode",{parentName:"h3"},"serialization")),(0,a.yg)("p",null,"Contains the common serialization code for both JSON and protobuf along with common interface."),(0,a.yg)("h3",{id:"deserialization"},(0,a.yg)("inlineCode",{parentName:"h3"},"deserialization")),(0,a.yg)("p",null,"Contains the common deserialization code along with common interface."),(0,a.yg)("h3",{id:"identification"},(0,a.yg)("inlineCode",{parentName:"h3"},"identification")),(0,a.yg)("p",null,"Contains the code for connection identification."),(0,a.yg)("h2",{id:"code-generation"},"Code Generation"),(0,a.yg)("h3",{id:"request-response-and-events-proto"},"Request, Response, and Events Proto"),(0,a.yg)("p",null,"Raccoon depends on ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/raystack/proton/tree/main/raystack/raccoon"},"Proton")," repository. Proton is a repository to store all Raystack Protobuf files. Code to serde the request and response are generated using Protobuf. You can check how the code is generated on ",(0,a.yg)("inlineCode",{parentName:"p"},"Makefile"),"."))}Z.isMDXComponent=!0},4534:(e,i,n)=>{n.d(i,{A:()=>t});const t="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIzNzdweCIgaGVpZ2h0PSIxMzFweCIgdmlld0JveD0iLTAuNSAtMC41IDM3NyAxMzEiIGNvbnRlbnQ9IiZsdDtteGZpbGUgaG9zdD0mcXVvdDthcHAuZGlhZ3JhbXMubmV0JnF1b3Q7IG1vZGlmaWVkPSZxdW90OzIwMjEtMDUtMTBUMDg6MDA6MzYuMTE2WiZxdW90OyBhZ2VudD0mcXVvdDs1LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzkwLjAuNDQzMC45MyBTYWZhcmkvNTM3LjM2JnF1b3Q7IHZlcnNpb249JnF1b3Q7MTQuNi4zJnF1b3Q7IGV0YWc9JnF1b3Q7OG1abDdaX2l4OEUyUlVXOUctS0UmcXVvdDsmZ3Q7Jmx0O2RpYWdyYW0gaWQ9JnF1b3Q7OVRiand5clY0WGU3YUhpLTJNbmUmcXVvdDsmZ3Q7MVpaTmM1c3dFSVovRFhkQWZMakgrQ1B0b1ozcGpBODV5MmdMcWdYTENCSHMvUG9Lc3hoVE9kTjBtaG5TazZWWHE5WHV3eXVNeHpibDZiUG1kZkVOQlNndjlNWEpZMXN2RElNb1RPeFByNXdISlkxSXlMVVVGRFFKZS9rQ0pQcWt0bEpBTXdzMGlNckllaTVtV0ZXUW1abkd0Y1p1SHZZRDFmelVtdWZnQ1B1TUsxZDlrc0lVZzdxSy9Vbi9Bakl2eHBNRG4xWktQZ2FUMEJSY1lIY2pzWjNITmhyUkRLUHl0QUhWd3h1NURQc2VYMW05RnFhaE1tL1pFQTRibnJscXFUZXF5NXpIWmpXMmxZQSszdmZZdWl1a2dYM05zMzYxczQvWGFvVXBsWjBGZGtqcFFCczR2VnBTY0czVU9nU3dCS1BQTm1UY0VLZkRGakpIa0VUeElIUVRhNWFTWTRwYnpveW9jbnErK1RYNWhNQU9pTUo5SXV6UFJFQllOOUFVdFNrd3g0cXIzYVN1NTh5bW1LK0lOWkg2Q2NhY3lkcThOWGlQWTMvUWpHS0RyYzVJaXNqNFhPZEFBSkkzczlhZ3VKSFA4K3ovZ2kxeXNEM0JvY0hzYUd0YjNGRXIvemRIamNLTm96NzVycUdTZC9CVC9MLzRLWEg5bEM3bnA4VDFFK29qNk1YTnhQd0Z6WlE2Vkw2M0J5V2I0Z09BaWNJRndhd2NNQTkxN1NDeHpabDUzMXpKdkxManpEWnBHYkoxajBEYWYvb0hXaWlsRU1NVmhFYSs4TU1sVlErMFJsbVpTOFh4Mm91M2ZTNTc2NXJoQXZhcEc2UHhDQnRVYVBOdUs2emduUXc0dmxLdW5HUG1jSTd1Y0E3L25yT2RUdDhpbDdXYkx6cTIrd1U9Jmx0Oy9kaWFncmFtJmd0OyZsdDsvbXhmaWxlJmd0OyI+PGRlZnMvPjxnPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIzNzYiIGhlaWdodD0iMTMwIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cGF0aCBkPSJNIDExMyA2NSBMIDEzMyA2NSBMIDEyMyA2NSBMIDEzNi42MyA2NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48cGF0aCBkPSJNIDE0MS44OCA2NSBMIDEzNC44OCA2OC41IEwgMTM2LjYzIDY1IEwgMTM0Ljg4IDYxLjUgWiIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIyMyIgeT0iMzUiIHdpZHRoPSI5MCIgaGVpZ2h0PSI2MCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDg4cHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNjVweDsgbWFyZ2luLWxlZnQ6IDI0cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPldlYnNvY2tldDwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2OCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V2Vic29ja2V0PC90ZXh0Pjwvc3dpdGNoPjwvZz48cGF0aCBkPSJNIDIzMyA2NSBMIDI1MyA2NSBMIDI0MyA2NSBMIDI1Ni42MyA2NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJzdHJva2UiLz48cGF0aCBkPSJNIDI2MS44OCA2NSBMIDI1NC44OCA2OC41IEwgMjU2LjYzIDY1IEwgMjU0Ljg4IDYxLjUgWiIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48cmVjdCB4PSIxNDMiIHk9IjM1IiB3aWR0aD0iOTAiIGhlaWdodD0iNjAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDY1cHg7IG1hcmdpbi1sZWZ0OiAxNDRweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+V29ya2VyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjE4OCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+V29ya2VyPC90ZXh0Pjwvc3dpdGNoPjwvZz48cmVjdCB4PSIyNjMiIHk9IjM1IiB3aWR0aD0iOTAiIGhlaWdodD0iNjAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiA4OHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDY1cHg7IG1hcmdpbi1sZWZ0OiAyNjRweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogY2VudGVyOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogSGVsdmV0aWNhOyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+UHVibGlzaGVyPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjMwOCIgeT0iNjkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UHVibGlzaGVyPC90ZXh0Pjwvc3dpdGNoPjwvZz48cmVjdCB4PSIxNjgiIHk9IjgiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGNlbnRlcjsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxOHB4OyBtYXJnaW4tbGVmdDogMTg4cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IEhlbHZldGljYTsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3dyYXA7ICI+QXBwPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjE4OCIgeT0iMjIiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJIZWx2ZXRpY2EiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+QXBwPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PHN3aXRjaD48ZyByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiLz48YSB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC01KSIgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZGlhZ3JhbXMubmV0L2RvYy9mYXEvc3ZnLWV4cG9ydC10ZXh0LXByb2JsZW1zIiB0YXJnZXQ9Il9ibGFuayI+PHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMHB4IiB4PSI1MCUiIHk9IjEwMCUiPlZpZXdlciBkb2VzIG5vdCBzdXBwb3J0IGZ1bGwgU1ZHIDEuMTwvdGV4dD48L2E+PC9zd2l0Y2g+PC9zdmc+"}}]); \ No newline at end of file diff --git a/assets/js/fc49bffc.f6068783.js b/assets/js/fc49bffc.f6068783.js new file mode 100644 index 00000000..7347f46b --- /dev/null +++ b/assets/js/fc49bffc.f6068783.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[462],{5680:(e,n,a)=>{a.d(n,{xA:()=>c,yg:()=>p});var l=a(6540);function t(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function i(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);n&&(l=l.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,l)}return a}function r(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{};n%2?i(Object(a),!0).forEach((function(n){t(e,n,a[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(a,n))}))}return e}function o(e,n){if(null==e)return{};var a,l,t=function(e,n){if(null==e)return{};var a,l,t={},i=Object.keys(e);for(l=0;l<i.length;l++)a=i[l],n.indexOf(a)>=0||(t[a]=e[a]);return t}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(l=0;l<i.length;l++)a=i[l],n.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(t[a]=e[a])}return t}var s=l.createContext({}),u=function(e){var n=l.useContext(s),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},c=function(e){var n=u(e.components);return l.createElement(s.Provider,{value:n},e.children)},g="mdxType",_={inlineCode:"code",wrapper:function(e){var n=e.children;return l.createElement(l.Fragment,{},n)}},d=l.forwardRef((function(e,n){var a=e.components,t=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),g=u(a),d=t,p=g["".concat(s,".").concat(d)]||g[d]||_[d]||i;return a?l.createElement(p,r(r({ref:n},c),{},{components:a})):l.createElement(p,r({ref:n},c))}));function p(e,n){var a=arguments,t=n&&n.mdxType;if("string"==typeof e||t){var i=a.length,r=new Array(i);r[0]=d;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[g]="string"==typeof e?e:t,r[1]=o;for(var u=2;u<i;u++)r[u]=a[u];return l.createElement.apply(null,r)}return l.createElement.apply(null,a)}d.displayName="MDXCreateElement"},3729:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>_,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var l=a(8168),t=(a(6540),a(5680));const i={toc_max_heading_level:4},r="Metrics",o={unversionedId:"reference/metrics",id:"reference/metrics",title:"Metrics",description:"Raccoon supports statsd and prometheus as two ways to report metrics. For statsd, we recommend using Telegraf as a collection agent.",source:"@site/docs/reference/metrics.md",sourceDirName:"reference",slug:"/reference/metrics",permalink:"/raccoon/reference/metrics",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/reference/metrics.md",tags:[],version:"current",frontMatter:{toc_max_heading_level:4},sidebar:"docsSidebar",previous:{title:"Configurations",permalink:"/raccoon/reference/configurations"},next:{title:"Contribution Process",permalink:"/raccoon/contribute/contribution"}},s={},u=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Server Connection",id:"server-connection",level:2},{value:"<code>server_ping_failure_total</code>",id:"server_ping_failure_total",level:3},{value:"<code>server_pong_failure_total</code>",id:"server_pong_failure_total",level:3},{value:"<code>connections_count_current</code>",id:"connections_count_current",level:3},{value:"<code>user_connection_success_total</code>",id:"user_connection_success_total",level:3},{value:"<code>user_connection_failure_total</code>",id:"user_connection_failure_total",level:3},{value:"<code>user_session_duration_milliseconds</code>",id:"user_session_duration_milliseconds",level:3},{value:"<code>conn_close_err_count</code>",id:"conn_close_err_count",level:3},{value:"Publisher",id:"publisher",level:2},{value:"Kafka",id:"kafka",level:3},{value:"<code>kafka_messages_delivered_total</code>",id:"kafka_messages_delivered_total",level:4},{value:"<code>kafka_messages_undelivered_total</code>",id:"kafka_messages_undelivered_total",level:4},{value:"<code>kafka_unknown_topic_failure_total</code>",id:"kafka_unknown_topic_failure_total",level:4},{value:"<code>kafka_tx_messages_total</code>",id:"kafka_tx_messages_total",level:4},{value:"<code>kafka_tx_messages_bytes_total</code>",id:"kafka_tx_messages_bytes_total",level:4},{value:"<code>kafka_brokers_tx_total</code>",id:"kafka_brokers_tx_total",level:4},{value:"<code>kafka_brokers_tx_bytes_total</code>",id:"kafka_brokers_tx_bytes_total",level:4},{value:"<code>kafka_brokers_rtt_average_milliseconds</code>",id:"kafka_brokers_rtt_average_milliseconds",level:4},{value:"<code>ack_event_rtt_ms</code>",id:"ack_event_rtt_ms",level:4},{value:"<code>event_rtt_ms</code>",id:"event_rtt_ms",level:4},{value:"<code>kafka_producebulk_tt_ms</code>",id:"kafka_producebulk_tt_ms",level:4},{value:"PubSub",id:"pubsub",level:3},{value:"<code>pubsub_messages_delivered_total</code>",id:"pubsub_messages_delivered_total",level:4},{value:"<code>pubsub_messages_undelivered_total</code>",id:"pubsub_messages_undelivered_total",level:4},{value:"<code>pubsub_unknown_topic_failure_total</code>",id:"pubsub_unknown_topic_failure_total",level:4},{value:"Kinesis",id:"kinesis",level:3},{value:"<code>kinesis_messages_delivered_total</code>",id:"kinesis_messages_delivered_total",level:4},{value:"<code>kinesis_messages_undelivered_total</code>",id:"kinesis_messages_undelivered_total",level:4},{value:"<code>kinesis_unknown_stream_failure_total</code>",id:"kinesis_unknown_stream_failure_total",level:4},{value:"Resource Usage",id:"resource-usage",level:2},{value:"<code>server_mem_gc_triggered_current</code>",id:"server_mem_gc_triggered_current",level:3},{value:"<code>server_mem_gc_pauseNs_current</code>",id:"server_mem_gc_pausens_current",level:3},{value:"<code>server_mem_gc_count_current</code>",id:"server_mem_gc_count_current",level:3},{value:"<code>server_mem_gc_pauseTotalNs_current</code>",id:"server_mem_gc_pausetotalns_current",level:3},{value:"<code>server_mem_heap_alloc_bytes_current</code>",id:"server_mem_heap_alloc_bytes_current",level:3},{value:"<code>server_mem_heap_inuse_bytes_current</code>",id:"server_mem_heap_inuse_bytes_current",level:3},{value:"<code>server_mem_heap_objects_total_current</code>",id:"server_mem_heap_objects_total_current",level:3},{value:"<code>server_go_routines_count_current</code>",id:"server_go_routines_count_current",level:3},{value:"<code>server_mem_stack_inuse_bytes_current</code>",id:"server_mem_stack_inuse_bytes_current",level:3},{value:"Event Delivery",id:"event-delivery",level:2},{value:"<code>events_rx_bytes_total</code>",id:"events_rx_bytes_total",level:3},{value:"<code>events_rx_total</code>",id:"events_rx_total",level:3},{value:"<code>events_duplicate_total</code>",id:"events_duplicate_total",level:3},{value:"<code>batches_read_total</code>",id:"batches_read_total",level:3},{value:"<code>batch_idle_in_channel_milliseconds</code>",id:"batch_idle_in_channel_milliseconds",level:3},{value:"<code>event_processing_duration_milliseconds</code>",id:"event_processing_duration_milliseconds",level:3},{value:"<code>server_processing_latency_milliseconds</code>",id:"server_processing_latency_milliseconds",level:3},{value:"<code>worker_processing_duration_milliseconds</code>",id:"worker_processing_duration_milliseconds",level:3}],c={toc:u},g="wrapper";function _(e){let{components:n,...i}=e;return(0,t.yg)(g,(0,l.A)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,t.yg)("h1",{id:"metrics"},"Metrics"),(0,t.yg)("p",null,"Raccoon supports ",(0,t.yg)("inlineCode",{parentName:"p"},"statsd")," and ",(0,t.yg)("inlineCode",{parentName:"p"},"prometheus")," as two ways to report metrics. For statsd, we recommend using ",(0,t.yg)("a",{parentName:"p",href:"https://github.com/influxdata/telegraf"},"Telegraf")," as a collection agent."),(0,t.yg)("p",null,"This page contains the reference for all the metrics exposed by Raccoon."),(0,t.yg)("h2",{id:"table-of-contents"},"Table of Contents"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#server-connection"},"Server Connection")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#publisher"},"Publisher"),(0,t.yg)("ul",{parentName:"li"},(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"#kafka"},"Kafka")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"#pubsub"},"PubSub")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"#kinesis"},"Kinesis")))),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#pubsub-publisher"},"PubSub Publisher")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#kinesis-publisher"},"Kinesis Publisher")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#resource-usage"},"Resource Usage")),(0,t.yg)("li",{parentName:"ul"},(0,t.yg)("a",{parentName:"li",href:"/raccoon/reference/metrics#event-delivery"},"Event Delivery"))),(0,t.yg)("h2",{id:"server-connection"},"Server Connection"),(0,t.yg)("h3",{id:"server_ping_failure_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_ping_failure_total")),(0,t.yg)("p",null,"Total ping that server fails to send"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Counting")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"server_pong_failure_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_pong_failure_total")),(0,t.yg)("p",null,"Total pong that server fails to send"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Counting")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"connections_count_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"connections_count_current")),(0,t.yg)("p",null,"Number of alive connections"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"user_connection_success_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"user_connection_success_total")),(0,t.yg)("p",null,"Number of successful connections established to the server"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"user_connection_failure_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"user_connection_failure_total")),(0,t.yg)("p",null,"Number of fail connections established to the server"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"reason=ugfailure")," ",(0,t.yg)("inlineCode",{parentName:"li"},"reason=exists")," ",(0,t.yg)("inlineCode",{parentName:"li"},"reason=serverlimit")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"user_session_duration_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h3"},"user_session_duration_milliseconds")),(0,t.yg)("p",null,"Duration of alive connection per session per connection"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"conn_close_err_count"},(0,t.yg)("inlineCode",{parentName:"h3"},"conn_close_err_count")),(0,t.yg)("p",null,"Number of connection close errors encountered"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: NA")),(0,t.yg)("h2",{id:"publisher"},"Publisher"),(0,t.yg)("h3",{id:"kafka"},"Kafka"),(0,t.yg)("h4",{id:"kafka_messages_delivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_messages_delivered_total")),(0,t.yg)("p",null,"Number of delivered events to Kafka. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,t.yg)("inlineCode",{parentName:"p"},"kafka_messages_undelivered_total")," metric for the same tag/labels."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"kafka_messages_undelivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_messages_undelivered_total")),(0,t.yg)("p",null,"The count of false increments done by ",(0,t.yg)("inlineCode",{parentName:"p"},"kafka_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"kafka_unknown_topic_failure_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_unknown_topic_failure_total")),(0,t.yg)("p",null,"Number of delivery failure caused by topic does not exist in kafka."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"topic=topicname")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"kafka_tx_messages_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_tx_messages_total")),(0,t.yg)("p",null,"Total number of messages transmitted ","(","produced",")"," to Kafka brokers."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h4",{id:"kafka_tx_messages_bytes_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_tx_messages_bytes_total")),(0,t.yg)("p",null,"Total number of message bytes ","(","including framing, such as per-Message framing and MessageSet/batch framing",")"," transmitted to Kafka brokers"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h4",{id:"kafka_brokers_tx_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_brokers_tx_total")),(0,t.yg)("p",null,"Total number of requests sent to Kafka brokers"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,t.yg)("h4",{id:"kafka_brokers_tx_bytes_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_brokers_tx_bytes_total")),(0,t.yg)("p",null,"Total number of bytes transmitted to Kafka brokers"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,t.yg)("h4",{id:"kafka_brokers_rtt_average_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_brokers_rtt_average_milliseconds")),(0,t.yg)("p",null,"Broker latency / round-trip time in microseconds"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,t.yg)("h4",{id:"ack_event_rtt_ms"},(0,t.yg)("inlineCode",{parentName:"h4"},"ack_event_rtt_ms")),(0,t.yg)("p",null,"Time taken from ack function called by kafka producer to processed by the ack handler."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: NA")),(0,t.yg)("h4",{id:"event_rtt_ms"},(0,t.yg)("inlineCode",{parentName:"h4"},"event_rtt_ms")),(0,t.yg)("p",null,"Time taken from event is consumed from the queue to be acked by the ack handler."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: NA")),(0,t.yg)("h4",{id:"kafka_producebulk_tt_ms"},(0,t.yg)("inlineCode",{parentName:"h4"},"kafka_producebulk_tt_ms")),(0,t.yg)("p",null,"Response time of produce batch method of the kafka producer"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: NA")),(0,t.yg)("h3",{id:"pubsub"},"PubSub"),(0,t.yg)("h4",{id:"pubsub_messages_delivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"pubsub_messages_delivered_total")),(0,t.yg)("p",null,"Number of delivered events to PubSub. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,t.yg)("inlineCode",{parentName:"p"},"pubsub_messages_undelivered_total")," metric for the same tag/labels."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"pubsub_messages_undelivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"pubsub_messages_undelivered_total")),(0,t.yg)("p",null,"The count of false increments done by ",(0,t.yg)("inlineCode",{parentName:"p"},"pubsub_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"pubsub_unknown_topic_failure_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"pubsub_unknown_topic_failure_total")),(0,t.yg)("p",null,"Number of delivery failure caused by topic does not exist in PubSub."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"topic=topicname")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"kinesis"},"Kinesis"),(0,t.yg)("h4",{id:"kinesis_messages_delivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kinesis_messages_delivered_total")),(0,t.yg)("p",null,"Number of delivered events to Kinesis. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,t.yg)("inlineCode",{parentName:"p"},"kinesis_messages_undelivered_total")," metric for the same tag/labels."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"kinesis_messages_undelivered_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kinesis_messages_undelivered_total")),(0,t.yg)("p",null,"The count of false increments done by ",(0,t.yg)("inlineCode",{parentName:"p"},"kinesis_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"success=false")," ",(0,t.yg)("inlineCode",{parentName:"li"},"success=true")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h4",{id:"kinesis_unknown_stream_failure_total"},(0,t.yg)("inlineCode",{parentName:"h4"},"kinesis_unknown_stream_failure_total")),(0,t.yg)("p",null,"Number of delivery failure caused by stream does not exist in Kinesis."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"stream=streamname")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h2",{id:"resource-usage"},"Resource Usage"),(0,t.yg)("h3",{id:"server_mem_gc_triggered_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_gc_triggered_current")),(0,t.yg)("p",null,"The time the last garbage collection finished in Unix timestamp"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_gc_pausens_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_gc_pauseNs_current")),(0,t.yg)("p",null,"Circular buffer of recent GC stop-the-world in Unix timestamp"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_gc_count_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_gc_count_current")),(0,t.yg)("p",null,"The number of completed GC cycle"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_gc_pausetotalns_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_gc_pauseTotalNs_current")),(0,t.yg)("p",null,"The cumulative nanoseconds in GC stop-the-world pauses since the program started"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_heap_alloc_bytes_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_heap_alloc_bytes_current")),(0,t.yg)("p",null,"Bytes of allocated heap objects"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_heap_inuse_bytes_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_heap_inuse_bytes_current")),(0,t.yg)("p",null,"HeapInuse is bytes in in-use spans"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_heap_objects_total_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_heap_objects_total_current")),(0,t.yg)("p",null,"Number of allocated heap objects"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_go_routines_count_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_go_routines_count_current")),(0,t.yg)("p",null,"Number of goroutine spawn in a single flush"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h3",{id:"server_mem_stack_inuse_bytes_current"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_mem_stack_inuse_bytes_current")),(0,t.yg)("p",null,"Bytes in stack spans"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Gauge"))),(0,t.yg)("h2",{id:"event-delivery"},"Event Delivery"),(0,t.yg)("p",null,"Following metrics are event delivery reports. Each metrics reported at a different point in time. See the diagram below for to understand when each metrics are reported."),(0,t.yg)("p",null,(0,t.yg)("img",{alt:"Diagram",src:a(1722).A,width:"585",height:"381"})),(0,t.yg)("h3",{id:"events_rx_bytes_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"events_rx_bytes_total")),(0,t.yg)("p",null,"Total byte received in requests"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h3",{id:"events_rx_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"events_rx_total")),(0,t.yg)("p",null,"Number of events received in requests"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"event_type=*"))),(0,t.yg)("h3",{id:"events_duplicate_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"events_duplicate_total")),(0,t.yg)("p",null,"Number of duplicate events"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"reason=*"))),(0,t.yg)("h3",{id:"batches_read_total"},(0,t.yg)("inlineCode",{parentName:"h3"},"batches_read_total")),(0,t.yg)("p",null,"Request count"),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Count")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"status=failed")," ",(0,t.yg)("inlineCode",{parentName:"li"},"status=success")," ",(0,t.yg)("inlineCode",{parentName:"li"},"reason=*")," ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"batch_idle_in_channel_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h3"},"batch_idle_in_channel_milliseconds")),(0,t.yg)("p",null,"Duration from when the request is received to when the request is processed. High value of this metric indicates the publisher is slow."),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"worker=worker-name"))),(0,t.yg)("h3",{id:"event_processing_duration_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h3"},"event_processing_duration_milliseconds")),(0,t.yg)("p",null,"Duration from the time request is sent to the time events are published. This metric is calculated per event by following formula ",(0,t.yg)("inlineCode",{parentName:"p"},"(PublishedTime - SentTime)/CountEvents")),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"server_processing_latency_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h3"},"server_processing_latency_milliseconds")),(0,t.yg)("p",null,"Duration from the time request is received to the time events are published. This metric is calculated per event by following formula",(0,t.yg)("inlineCode",{parentName:"p"},"(PublishedTime - ReceivedTime)/CountEvents")),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing")),(0,t.yg)("li",{parentName:"ul"},"Tags: ",(0,t.yg)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,t.yg)("h3",{id:"worker_processing_duration_milliseconds"},(0,t.yg)("inlineCode",{parentName:"h3"},"worker_processing_duration_milliseconds")),(0,t.yg)("p",null,"Duration from the time request is processed to the time events are published. This metric is calculated per event by following formula",(0,t.yg)("inlineCode",{parentName:"p"},"(PublishedTime - ProcessedTime)/CountEvents")),(0,t.yg)("ul",null,(0,t.yg)("li",{parentName:"ul"},"Type: ",(0,t.yg)("inlineCode",{parentName:"li"},"Timing"))))}_.isMDXComponent=!0},1722:(e,n,a)=>{a.d(n,{A:()=>l});const l=a.p+"assets/images/metrics_report_time-33f69ad18c2cb9067d13089abde7dc8e.svg"}}]); \ No newline at end of file diff --git a/assets/js/fc49bffc.fbdb3aa2.js b/assets/js/fc49bffc.fbdb3aa2.js deleted file mode 100644 index 1b1eb180..00000000 --- a/assets/js/fc49bffc.fbdb3aa2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[643],{3905:function(e,t,n){n.d(t,{Zo:function(){return c},kt:function(){return p}});var l=n(7294);function a(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,l)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,l,a=function(e,t){if(null==e)return{};var n,l,a={},i=Object.keys(e);for(l=0;l<i.length;l++)n=i[l],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(l=0;l<i.length;l++)n=i[l],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=l.createContext({}),u=function(e){var t=l.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=u(e.components);return l.createElement(s.Provider,{value:t},e.children)},_={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},d=l.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=u(n),p=a,k=d["".concat(s,".").concat(p)]||d[p]||_[p]||i;return n?l.createElement(k,r(r({ref:t},c),{},{components:n})):l.createElement(k,r({ref:t},c))}));function p(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o.mdxType="string"==typeof e?e:a,r[1]=o;for(var u=2;u<i;u++)r[u]=n[u];return l.createElement.apply(null,r)}return l.createElement.apply(null,n)}d.displayName="MDXCreateElement"},2723:function(e,t,n){n.r(t),n.d(t,{assets:function(){return c},contentTitle:function(){return s},default:function(){return p},frontMatter:function(){return o},metadata:function(){return u},toc:function(){return _}});var l=n(7462),a=n(3366),i=(n(7294),n(3905)),r=["components"],o={},s="Metrics",u={unversionedId:"reference/metrics",id:"reference/metrics",title:"Metrics",description:"Raccoon uses Statsd protocol as way to report metrics. You can capture the metrics using any supported statsd collector like Telegraf. This page contains reference for all the metrics for Raccoon.",source:"@site/docs/reference/metrics.md",sourceDirName:"reference",slug:"/reference/metrics",permalink:"/raccoon/reference/metrics",draft:!1,editUrl:"https://github.com/raystack/raccoon/edit/master/docs/docs/reference/metrics.md",tags:[],version:"current",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Configurations",permalink:"/raccoon/reference/configurations"},next:{title:"Contribution Process",permalink:"/raccoon/contribute/contribution"}},c={},_=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Server Connection",id:"server-connection",level:2},{value:"<code>server_ping_failure_total</code>",id:"server_ping_failure_total",level:3},{value:"<code>server_pong_failure_total</code>",id:"server_pong_failure_total",level:3},{value:"<code>connections_count_current</code>",id:"connections_count_current",level:3},{value:"<code>user_connection_success_total</code>",id:"user_connection_success_total",level:3},{value:"<code>user_connection_failure_total</code>",id:"user_connection_failure_total",level:3},{value:"<code>user_session_duration_milliseconds</code>",id:"user_session_duration_milliseconds",level:3},{value:"<code>conn_close_err_count</code>",id:"conn_close_err_count",level:3},{value:"Kafka Publisher",id:"kafka-publisher",level:2},{value:"<code>kafka_messages_delivered_total</code>",id:"kafka_messages_delivered_total",level:3},{value:"<code>kafka_messages_undelivered_total</code>",id:"kafka_messages_undelivered_total",level:3},{value:"<code>kafka_unknown_topic_failure_total</code>",id:"kafka_unknown_topic_failure_total",level:3},{value:"<code>kafka_tx_messages_total</code>",id:"kafka_tx_messages_total",level:3},{value:"<code>kafka_tx_messages_bytes_total</code>",id:"kafka_tx_messages_bytes_total",level:3},{value:"<code>kafka_brokers_tx_total</code>",id:"kafka_brokers_tx_total",level:3},{value:"<code>kafka_brokers_tx_bytes_total</code>",id:"kafka_brokers_tx_bytes_total",level:3},{value:"<code>kafka_brokers_rtt_average_milliseconds</code>",id:"kafka_brokers_rtt_average_milliseconds",level:3},{value:"<code>ack_event_rtt_ms</code>",id:"ack_event_rtt_ms",level:3},{value:"<code>event_rtt_ms</code>",id:"event_rtt_ms",level:3},{value:"<code>kafka_producebulk_tt_ms</code>",id:"kafka_producebulk_tt_ms",level:3},{value:"PubSub Publisher",id:"pubsub-publisher",level:2},{value:"<code>pubsub_messages_delivered_total</code>",id:"pubsub_messages_delivered_total",level:3},{value:"<code>pubsub_messages_undelivered_total</code>",id:"pubsub_messages_undelivered_total",level:3},{value:"<code>pubsub_unknown_topic_failure_total</code>",id:"pubsub_unknown_topic_failure_total",level:3},{value:"Kinesis Publisher",id:"kinesis-publisher",level:2},{value:"<code>kinesis_messages_delivered_total</code>",id:"kinesis_messages_delivered_total",level:3},{value:"<code>kinesis_messages_undelivered_total</code>",id:"kinesis_messages_undelivered_total",level:3},{value:"<code>kinesis_unknown_stream_failure_total</code>",id:"kinesis_unknown_stream_failure_total",level:3},{value:"Resource Usage",id:"resource-usage",level:2},{value:"<code>server_mem_gc_triggered_current</code>",id:"server_mem_gc_triggered_current",level:3},{value:"<code>server_mem_gc_pauseNs_current</code>",id:"server_mem_gc_pausens_current",level:3},{value:"<code>server_mem_gc_count_current</code>",id:"server_mem_gc_count_current",level:3},{value:"<code>server_mem_gc_pauseTotalNs_current</code>",id:"server_mem_gc_pausetotalns_current",level:3},{value:"<code>server_mem_heap_alloc_bytes_current</code>",id:"server_mem_heap_alloc_bytes_current",level:3},{value:"<code>server_mem_heap_inuse_bytes_current</code>",id:"server_mem_heap_inuse_bytes_current",level:3},{value:"<code>server_mem_heap_objects_total_current</code>",id:"server_mem_heap_objects_total_current",level:3},{value:"<code>server_go_routines_count_current</code>",id:"server_go_routines_count_current",level:3},{value:"<code>server_mem_stack_inuse_bytes_current</code>",id:"server_mem_stack_inuse_bytes_current",level:3},{value:"Event Delivery",id:"event-delivery",level:2},{value:"<code>events_rx_bytes_total</code>",id:"events_rx_bytes_total",level:3},{value:"<code>events_rx_total</code>",id:"events_rx_total",level:3},{value:"<code>events_duplicate_total</code>",id:"events_duplicate_total",level:3},{value:"<code>batches_read_total</code>",id:"batches_read_total",level:3},{value:"<code>batch_idle_in_channel_milliseconds</code>",id:"batch_idle_in_channel_milliseconds",level:3},{value:"<code>event_processing_duration_milliseconds</code>",id:"event_processing_duration_milliseconds",level:3},{value:"<code>server_processing_latency_milliseconds</code>",id:"server_processing_latency_milliseconds",level:3},{value:"<code>worker_processing_duration_milliseconds</code>",id:"worker_processing_duration_milliseconds",level:3}],d={toc:_};function p(e){var t=e.components,o=(0,a.Z)(e,r);return(0,i.kt)("wrapper",(0,l.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"metrics"},"Metrics"),(0,i.kt)("p",null,"Raccoon uses Statsd protocol as way to report metrics. You can capture the metrics using any supported statsd collector like ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/influxdata/telegraf"},"Telegraf"),". This page contains reference for all the metrics for Raccoon."),(0,i.kt)("h2",{id:"table-of-contents"},"Table of Contents"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#server-connection"},"Server Connection")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#kafka-publisher"},"Kafka Publisher")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#pubsub-publisher"},"PubSub Publisher")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#kinesis-publisher"},"Kinesis Publisher")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#resource-usage"},"Resource Usage")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/raccoon/reference/metrics#event-delivery"},"Event Delivery"))),(0,i.kt)("h2",{id:"server-connection"},"Server Connection"),(0,i.kt)("h3",{id:"server_ping_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_ping_failure_total")),(0,i.kt)("p",null,"Total ping that server fails to send"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Counting")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"server_pong_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_pong_failure_total")),(0,i.kt)("p",null,"Total pong that server fails to send"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Counting")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"connections_count_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"connections_count_current")),(0,i.kt)("p",null,"Number of alive connections"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"user_connection_success_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"user_connection_success_total")),(0,i.kt)("p",null,"Number of successful connections established to the server"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"user_connection_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"user_connection_failure_total")),(0,i.kt)("p",null,"Number of fail connections established to the server"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"reason=ugfailure")," ",(0,i.kt)("inlineCode",{parentName:"li"},"reason=exists")," ",(0,i.kt)("inlineCode",{parentName:"li"},"reason=serverlimit")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"user_session_duration_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"user_session_duration_milliseconds")),(0,i.kt)("p",null,"Duration of alive connection per session per connection"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"conn_close_err_count"},(0,i.kt)("inlineCode",{parentName:"h3"},"conn_close_err_count")),(0,i.kt)("p",null,"Number of connection close errors encountered"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: NA")),(0,i.kt)("h2",{id:"kafka-publisher"},"Kafka Publisher"),(0,i.kt)("h3",{id:"kafka_messages_delivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_messages_delivered_total")),(0,i.kt)("p",null,"Number of delivered events to Kafka. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,i.kt)("inlineCode",{parentName:"p"},"kafka_messages_undelivered_total")," metric for the same tag/labels."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"kafka_messages_undelivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_messages_undelivered_total")),(0,i.kt)("p",null,"The count of false increments done by ",(0,i.kt)("inlineCode",{parentName:"p"},"kafka_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"kafka_unknown_topic_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_unknown_topic_failure_total")),(0,i.kt)("p",null,"Number of delivery failure caused by topic does not exist in kafka."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"topic=topicname")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"kafka_tx_messages_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_tx_messages_total")),(0,i.kt)("p",null,"Total number of messages transmitted ","(","produced",")"," to Kafka brokers."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"kafka_tx_messages_bytes_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_tx_messages_bytes_total")),(0,i.kt)("p",null,"Total number of message bytes ","(","including framing, such as per-Message framing and MessageSet/batch framing",")"," transmitted to Kafka brokers"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"kafka_brokers_tx_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_brokers_tx_total")),(0,i.kt)("p",null,"Total number of requests sent to Kafka brokers"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,i.kt)("h3",{id:"kafka_brokers_tx_bytes_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_brokers_tx_bytes_total")),(0,i.kt)("p",null,"Total number of bytes transmitted to Kafka brokers"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,i.kt)("h3",{id:"kafka_brokers_rtt_average_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_brokers_rtt_average_milliseconds")),(0,i.kt)("p",null,"Broker latency / round-trip time in microseconds"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"broker=broker_nodes"))),(0,i.kt)("h3",{id:"ack_event_rtt_ms"},(0,i.kt)("inlineCode",{parentName:"h3"},"ack_event_rtt_ms")),(0,i.kt)("p",null,"Time taken from ack function called by kafka producer to processed by the ack handler."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: NA")),(0,i.kt)("h3",{id:"event_rtt_ms"},(0,i.kt)("inlineCode",{parentName:"h3"},"event_rtt_ms")),(0,i.kt)("p",null,"Time taken from event is consumed from the queue to be acked by the ack handler."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: NA")),(0,i.kt)("h3",{id:"kafka_producebulk_tt_ms"},(0,i.kt)("inlineCode",{parentName:"h3"},"kafka_producebulk_tt_ms")),(0,i.kt)("p",null,"Response time of produce batch method of the kafka producer"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: NA")),(0,i.kt)("h2",{id:"pubsub-publisher"},"PubSub Publisher"),(0,i.kt)("h3",{id:"pubsub_messages_delivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"pubsub_messages_delivered_total")),(0,i.kt)("p",null,"Number of delivered events to PubSub. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,i.kt)("inlineCode",{parentName:"p"},"pubsub_messages_undelivered_total")," metric for the same tag/labels."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"pubsub_messages_undelivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"pubsub_messages_undelivered_total")),(0,i.kt)("p",null,"The count of false increments done by ",(0,i.kt)("inlineCode",{parentName:"p"},"pubsub_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"pubsub_unknown_topic_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"pubsub_unknown_topic_failure_total")),(0,i.kt)("p",null,"Number of delivery failure caused by topic does not exist in PubSub."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"topic=topicname")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h2",{id:"kinesis-publisher"},"Kinesis Publisher"),(0,i.kt)("h3",{id:"kinesis_messages_delivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kinesis_messages_delivered_total")),(0,i.kt)("p",null,"Number of delivered events to Kinesis. The metric also contains false increments. To find the true value, one should use the difference between this and ",(0,i.kt)("inlineCode",{parentName:"p"},"kinesis_messages_undelivered_total")," metric for the same tag/labels."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"kinesis_messages_undelivered_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kinesis_messages_undelivered_total")),(0,i.kt)("p",null,"The count of false increments done by ",(0,i.kt)("inlineCode",{parentName:"p"},"kinesis_messages_delivered_total"),". To be used in conjunction with the former for accurate metrics."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"success=false")," ",(0,i.kt)("inlineCode",{parentName:"li"},"success=true")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"kinesis_unknown_stream_failure_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"kinesis_unknown_stream_failure_total")),(0,i.kt)("p",null,"Number of delivery failure caused by stream does not exist in Kinesis."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"stream=streamname")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h2",{id:"resource-usage"},"Resource Usage"),(0,i.kt)("h3",{id:"server_mem_gc_triggered_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_gc_triggered_current")),(0,i.kt)("p",null,"The time the last garbage collection finished in Unix timestamp"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_gc_pausens_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_gc_pauseNs_current")),(0,i.kt)("p",null,"Circular buffer of recent GC stop-the-world in Unix timestamp"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_gc_count_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_gc_count_current")),(0,i.kt)("p",null,"The number of completed GC cycle"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_gc_pausetotalns_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_gc_pauseTotalNs_current")),(0,i.kt)("p",null,"The cumulative nanoseconds in GC stop-the-world pauses since the program started"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_heap_alloc_bytes_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_heap_alloc_bytes_current")),(0,i.kt)("p",null,"Bytes of allocated heap objects"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_heap_inuse_bytes_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_heap_inuse_bytes_current")),(0,i.kt)("p",null,"HeapInuse is bytes in in-use spans"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_heap_objects_total_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_heap_objects_total_current")),(0,i.kt)("p",null,"Number of allocated heap objects"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_go_routines_count_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_go_routines_count_current")),(0,i.kt)("p",null,"Number of goroutine spawn in a single flush"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h3",{id:"server_mem_stack_inuse_bytes_current"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_mem_stack_inuse_bytes_current")),(0,i.kt)("p",null,"Bytes in stack spans"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Gauge"))),(0,i.kt)("h2",{id:"event-delivery"},"Event Delivery"),(0,i.kt)("p",null,"Following metrics are event delivery reports. Each metrics reported at a different point in time. See the diagram below for to understand when each metrics are reported."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Diagram",src:n(5879).Z,width:"585",height:"381"})),(0,i.kt)("h3",{id:"events_rx_bytes_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"events_rx_bytes_total")),(0,i.kt)("p",null,"Total byte receieved in requests"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"events_rx_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"events_rx_total")),(0,i.kt)("p",null,"Number of events received in requests"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"event_type=*"))),(0,i.kt)("h3",{id:"events_duplicate_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"events_duplicate_total")),(0,i.kt)("p",null,"Number of duplicate events"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"reason=*"))),(0,i.kt)("h3",{id:"batches_read_total"},(0,i.kt)("inlineCode",{parentName:"h3"},"batches_read_total")),(0,i.kt)("p",null,"Request count"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Count")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"status=failed")," ",(0,i.kt)("inlineCode",{parentName:"li"},"status=success")," ",(0,i.kt)("inlineCode",{parentName:"li"},"reason=*")," ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"batch_idle_in_channel_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"batch_idle_in_channel_milliseconds")),(0,i.kt)("p",null,"Duration from when the request is received to when the request is processed. High value of this metric indicates the publisher is slow."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"worker=worker-name"))),(0,i.kt)("h3",{id:"event_processing_duration_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"event_processing_duration_milliseconds")),(0,i.kt)("p",null,"Duration from the time request is sent to the time events are published. This metric is calculated per event by following formula ",(0,i.kt)("inlineCode",{parentName:"p"},"(PublishedTime - SentTime)/CountEvents")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"server_processing_latency_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"server_processing_latency_milliseconds")),(0,i.kt)("p",null,"Duration from the time request is receieved to the time events are published. This metric is calculated per event by following formula",(0,i.kt)("inlineCode",{parentName:"p"},"(PublishedTime - ReceievedTime)/CountEvents")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing")),(0,i.kt)("li",{parentName:"ul"},"Tags: ",(0,i.kt)("inlineCode",{parentName:"li"},"conn_group=*"))),(0,i.kt)("h3",{id:"worker_processing_duration_milliseconds"},(0,i.kt)("inlineCode",{parentName:"h3"},"worker_processing_duration_milliseconds")),(0,i.kt)("p",null,"Duration from the time request is processed to the time events are published. This metric is calculated per event by following formula",(0,i.kt)("inlineCode",{parentName:"p"},"(PublishedTime - ProcessedTime)/CountEvents")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Type: ",(0,i.kt)("inlineCode",{parentName:"li"},"Timing"))))}p.isMDXComponent=!0},5879:function(e,t,n){t.Z=n.p+"assets/images/metrics_report_time-33f69ad18c2cb9067d13089abde7dc8e.svg"}}]); \ No newline at end of file diff --git a/assets/js/main.3588fb71.js b/assets/js/main.3588fb71.js new file mode 100644 index 00000000..d87a43aa --- /dev/null +++ b/assets/js/main.3588fb71.js @@ -0,0 +1,2 @@ +/*! For license information please see main.3588fb71.js.LICENSE.txt */ +(self.webpackChunkraccoon=self.webpackChunkraccoon||[]).push([[792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),a=n(8168),o=n(3259),i=n.n(o),l=n(4054);const s={"010df87a":[()=>n.e(612).then(n.bind(n,5054)),"@site/docs/reference/benchmarks.md",5054],"03be7dae":[()=>n.e(768).then(n.bind(n,9868)),"@site/docs/guides/troubleshooting.md",9868],"0dffb83e":[()=>n.e(821).then(n.bind(n,5146)),"@site/docs/roadmap.md",5146],"1425879c":[()=>n.e(228).then(n.bind(n,4369)),"@site/docs/guides/publishing.md",4369],17896441:[()=>Promise.all([n.e(869),n.e(553),n.e(401)]).then(n.bind(n,7720)),"@theme/DocItem",7720],"1be78505":[()=>Promise.all([n.e(869),n.e(714)]).then(n.bind(n,8067)),"@theme/DocPage",8067],"338d3fa8":[()=>n.e(693).then(n.bind(n,3597)),"@site/docs/contribute/release.md",3597],"3585ba8f":[()=>n.e(187).then(n.t.bind(n,1966,19)),"/home/runner/work/raccoon/raccoon/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",1966],58175526:[()=>n.e(718).then(n.bind(n,5133)),"@site/docs/reference/configurations.md",5133],"7de6ea50":[()=>Promise.all([n.e(869),n.e(226)]).then(n.bind(n,9358)),"@site/docs/guides/monitoring.md",9358],"7ff2cdfe":[()=>n.e(342).then(n.bind(n,6757)),"@site/docs/contribute/development.md",6757],"8070e160":[()=>Promise.all([n.e(869),n.e(553),n.e(822)]).then(n.bind(n,6750)),"@site/docs/quickstart.md",6750],"8a1416ba":[()=>n.e(699).then(n.bind(n,6983)),"@site/docs/concepts/architecture.md",6983],"935f2afb":[()=>n.e(581).then(n.t.bind(n,5610,19)),"~docs/default/version-current-metadata-prop-751.json",5610],a09c2993:[()=>n.e(899).then(n.bind(n,6740)),"@site/docs/introduction.md",6740],c5e4a08a:[()=>n.e(758).then(n.bind(n,8567)),"@site/docs/guides/overview.md",8567],caaf7770:[()=>Promise.all([n.e(869),n.e(669)]).then(n.bind(n,2163)),"@site/docs/guides/deployment.md",2163],d9e16301:[()=>n.e(416).then(n.bind(n,6073)),"@site/docs/support.md",6073],f3275a05:[()=>n.e(24).then(n.bind(n,2536)),"@site/docs/contribute/contribution.md",2536],fadecd94:[()=>n.e(771).then(n.bind(n,1427)),"@site/docs/concepts/structure.md",1427],fc49bffc:[()=>n.e(462).then(n.bind(n,3729)),"@site/docs/reference/metrics.md",3729]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(6921),d=n(3102);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(774).then(n.bind(n,1774)),modules:["@theme/NotFound"],webpack:()=>[1774],render(e,t){const n=e.default;return r.createElement(d.W,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,c.A)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.W,{value:s},r.createElement(l,(0,a.A)({},i,n)))}})}const p=[{path:"/raccoon/",component:f("/raccoon/","7c4"),routes:[{path:"/raccoon/",component:f("/raccoon/","550"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/concepts/architecture",component:f("/raccoon/concepts/architecture","4a8"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/concepts/structure",component:f("/raccoon/concepts/structure","b0f"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/contribution",component:f("/raccoon/contribute/contribution","2b1"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/development",component:f("/raccoon/contribute/development","38e"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/release",component:f("/raccoon/contribute/release","a64"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/deployment",component:f("/raccoon/guides/deployment","190"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/monitoring",component:f("/raccoon/guides/monitoring","213"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/overview",component:f("/raccoon/guides/overview","fc4"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/publishing",component:f("/raccoon/guides/publishing","752"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/troubleshooting",component:f("/raccoon/guides/troubleshooting","bfe"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/quickstart",component:f("/raccoon/quickstart","114"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/reference/benchmarks",component:f("/raccoon/reference/benchmarks","068"),exact:!0},{path:"/raccoon/reference/configurations",component:f("/raccoon/reference/configurations","a76"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/reference/metrics",component:f("/raccoon/reference/metrics","351"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/roadmap",component:f("/raccoon/roadmap","182"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/support",component:f("/raccoon/support","a67"),exact:!0}]},{path:"*",component:f("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>o});var r=n(6540);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},5660:(e,t,n)=>{"use strict";var r=n(6540),a=n(961),o=n(4625),i=n(545),l=n(8193);const s=[n(296),n(119),n(6134),n(6294),n(7951),n(5086)];var u=n(8328),c=n(2681),d=n(2831);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(8168),m=n(5260),g=n(4586),h=n(6025),b=n(2131),v=n(6342),y=n(4090),w=n(1003),E=n(2967),k=n(1463);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.A)(),n=(0,b.o)();return r.createElement(m.A,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),a=function(){const{siteConfig:{url:e}}=(0,g.A)(),{pathname:t}=(0,c.zy)();return e+(0,h.A)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.A,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,v.p)();return r.createElement(r.Fragment,null,r.createElement(m.A,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:y.w})),n&&r.createElement(w.be,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.A,{tag:E.Cy,locale:e}),r.createElement(m.A,null,t.map(((e,t)=>r.createElement("meta",(0,p.A)({key:t},e))))))}const A=new Map;function C(e){if(A.has(e.pathname))return{...e,pathname:A.get(e.pathname)};if((0,d.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}var T=n(6125),N=n(6988);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const a=s.map((t=>{var r;const a=(null==(r=t.default)?void 0:r[e])??t[e];return null==a?void 0:a(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const L=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),O("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=(0,d.u)(u.A,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(L,{previousLocation:this.previousLocation,location:t},r.createElement(c.qh,{location:t,render:()=>e}))}}const I=R,M="docusaurus-base-url-issue-banner-container",D="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${D}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseurl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${F}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${F}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function $(){const{siteConfig:{baseUrl:e}}=(0,g.A)();return(0,r.useLayoutEffect)((()=>{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.A.canUseDOM&&r.createElement(m.A,null,r.createElement("script",null,z(e))),r.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.A)(),{pathname:n}=(0,c.zy)();return t&&n===e?r.createElement($,null):null}function j(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,g.A)(),o=(0,h.A)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.A,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var H=n(7489);function V(){const e=(0,d.v)(u.A),t=(0,c.zy)();return r.createElement(H.A,null,r.createElement(N.l,null,r.createElement(T.x,null,r.createElement(f,null,r.createElement(j,null),r.createElement(_,null),r.createElement(U,null),r.createElement(I,{location:C(t)},e)))))}var G=n(4054);const W=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r;if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??(null==(r=document.getElementsByName("script")[0])?void 0:r.parentNode);null==o||o.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var q=n(6921);const Y=new Set,K=new Set,Q=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},X={prefetch(e){if(!(e=>!Q()&&!K.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,q.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Q()&&!K.has(e))(e)&&(K.add(e),P(e))},Z=Object.freeze(X);if(l.A.canUseDOM){window.docusaurus=Z;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.vd,null,r.createElement(o.Kd,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>c,l:()=>d});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-XXX","anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/raccoon/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/raccoon/","mainDocId":"introduction","docs":[{"id":"concepts/architecture","path":"/raccoon/concepts/architecture","sidebar":"docsSidebar"},{"id":"concepts/structure","path":"/raccoon/concepts/structure","sidebar":"docsSidebar"},{"id":"contribute/contribution","path":"/raccoon/contribute/contribution","sidebar":"docsSidebar"},{"id":"contribute/development","path":"/raccoon/contribute/development","sidebar":"docsSidebar"},{"id":"contribute/release","path":"/raccoon/contribute/release","sidebar":"docsSidebar"},{"id":"guides/deployment","path":"/raccoon/guides/deployment","sidebar":"docsSidebar"},{"id":"guides/monitoring","path":"/raccoon/guides/monitoring","sidebar":"docsSidebar"},{"id":"guides/overview","path":"/raccoon/guides/overview","sidebar":"docsSidebar"},{"id":"guides/publishing","path":"/raccoon/guides/publishing","sidebar":"docsSidebar"},{"id":"guides/troubleshooting","path":"/raccoon/guides/troubleshooting","sidebar":"docsSidebar"},{"id":"introduction","path":"/raccoon/","sidebar":"docsSidebar"},{"id":"quickstart","path":"/raccoon/quickstart","sidebar":"docsSidebar"},{"id":"reference/benchmarks","path":"/raccoon/reference/benchmarks"},{"id":"reference/configurations","path":"/raccoon/reference/configurations","sidebar":"docsSidebar"},{"id":"reference/metrics","path":"/raccoon/reference/metrics","sidebar":"docsSidebar"},{"id":"roadmap","path":"/raccoon/roadmap","sidebar":"docsSidebar"},{"id":"support","path":"/raccoon/support"}],"draftIds":[],"sidebars":{"docsSidebar":{"link":{"path":"/raccoon/","label":"introduction"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"0.0.0-5124","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"0.0.0-5124"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"0.0.0-5124"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"0.0.0-5124"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"0.0.0-5124"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"0.0.0-5124"}}}'),u={siteConfig:a.A,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),a=n(8193),o=n(5260),i=n(5173);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.A,null,r.createElement("title",null,"Page Error")),r.createElement(i.A,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:r,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&!!window.screen}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(545);function o(e){return r.createElement(a.mg,e)}},5489:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(8168),a=n(6540),o=n(4625),i=n(440),l=n(4586),s=n(6654),u=n(8193);const c=a.createContext({collectLink:()=>{}});var d=n(6025);function f(e,t){var n;let{isNavLink:f,to:p,href:m,activeClassName:g,isActive:h,"data-noBrokenLinkCheck":b,autoAddBaseUrl:v=!0,...y}=e;const{siteConfig:{trailingSlash:w,baseUrl:E}}=(0,l.A)(),{withBaseUrl:k}=(0,d.h)(),S=(0,a.useContext)(c),x=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>x.current));const _=p||m;const A=(0,s.A)(_),C=null==_?void 0:_.replace("pathname://","");let T=void 0!==C?(N=C,v&&(e=>e.startsWith("/"))(N)?k(N):N):void 0;var N;T&&A&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:w,baseUrl:E}));const O=(0,a.useRef)(!1),L=f?o.k2:o.N_,P=u.A.canUseIntersectionObserver,R=(0,a.useRef)();(0,a.useEffect)((()=>(!P&&A&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&R.current&&R.current.disconnect()})),[R,T,P,A]);const I=(null==(n=T)?void 0:n.startsWith("#"))??!1,M=!T||!A||I;return M||b||S.collectLink(T),M?a.createElement("a",(0,r.A)({ref:x,href:T},_&&!A&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(L,(0,r.A)({},y,{onMouseEnter:()=>{O.current||null==T||(window.docusaurus.preload(T),O.current=!0)},innerRef:e=>{x.current=e,P&&e&&A&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T},f&&{isActive:h,activeClassName:g}))}const p=a.forwardRef(f)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>s,T:()=>l});var r=n(6540);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(2654);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{A:()=>i,h:()=>o});var r=n(4586),a=n(6654);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.A)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.z)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>o,o:()=>a});var r=n(6540);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>g,vT:()=>f,Gy:()=>c,HW:()=>h,ht:()=>d,r7:()=>m,jh:()=>p});var r=n(2681),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},296:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1258),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.A,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(7650)(`./prism-${e}`)})),delete globalThis.Prism}(r.A)},2523:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const a={iconExternalLink:"iconExternalLink_lCJq"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},5173:(e,t,n)=>{"use strict";n.d(t,{A:()=>Xe});var r=n(6540),a=n(53),o=n(7489),i=n(4090),l=n(1003),s=n(7559),u=n(1312),c=n(2681),d=n(5062);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p={skipToContent:"skipToContent_fXgn"};function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,c.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.querySelector(`.${s.G.wrapper.main}`);t&&f(t)}),[]);return(0,d.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p.skipToContent,onClick:t},r.createElement(u.A,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var g=n(5041),h=n(6342),b=n(8168);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.A)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function w(){const{isActive:e,close:t}=(0,g.Mj)(),{announcementBar:n}=(0,h.p)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y.announcementBar,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:y.announcementBarPlaceholder}),r.createElement("div",{className:y.announcementBarContent,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.A)("clean-btn close",y.announcementBarClose),onClick:t,"aria-label":(0,u.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var E=n(9876),k=n(3104);var S=n(9532),x=n(5600);const _=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,E.M)(),t=(0,x.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,S.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(_.Provider,{value:n},t)}function C(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function T(){const e=(0,r.useContext)(_);if(!e)throw new S.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,x.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:C(o)})),[a,o,t])}function N(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=T();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var O=n(5293),L=n(2303);function P(e){return r.createElement("svg",(0,b.A)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function R(e){return r.createElement("svg",(0,b.A)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const I={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function M(e){let{className:t,value:n,onChange:o}=e;const i=(0,L.A)(),l=(0,u.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.A)(I.toggle,t)},r.createElement("button",{className:(0,a.A)("clean-btn",I.toggleButton,!i&&I.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(P,{className:(0,a.A)(I.toggleIcon,I.lightToggleIcon)}),r.createElement(R,{className:(0,a.A)(I.toggleIcon,I.darkToggleIcon)})))}const D=r.memo(M);function F(e){let{className:t}=e;const n=(0,h.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,O.G)();return n?null:r.createElement(D,{className:t,value:a,onChange:o})}var B=n(3465);function z(){return r.createElement(B.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function $(){const e=(0,E.M)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function U(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(z,null),r.createElement(F,{className:"margin-right--md"}),r.createElement($,null))}var j=n(5489),H=n(6025),V=n(6654);function G(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var W=n(2523);function q(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:u,...c}=e;const d=(0,H.A)(a),f=(0,H.A)(t),p=(0,H.A)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,V.A)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(W.A,s&&{width:12,height:12}))};return o?r.createElement(j.A,(0,b.A)({href:u?p:o},c,g)):r.createElement(j.A,(0,b.A)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?G(n,t.pathname):t.pathname.startsWith(f)},c,g))}function Y(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(q,(0,b.A)({className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function K(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(q,(0,b.A)({className:(0,a.A)("menu__link",t)},o)))}function Q(e){let{mobile:t=!1,position:n,...a}=e;const o=t?K:Y;return r.createElement(o,(0,b.A)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var X=n(9169),Z=n(4586);var J=n(1422);function ee(e,t){return e.some((e=>function(e,t){return!!(0,X.ys)(e.to,t)||!!G(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function te(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,c]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&c(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[s]),r.createElement("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(q,(0,b.A)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),c(!u))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>r.createElement(ge,(0,b.A)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),c(!1);const t=s.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function ne(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const s=function(){const{siteConfig:{baseUrl:e}}=(0,Z.A)(),{pathname:t}=(0,c.zy)();return t.replace(e,"/")}(),u=ee(t,s),{collapsed:d,toggleCollapsed:f,setCollapsed:p}=(0,J.u)({initialState:()=>!u});return(0,r.useEffect)((()=>{u&&p(!u)}),[s,u,p]),r.createElement("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":d})},r.createElement(q,(0,b.A)({role:"button",className:(0,a.A)("menu__link menu__link--sublist menu__link--sublist-caret",n)},l,{onClick:e=>{e.preventDefault(),f()}}),l.children??l.label),r.createElement(J.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:d},t.map(((e,t)=>r.createElement(ge,(0,b.A)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function re(e){let{mobile:t=!1,...n}=e;const a=t?ne:te;return r.createElement(a,n)}var ae=n(2131);function oe(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.A)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ie="iconLanguage_nlXk";const le=()=>null,se={searchBox:"searchBox_ZlJk"};function ue(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.A)(n,se.searchBox)},t)}var ce=n(4070),de=n(4142);var fe=n(5597);const pe=e=>e.docs.find((t=>t.id===e.mainDocId));const me={default:Q,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,Z.A)(),c=(0,ae.o)(),d=[...n,...l.map((e=>{const n=`pathname://${c.createUrl({locale:e,fullyQualified:!1})}`;return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],f=t?(0,u.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(re,(0,b.A)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(oe,{className:ie}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ue,{className:n},r.createElement(le,null))},dropdown:re,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.A)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ce.zK)(a),l=(0,de.QB)(t,a);return null===l?null:r.createElement(Q,(0,b.A)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ce.zK)(a),l=(0,de.fW)(t,a).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(Q,(0,b.A)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,de.Vd)(a)[0],l=t??i.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(Q,(0,b.A)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,ce.zK)(n),c=(0,ce.jh)(n),{savePreferredVersionName:d}=(0,fe.g1)(n),f=[...o,...c.map((e=>{const t=s.alternateDocVersions[e.name]??pe(e);return{label:e.label,to:t.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,de.Vd)(n)[0],m=t&&f.length>1?(0,u.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,g=t&&f.length>1?void 0:pe(p).path;return f.length<=1?r.createElement(Q,(0,b.A)({},l,{mobile:t,label:m,to:g,isActive:a?()=>!1:void 0})):r.createElement(re,(0,b.A)({},l,{mobile:t,label:m,to:g,items:f,isActive:a?()=>!1:void 0}))}};function ge(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=me[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function he(){const e=(0,E.M)(),t=(0,h.p)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(ge,(0,b.A)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function be(e){return r.createElement("button",(0,b.A)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function ve(){const e=0===(0,h.p)().navbar.items.length,t=T();return r.createElement(r.Fragment,null,!e&&r.createElement(be,{onClick:()=>t.hide()}),t.content)}function ye(){const e=(0,E.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(N,{header:r.createElement(U,null),primaryMenu:r.createElement(he,null),secondaryMenu:r.createElement(ve,null)}):null}const we={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ee(e){return r.createElement("div",(0,b.A)({role:"presentation"},e,{className:(0,a.A)("navbar-sidebar__backdrop",e.className)}))}function ke(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,h.p)(),i=(0,E.M)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,k.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=null==r?void 0:r.scrollY,s=document.documentElement.scrollHeight-o.current,u=window.innerHeight;l&&i>=l?n(!1):i+u<s&&n(!0)})),(0,d.$)((t=>{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.A)("navbar","navbar--fixed-top",n&&[we.navbarHideable,!s&&we.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ee,{onClick:i.toggle}),r.createElement(ye,null))}const Se="right";function xe(e){let{children:t}=e;return r.createElement(x.y_,null,r.createElement(E.e,null,r.createElement(A,null,t)))}function _e(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.A)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Ae(){const e=(0,E.M)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(_e,null))}const Ce={colorModeToggle:"colorModeToggle_DEke"};function Te(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(ge,(0,b.A)({},e,{key:t})))))}function Ne(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Oe(){const e=(0,E.M)(),t=(0,h.p)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Se)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ne,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ae,null),r.createElement(z,null),r.createElement(Te,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Te,{items:a}),r.createElement(F,{className:Ce.colorModeToggle}),!o&&r.createElement(ue,null,r.createElement(le,null)))})}function Le(){return r.createElement(ke,null,r.createElement(Oe,null))}function Pe(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,H.A)(n),u=(0,H.A)(a,{forcePrependBaseUrl:!0});return r.createElement(j.A,(0,b.A)({className:"footer__link-item"},a?{href:i?u:a}:{to:s},l),o,a&&!(0,V.A)(a)&&r.createElement(W.A,null))}function Re(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Pe,{item:t}))}function Ie(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Re,{key:t,item:e})))))}function Me(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ie,{key:t,column:e}))))}function De(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Fe(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Pe,{item:t})}function Be(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(Fe,{item:e}),t.length!==n+1&&r.createElement(De,null))))))}function ze(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Me,{columns:t}):r.createElement(Be,{links:t})}var $e=n(1653);const Ue={footerLogoLink:"footerLogoLink_BH7S"};function je(e){let{logo:t}=e;const{withBaseUrl:n}=(0,H.h)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement($e.A,{className:"footer__logo",alt:t.alt,sources:a,width:t.width,height:t.height})}function He(e){let{logo:t}=e;return t.href?r.createElement(j.A,{href:t.href,className:Ue.footerLogoLink,target:t.target},r.createElement(je,{logo:t})):r.createElement(je,{logo:t})}function Ve(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ge(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function We(){const{footer:e}=(0,h.p)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ge,{style:o,links:n&&n.length>0&&r.createElement(ze,{links:n}),logo:a&&r.createElement(He,{logo:a}),copyright:t&&r.createElement(Ve,{copyright:t})})}const qe=r.memo(We);var Ye=n(4595);function Ke(e){let{children:t}=e;return r.createElement(O.a,null,r.createElement(g.oq,null,r.createElement(Ye.B,null,r.createElement(k.Tv,null,r.createElement(fe.VQ,null,r.createElement(l.Jx,null,r.createElement(xe,null,t)))))))}function Qe(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}function Xe(e){const{children:t,noFooter:n,wrapperClassName:u,title:c,description:d}=e;return(0,i.J)(),r.createElement(Ke,null,r.createElement(l.be,{title:c,description:d}),r.createElement(m,null),r.createElement(w,null),r.createElement(Le,null),r.createElement("div",{className:(0,a.A)(s.G.wrapper.main,u)},r.createElement(o.A,{fallback:e=>r.createElement(Qe,e)},t)),!n&&r.createElement(qe,null))}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(8168),a=n(6540),o=n(5489),i=n(6025),l=n(4586),s=n(6342),u=n(1653);function c(e){const{siteConfig:{title:t}}=(0,l.A)(),{navbar:{title:n,logo:c={src:""}}}=(0,s.p)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.A)(c.href||"/"),g={light:(0,i.A)(c.src),dark:(0,i.A)(c.srcDark||c.src)},h=a.createElement(u.A,{sources:g,height:c.height,width:c.width,alt:c.alt||n||t});return a.createElement(o.A,(0,r.A)({to:m},p,c.target&&{target:c.target}),c.src&&(d?a.createElement("div",{className:d},h):h),null!=n&&a.createElement("b",{className:f},n))}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(5260);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.A,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},1653:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(8168),a=n(6540),o=n(53),i=n(2303),l=n(5293);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.A)(),{colorMode:n}=(0,l.G)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.A)({key:e,src:u[e],alt:d,className:(0,o.A)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>g,u:()=>l});var r=n(8168),a=n(6540),o=n(8193);const i="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=(null==r?void 0:r.duration)??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${(null==r?void 0:r.easing)??i}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.A.canUseDOM)return e?s:u}function p(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return d({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),null==i||i(n))},className:l},r)}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(p,(0,r.A)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?m:p;return a.createElement(r,n)}},5041:(e,t,n)=>{"use strict";n.d(t,{Mj:()=>m,oq:()=>p});var r=n(6540),a=n(2303),o=n(9466),i=n(9532),l=n(6342);const s=(0,o.W)("docusaurus.announcement.dismiss"),u=(0,o.W)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>h,a:()=>g});var r=n(6540),a=n(8193),o=n(9532),i=n(9466),l=n(6342);const s=r.createContext(void 0),u="theme",c=(0,i.W)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>h,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(4142),s=n(9532),u=n(9466);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.W)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return l.C5?r.createElement(g,null,t):t}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>s});var r=n(6540),a=n(9532);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.dV("DocsSidebarProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>p});var r=n(6540),a=n(5600),o=n(4581),i=n(2681),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l.qd)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>s,YL:()=>l,y_:()=>i});var r=n(6540),a=n(9532);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4595:(e,t,n)=>{"use strict";n.d(t,{B:()=>s,x:()=>u});var r=n(6540),a=n(9466),o=n(9532);const i="docusaurus.tab.",l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,a.W)(`${i}${e}`).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,a.E)().forEach((t=>{if(t.startsWith(i)){const n=t.substring(i.length);e[n]=(0,a.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const o=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:o})),[e,o])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new o.dV("TabGroupChoiceProvider");return e}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>u});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.A.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},4142:(e,t,n)=>{"use strict";n.d(t,{C5:()=>d,OF:()=>h,QB:()=>y,Vd:()=>b,_o:()=>f,fW:()=>v,mz:()=>w,w8:()=>g});var r=n(6540),a=n(2681),o=n(2831),i=n(4070),l=n(5597),s=n(6588),u=n(1682),c=n(9169);const d=!!i.Gy;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(){var e;const t=(0,s.t)(),{pathname:n}=(0,a.zy)();if(!1===(null==(e=(0,i.vT)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const a of t)if("category"===a.type&&((0,c.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,c.ys)(a.href,n))return r.push(a),!0;return!1}(t.items),r.reverse()}function b(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,u.s)([t,n,a].filter(Boolean))),[t,n,a])}function v(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.s)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function w(e){let{route:t,versionMetadata:n}=e;const r=(0,a.zy)(),i=t.routes,l=i.find((e=>(0,a.B6)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.v)(i,{versionMetadata:n}),sidebarName:s,sidebarItems:u}}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{X:()=>r,s:()=>a})},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>c,Jx:()=>p});var r=n(6540),a=n(53),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(4586);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.h)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.A,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.A)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.A,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.A)(o,i)},t)}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>s,ZC:()=>i,dV:()=>l,qd:()=>o});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a;super(),this.name="ReactContextError",this.message=`Hook ${(null==(n=this.stack)||null==(r=n.split("\n")[1])||null==(a=r.match(/at (?:\w+\.)?(?<name>\w+)/))?void 0:a.groups.name)??""} is called outside the <${e}>. ${t??""}`}}function s(e){return(0,r.useMemo)((()=>e),[...Object.keys(e),...Object.values(e)])}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:`${e}/`)?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>d,Tv:()=>s,a_:()=>f,gk:()=>p});var r=n(6540),a=n(8193),o=n(2303),i=n(9532);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const c=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.qd)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=u(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{null==n.current||n.current()})),{blockElementScrollPositionUntilNextRender:a}}function p(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},9466:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,W:()=>l});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r<t.length;r+=1){const e=t.key(r);null!==e&&n.push(e)}return n}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>o});var r=n(4586),a=n(2681);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.A)(),{pathname:i}=(0,a.zy)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(2681),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o.qd)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},53:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n);else for(t in e)e[t]&&(a&&(a+=" "),a+=t);return a}function a(){for(var e,t,n=0,a="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}n.d(t,{A:()=>a})},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>A,yJ:()=>p,sC:()=>T,AO:()=>f});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),s=t&&a(t),u=l||s;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8997);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(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 d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var g=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),g||(0,l.A)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,u=i.forceRefresh,w=void 0!==u&&u,E=i.getUserConfirmation,k=void 0===E?h:E,S=i.keyLength,x=void 0===S?6:S,_=e.basename?d(s(e.basename)):"";function A(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=c(o,_)),p(o,r,n)}function C(){return Math.random().toString(36).substr(2,x)}var T=m();function N(e){(0,r.A)(U,e),U.length=n.length,T.notifyListeners(U.location,U.action)}function O(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(A(e.state))}function L(){R(A(y()))}var P=!1;function R(e){if(P)P=!1,N();else{T.confirmTransitionTo(e,"POP",k,(function(t){t?N({action:"POP",location:e}):function(e){var t=U.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(P=!0,F(a))}(e)}))}}var I=A(y()),M=[I.key];function D(e){return _+f(e)}function F(e){n.go(e)}var B=0;function z(e){1===(B+=e)&&1===e?(window.addEventListener(b,O),o&&window.addEventListener(v,L)):0===B&&(window.removeEventListener(b,O),o&&window.removeEventListener(v,L))}var $=!1;var U={length:n.length,action:"POP",location:I,createHref:D,push:function(e,t){var r="PUSH",o=p(e,t,C(),U.location);T.confirmTransitionTo(o,r,k,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=M.indexOf(U.location.key),u=M.slice(0,s+1);u.push(o.key),M=u,N({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,C(),U.location);T.confirmTransitionTo(o,r,k,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=M.indexOf(U.location.key);-1!==s&&(M[s]=o.key),N({action:r,location:o})}else window.location.replace(t)}}))},go:F,goBack:function(){F(-1)},goForward:function(){F(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return $||(z(1),$=!0),function(){return $&&($=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-1),t()}}};return U}var E="hashchange",k={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+u(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:u,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function x(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function A(e){void 0===e&&(e={}),g||(0,l.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?h:a,i=n.hashType,u=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",v=k[u],y=v.encodePath,w=v.decodePath;function A(){var e=w(x());return b&&(e=c(e,b)),p(e)}var C=m();function T(e){(0,r.A)($,e),$.length=t.length,C.notifyListeners($.location,$.action)}var N=!1,O=null;function L(){var e,t,n=x(),r=y(n);if(n!==r)_(r);else{var a=A(),i=$.location;if(!N&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(O===f(a))return;O=null,function(e){if(N)N=!1,T();else{var t="POP";C.confirmTransitionTo(e,t,o,(function(n){n?T({action:t,location:e}):function(e){var t=$.location,n=M.lastIndexOf(f(t));-1===n&&(n=0);var r=M.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(N=!0,D(a))}(e)}))}}(a)}}var P=x(),R=y(P);P!==R&&_(R);var I=A(),M=[f(I)];function D(e){t.go(e)}var F=0;function B(e){1===(F+=e)&&1===e?window.addEventListener(E,L):0===F&&window.removeEventListener(E,L)}var z=!1;var $={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,$.location);C.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);if(x()!==a){O=t,function(e){window.location.hash=e}(a);var o=M.lastIndexOf(f($.location)),i=M.slice(0,o+1);i.push(t),M=i,T({action:n,location:r})}else T()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,$.location);C.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);x()!==a&&(O=t,_(a));var o=M.indexOf(f($.location));-1!==o&&(M[o]=t),T({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return z||(B(1),z=!0),function(){return z&&(z=!1,B(-1)),t()}},listen:function(e){var t=C.appendListener(e);return B(1),function(){B(-1),t()}}};return $}function C(e,t,n){return Math.min(Math.max(e,t),n)}function T(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,u=void 0===s?6:s,c=m();function d(e){(0,r.A)(w,e),w.length=w.entries.length,c.notifyListeners(w.location,w.action)}function g(){return Math.random().toString(36).substr(2,u)}var h=C(l,0,o.length-1),b=o.map((function(e){return p(e,void 0,"string"==typeof e?g():e.key||g())})),v=f;function y(e){var t=C(w.index+e,0,w.entries.length-1),r=w.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var r="PUSH",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||r&&r[b]||g&&g[b]||l&&l[b])){var v=f(n,b);try{u(t,b,v)}catch(y){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},5086:(e,t,n)=>{"use strict";n.r(t)},7951:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=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:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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())}),r.trickleSpeed)};return r.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)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.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 l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},5228:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var u in o=Object(arguments[s]))n.call(o,u)&&(l[u]=o[u]);if(t){i=t(o);for(var c=0;c<i.length;c++)r.call(o,i[c])&&(l[i[c]]=o[i[c]])}}return l}},1258:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var u=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===u&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],u=r.util.type(s);"Object"!==u||o[i(s)]?"Array"!==u||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return r.hooks.run("before-tokenize",o),o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,c,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var g=p[m],h=g.inside,b=!!g.lookbehind,v=!!g.greedy,y=g.alias;if(v&&!g.pattern.global){var w=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,w+"g")}for(var E=g.pattern||g,k=l.next,S=c;k!==t.tail&&!(d&&S>=d.reach);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,A=1;if(v){if(!(_=o(E,S,e,b))||_.index>=e.length)break;var C=_.index,T=_.index+_[0].length,N=S;for(N+=k.value.length;C>=N;)N+=(k=k.next).value.length;if(S=N-=k.value.length,k.value instanceof a)continue;for(var O=k;O!==t.tail&&(N<T||"string"==typeof O.value);O=O.next)A++,N+=O.value.length;A--,x=e.slice(S,N),_.index-=S}else if(!(_=o(E,0,x,b)))continue;C=_.index;var L=_[0],P=x.slice(0,C),R=x.slice(C+L.length),I=S+x.length;d&&I>d.reach&&(d.reach=I);var M=k.prev;if(P&&(M=s(t,M,P),S+=P.length),u(t,M,A),k=s(t,M,new a(f,h?r.tokenize(L,h):L,y,L)),R&&s(t,k,R),A>1){var D={cause:f+","+m,reach:I};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,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:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var r={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,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={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash: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}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};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[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|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|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|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|vcpkg|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;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\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}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.shell=e.languages.bash}(a),a.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\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}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\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]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"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]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,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"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside: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){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\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:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?: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}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \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(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].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,r=t.length;n<r;n++){var a=t[n];if("code"===a.type){var o=a.content[1],i=a.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(a.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r],u=/language-(.+)/.exec(o);if(u){n=u[1];break}}var c,d=e.languages[n];if(d)t.content=e.highlight((c=t.content,c.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var r=l[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(d(["definition-mutation","punctuation"])&&"("===c(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=c(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===c(0).content&&(n++,p(c(0),"property-mutation"),a.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var u=t[s];"variable"===u.type&&a.indexOf(u.content)>=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0===--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),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},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},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(?:COL|_INSERT)?|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|RETURN(?:ING|S)?|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(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r<a;r++){var o=n[r];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=f(l),u=l.alias,d=Array.isArray(u)?u[0]:u,p=e.languages[d];if(!p)continue;i[1]=c(s,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(a),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}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(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{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:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[a]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(a),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;if("string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(s+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},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/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,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")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,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-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",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/,function:{pattern:/(\()(?:abspath|addsuffix|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(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},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|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.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:/[{}[\];(),.:]/},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",{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(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,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,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,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\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,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:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},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+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),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|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|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!#$%&'*+\-./:<=>?@\\^`|~]+/,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:/[()]/};const o=a},5538:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},6976:()=>{!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(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|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=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+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":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.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":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},9535:()=>{!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)},132:()=>{!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)},7650:(e,t,n)=>{var r={"./prism-groovy":5538,"./prism-java":6976,"./prism-protobuf":9535,"./prism-toml":132};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=7650},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(5228),o=n(9982);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(i(227));var l=new Set,s={};function u(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,m={},g={};function h(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var a=b.hasOwnProperty(t)?b[t]:null;(null!==a?0===a.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,a,r)&&(n=null),r||null===a?function(e){return!!p.call(g,e)||!p.call(m,e)&&(f.test(e)?g[e]=!0:(m[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var E=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=60103,S=60106,x=60107,_=60108,A=60114,C=60109,T=60110,N=60112,O=60113,L=60120,P=60115,R=60116,I=60121,M=60128,D=60129,F=60130,B=60131;if("function"==typeof Symbol&&Symbol.for){var z=Symbol.for;k=z("react.element"),S=z("react.portal"),x=z("react.fragment"),_=z("react.strict_mode"),A=z("react.profiler"),C=z("react.provider"),T=z("react.context"),N=z("react.forward_ref"),O=z("react.suspense"),L=z("react.suspense_list"),P=z("react.memo"),R=z("react.lazy"),I=z("react.block"),z("react.scope"),M=z("react.opaque.id"),D=z("react.debug_trace_mode"),F=z("react.offscreen"),B=z("react.legacy_hidden")}var $,U="function"==typeof Symbol&&Symbol.iterator;function j(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function H(e){if(void 0===$)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);$=t&&t[1]||""}return"\n"+$+e}var V=!1;function G(e,t){if(!e||V)return"";V=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(s){var r=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){r=s}e.call(t.prototype)}else{try{throw Error()}catch(s){r=s}e()}}catch(s){if(s&&r&&"string"==typeof s.stack){for(var a=s.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l])return"\n"+a[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{V=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?H(e):""}function W(e){switch(e.tag){case 5:return H(e.type);case 16:return H("Lazy");case 13:return H("Suspense");case 19:return H("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function q(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case S:return"Portal";case A:return"Profiler";case _:return"StrictMode";case O:return"Suspense";case L:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case N:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case P:return q(e.type);case I:return q(e._render);case R:t=e._payload,e=e._init;try{return q(e(t))}catch(n){}}return null}function Y(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function K(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Q(e){e._valueTracker||(e._valueTracker=function(e){var t=K(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=K(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Z(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return a({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=Y(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=Y(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ae(e,t.type,n):t.hasOwnProperty("defaultValue")&&ae(e,t.type,Y(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ae(e,t,n){"number"===t&&Z(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=a({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+Y(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:Y(n)}}function ue(e,t){var n=Y(t.value),r=Y(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function fe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?fe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,ge,he=(ge=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ve={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function Ee(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var ke=a({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Se(e,t){if(t){if(ke[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function xe(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ae=null,Ce=null,Te=null;function Ne(e){if(e=na(e)){if("function"!=typeof Ae)throw Error(i(280));var t=e.stateNode;t&&(t=aa(t),Ae(e.stateNode,e.type,t))}}function Oe(e){Ce?Te?Te.push(e):Te=[e]:Ce=e}function Le(){if(Ce){var e=Ce,t=Te;if(Te=Ce=null,Ne(e),t)for(e=0;e<t.length;e++)Ne(t[e])}}function Pe(e,t){return e(t)}function Re(e,t,n,r,a){return e(t,n,r,a)}function Ie(){}var Me=Pe,De=!1,Fe=!1;function Be(){null===Ce&&null===Te||(Ie(),Le())}function ze(e,t){var n=e.stateNode;if(null===n)return null;var r=aa(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var $e=!1;if(d)try{var Ue={};Object.defineProperty(Ue,"passive",{get:function(){$e=!0}}),window.addEventListener("test",Ue,Ue),window.removeEventListener("test",Ue,Ue)}catch(ge){$e=!1}function je(e,t,n,r,a,o,i,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(c){this.onError(c)}}var He=!1,Ve=null,Ge=!1,We=null,qe={onError:function(e){He=!0,Ve=e}};function Ye(e,t,n,r,a,o,i,l,s){He=!1,Ve=null,je.apply(qe,arguments)}function Ke(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Xe(e){if(Ke(e)!==e)throw Error(i(188))}function Ze(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ke(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return Xe(a),e;if(o===r)return Xe(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l){for(s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,rt,at=!1,ot=[],it=null,lt=null,st=null,ut=new Map,ct=new Map,dt=[],ft="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function pt(e,t,n,r,a){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:a,targetContainers:[r]}}function mt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":lt=null;break;case"mouseover":case"mouseout":st=null;break;case"pointerover":case"pointerout":ut.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ct.delete(t.pointerId)}}function gt(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e=pt(t,n,r,a,o),null!==t&&(null!==(t=na(t))&&tt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function ht(e){var t=ta(e.target);if(null!==t){var n=Ke(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Qe(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=na(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(at=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=na(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Zt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),null!==st&&bt(st)&&(st=null),ut.forEach(vt),ct.forEach(vt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,at||(at=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,yt)))}function Et(e){function t(t){return wt(t,e)}if(0<ot.length){wt(ot[0],e);for(var n=1;n<ot.length;n++){var r=ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&wt(it,e),null!==lt&&wt(lt,e),null!==st&&wt(st,e),ut.forEach(t),ct.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)ht(n),null===n.blockedOn&&dt.shift()}function kt(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var St={animationend:kt("Animation","AnimationEnd"),animationiteration:kt("Animation","AnimationIteration"),animationstart:kt("Animation","AnimationStart"),transitionend:kt("Transition","TransitionEnd")},xt={},_t={};function At(e){if(xt[e])return xt[e];if(!St[e])return e;var t,n=St[e];for(t in n)if(n.hasOwnProperty(t)&&t in _t)return xt[e]=n[t];return e}d&&(_t=document.createElement("div").style,"AnimationEvent"in window||(delete St.animationend.animation,delete St.animationiteration.animation,delete St.animationstart.animation),"TransitionEvent"in window||delete St.transitionend.transition);var Ct=At("animationend"),Tt=At("animationiteration"),Nt=At("animationstart"),Ot=At("transitionend"),Lt=new Map,Pt=new Map,Rt=["abort","abort",Ct,"animationEnd",Tt,"animationIteration",Nt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Ot,"transitionEnd","waiting","waiting"];function It(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];a="on"+(a[0].toUpperCase()+a.slice(1)),Pt.set(r,t),Lt.set(r,a),u(a,[r])}}(0,o.unstable_now)();var Mt=8;function Dt(e){if(1&e)return Mt=15,1;if(2&e)return Mt=14,2;if(4&e)return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):32&e?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):256&e?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):4096&e?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):134217728&e?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):1073741824&e?(Mt=1,1073741824):(Mt=8,e)}function Ft(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,a=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)r=o,a=Mt=15;else if(0!==(o=134217727&n)){var s=o&~i;0!==s?(r=Dt(s),a=Mt):0!==(l&=o)&&(r=Dt(l),a=Mt)}else 0!==(o=n&~i)?(r=Dt(o),a=Mt):0!==l&&(r=Dt(l),a=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Ht(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&!(t&i)){if(Dt(t),a<=Mt)return t;Mt=a}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-Ht(t)),r|=e[n],t&=~a;return r}function Bt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function zt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=$t(24&~t))?zt(10,t):e;case 10:return 0===(e=$t(192&~t))?zt(8,t):e;case 8:return 0===(e=$t(3584&~t))&&(0===(e=$t(4186112&~t))&&(e=512)),e;case 2:return 0===(t=$t(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function $t(e){return e&-e}function Ut(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function jt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Ht(t)]=n}var Ht=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Vt(e)/Gt|0)|0},Vt=Math.log,Gt=Math.LN2;var Wt=o.unstable_UserBlockingPriority,qt=o.unstable_runWithPriority,Yt=!0;function Kt(e,t,n,r){De||Ie();var a=Xt,o=De;De=!0;try{Re(a,e,t,n,r)}finally{(De=o)||Be()}}function Qt(e,t,n,r){qt(Wt,Xt.bind(null,e,t,n,r))}function Xt(e,t,n,r){var a;if(Yt)if((a=!(4&t))&&0<ot.length&&-1<ft.indexOf(e))e=pt(null,e,t,n,r),ot.push(e);else{var o=Zt(e,t,n,r);if(null===o)a&&mt(e,r);else{if(a){if(-1<ft.indexOf(e))return e=pt(o,e,t,n,r),void ot.push(e);if(function(e,t,n,r,a){switch(t){case"focusin":return it=gt(it,e,t,n,r,a),!0;case"dragenter":return lt=gt(lt,e,t,n,r,a),!0;case"mouseover":return st=gt(st,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return ut.set(o,gt(ut.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ct.set(o,gt(ct.get(o)||null,e,t,n,r,a)),!0}return!1}(o,e,t,n,r))return;mt(e,r)}Ir(e,t,r,null,n)}}}function Zt(e,t,n,r){var a=_e(r);if(null!==(a=ta(a))){var o=Ke(a);if(null===o)a=null;else{var i=o.tag;if(13===i){if(null!==(a=Qe(o)))return a;a=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return Ir(e,t,r,a,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,r=n.length,a="value"in Jt?Jt.value:Jt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tn=a.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function an(){return!0}function on(){return!1}function ln(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?an:on,this.isPropagationStopped=on,this}return a(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=an)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=an)},persist:function(){},isPersistent:an}),t}var sn,un,cn,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},fn=ln(dn),pn=a({},dn,{view:0,detail:0}),mn=ln(pn),gn=a({},pn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Cn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==cn&&(cn&&"mousemove"===e.type?(sn=e.screenX-cn.screenX,un=e.screenY-cn.screenY):un=sn=0,cn=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:un}}),hn=ln(gn),bn=ln(a({},gn,{dataTransfer:0})),vn=ln(a({},pn,{relatedTarget:0})),yn=ln(a({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=a({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),En=ln(wn),kn=ln(a({},dn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},xn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},_n={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function An(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=_n[e])&&!!t[e]}function Cn(){return An}var Tn=a({},pn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?xn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Cn,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Nn=ln(Tn),On=ln(a({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Ln=ln(a({},pn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Cn})),Pn=ln(a({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Rn=a({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=ln(Rn),Mn=[9,13,27,32],Dn=d&&"CompositionEvent"in window,Fn=null;d&&"documentMode"in document&&(Fn=document.documentMode);var Bn=d&&"TextEvent"in window&&!Fn,zn=d&&(!Dn||Fn&&8<Fn&&11>=Fn),$n=String.fromCharCode(32),Un=!1;function jn(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Hn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Vn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Wn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function qn(e,t,n,r){Oe(r),0<(t=Dr(t,"onChange")).length&&(n=new fn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Yn=null,Kn=null;function Qn(e){Tr(e,0)}function Xn(e){if(X(ra(e)))return e}function Zn(e,t){if("change"===e)return t}var Jn=!1;if(d){var er;if(d){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9<document.documentMode)}function rr(){Yn&&(Yn.detachEvent("onpropertychange",ar),Kn=Yn=null)}function ar(e){if("value"===e.propertyName&&Xn(Kn)){var t=[];if(qn(t,Kn,e,_e(e)),e=Qn,De)e(t);else{De=!0;try{Pe(e,t)}finally{De=!1,Be()}}}}function or(e,t,n){"focusin"===e?(rr(),Kn=n,(Yn=t).attachEvent("onpropertychange",ar)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Kn)}function lr(e,t){if("click"===e)return Xn(t)}function sr(e,t){if("input"===e||"change"===e)return Xn(t)}var ur="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},cr=Object.prototype.hasOwnProperty;function dr(e,t){if(ur(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!cr.call(t,n[r])||!ur(e[n[r]],t[n[r]]))return!1;return!0}function fr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function pr(e,t){var n,r=fr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=fr(r)}}function mr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?mr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function gr(){for(var e=window,t=Z();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Z((e=t.contentWindow).document)}return t}function hr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=d&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,wr=null,Er=!1;function kr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;Er||null==vr||vr!==Z(r)||("selectionStart"in(r=vr)&&hr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},wr&&dr(wr,r)||(wr=r,0<(r=Dr(yr,"onSelect")).length&&(t=new fn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}It("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),It("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),It(Rt,2);for(var Sr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),xr=0;xr<Sr.length;xr++)Pt.set(Sr[xr],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),u("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),u("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),u("onBeforeInput",["compositionend","keypress","textInput","paste"]),u("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),u("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var _r="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ar=new Set("cancel close invalid load scroll toggle".split(" ").concat(_r));function Cr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,o,l,s,u){if(Ye.apply(this,arguments),He){if(!He)throw Error(i(198));var c=Ve;He=!1,Ve=null,Ge||(Ge=!0,We=c)}}(r,t,void 0,e),e.currentTarget=null}function Tr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,u),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,u=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,u),o=s}}}if(Ge)throw e=We,Ge=!1,We=null,e}function Nr(e,t){var n=oa(t),r=e+"__bubble";n.has(r)||(Rr(t,e,2,!1),n.add(r))}var Or="_reactListening"+Math.random().toString(36).slice(2);function Lr(e){e[Or]||(e[Or]=!0,l.forEach((function(t){Ar.has(t)||Pr(t,!1,e,null),Pr(t,!0,e,null)})))}function Pr(e,t,n,r){var a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Ar.has(e)){if("scroll"!==e)return;a|=2,o=r}var i=oa(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(a|=4),Rr(o,e,a,t),i.add(l))}function Rr(e,t,n,r){var a=Pt.get(t);switch(void 0===a?2:a){case 0:a=Kt;break;case 1:a=Qt;break;default:a=Xt}n=a.bind(null,t,n,e),a=void 0,!$e||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Ir(e,t,n,r,a){var o=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ta(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}!function(e,t,n){if(Fe)return e(t,n);Fe=!0;try{return Me(e,t,n)}finally{Fe=!1,Be()}}((function(){var r=o,a=_e(n),i=[];e:{var l=Lt.get(e);if(void 0!==l){var s=fn,u=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=Nn;break;case"focusin":u="focus",s=vn;break;case"focusout":u="blur",s=vn;break;case"beforeblur":case"afterblur":s=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Ln;break;case Ct:case Tt:case Nt:s=yn;break;case Ot:s=Pn;break;case"scroll":s=mn;break;case"wheel":s=In;break;case"copy":case"cut":case"paste":s=En;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=On}var c=!!(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,m=r;null!==m;){var g=(p=m).stateNode;if(5===p.tag&&null!==g&&(p=g,null!==f&&(null!=(g=ze(m,f))&&c.push(Mr(m,g,p)))),d)break;m=m.return}0<c.length&&(l=new s(l,u,null,n,a),i.push({event:l,listeners:c}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||16&t||!(u=n.relatedTarget||n.fromElement)||!ta(u)&&!u[Jr])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(u=(u=n.relatedTarget||n.toElement)?ta(u):null)&&(u!==(d=Ke(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(s=null,u=r),s!==u)){if(c=hn,g="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(c=On,g="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==s?l:ra(s),p=null==u?l:ra(u),(l=new c(g,m+"leave",s,n,a)).target=d,l.relatedTarget=p,g=null,ta(a)===r&&((c=new c(f,m+"enter",u,n,a)).target=p,c.relatedTarget=d,g=c),d=g,s&&u)e:{for(f=u,m=0,p=c=s;p;p=Fr(p))m++;for(p=0,g=f;g;g=Fr(g))p++;for(;0<m-p;)c=Fr(c),m--;for(;0<p-m;)f=Fr(f),p--;for(;m--;){if(c===f||null!==f&&c===f.alternate)break e;c=Fr(c),f=Fr(f)}c=null}else c=null;null!==s&&Br(i,l,s,c,!1),null!==u&&null!==d&&Br(i,d,u,c,!0)}if("select"===(s=(l=r?ra(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Zn;else if(Wn(l))if(Jn)h=sr;else{h=ir;var b=or}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=lr);switch(h&&(h=h(e,r))?qn(i,h,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ae(l,"number",l.value)),b=r?ra(r):window,e){case"focusin":(Wn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,wr=null);break;case"focusout":wr=yr=vr=null;break;case"mousedown":Er=!0;break;case"contextmenu":case"mouseup":case"dragend":Er=!1,kr(i,n,a);break;case"selectionchange":if(br)break;case"keydown":case"keyup":kr(i,n,a)}var v;if(Dn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Vn?jn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(zn&&"ko"!==n.locale&&(Vn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Vn&&(v=nn()):(en="value"in(Jt=a)?Jt.value:Jt.textContent,Vn=!0)),0<(b=Dr(r,y)).length&&(y=new kn(y,e,null,n,a),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Hn(n))&&(y.data=v))),(v=Bn?function(e,t){switch(e){case"compositionend":return Hn(t);case"keypress":return 32!==t.which?null:(Un=!0,$n);case"textInput":return(e=t.data)===$n&&Un?null:e;default:return null}}(e,n):function(e,t){if(Vn)return"compositionend"===e||!Dn&&jn(e,t)?(e=nn(),tn=en=Jt=null,Vn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return zn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Dr(r,"onBeforeInput")).length&&(a=new kn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=v))}Tr(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Dr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=ze(e,n))&&r.unshift(Mr(e,o,a)),null!=(o=ze(e,t))&&r.push(Mr(e,o,a))),e=e.return}return r}function Fr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Br(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==u&&(l=u,a?null!=(s=ze(n,o))&&i.unshift(Mr(n,s,l)):a||null!=(s=ze(n,o))&&i.push(Mr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function zr(){}var $r=null,Ur=null;function jr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Vr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Wr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function qr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Yr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Kr=0;var Qr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Qr,Zr="__reactProps$"+Qr,Jr="__reactContainer$"+Qr,ea="__reactEvents$"+Qr;function ta(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Yr(e);null!==e;){if(n=e[Xr])return n;e=Yr(e)}return t}n=(e=n).parentNode}return null}function na(e){return!(e=e[Xr]||e[Jr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ra(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function aa(e){return e[Zr]||null}function oa(e){var t=e[ea];return void 0===t&&(t=e[ea]=new Set),t}var ia=[],la=-1;function sa(e){return{current:e}}function ua(e){0>la||(e.current=ia[la],ia[la]=null,la--)}function ca(e,t){la++,ia[la]=e.current,e.current=t}var da={},fa=sa(da),pa=sa(!1),ma=da;function ga(e,t){var n=e.type.contextTypes;if(!n)return da;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function ha(e){return null!=(e=e.childContextTypes)}function ba(){ua(pa),ua(fa)}function va(e,t,n){if(fa.current!==da)throw Error(i(168));ca(fa,t),ca(pa,n)}function ya(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(i(108,q(t)||"Unknown",o));return a({},n,r)}function wa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||da,ma=fa.current,ca(fa,e),ca(pa,pa.current),!0}function Ea(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=ya(e,t,ma),r.__reactInternalMemoizedMergedChildContext=e,ua(pa),ua(fa),ca(fa,e)):ua(pa),ca(pa,n)}var ka=null,Sa=null,xa=o.unstable_runWithPriority,_a=o.unstable_scheduleCallback,Aa=o.unstable_cancelCallback,Ca=o.unstable_shouldYield,Ta=o.unstable_requestPaint,Na=o.unstable_now,Oa=o.unstable_getCurrentPriorityLevel,La=o.unstable_ImmediatePriority,Pa=o.unstable_UserBlockingPriority,Ra=o.unstable_NormalPriority,Ia=o.unstable_LowPriority,Ma=o.unstable_IdlePriority,Da={},Fa=void 0!==Ta?Ta:function(){},Ba=null,za=null,$a=!1,Ua=Na(),ja=1e4>Ua?Na:function(){return Na()-Ua};function Ha(){switch(Oa()){case La:return 99;case Pa:return 98;case Ra:return 97;case Ia:return 96;case Ma:return 95;default:throw Error(i(332))}}function Va(e){switch(e){case 99:return La;case 98:return Pa;case 97:return Ra;case 96:return Ia;case 95:return Ma;default:throw Error(i(332))}}function Ga(e,t){return e=Va(e),xa(e,t)}function Wa(e,t,n){return e=Va(e),_a(e,t,n)}function qa(){if(null!==za){var e=za;za=null,Aa(e)}Ya()}function Ya(){if(!$a&&null!==Ba){$a=!0;var e=0;try{var t=Ba;Ga(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Ba=null}catch(n){throw null!==Ba&&(Ba=Ba.slice(e+1)),_a(La,qa),n}finally{$a=!1}}}var Ka=E.ReactCurrentBatchConfig;function Qa(e,t){if(e&&e.defaultProps){for(var n in t=a({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xa=sa(null),Za=null,Ja=null,eo=null;function to(){eo=Ja=Za=null}function no(e){var t=Xa.current;ua(Xa),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ao(e,t){Za=e,eo=Ja=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(Di=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ja){if(null===Za)throw Error(i(308));Ja=t,Za.dependencies={lanes:0,firstContext:t,responders:null}}else Ja=Ja.next=t;return e._currentValue}var io=!1;function lo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function so(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function uo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function fo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function po(e,t,n,r){var o=e.updateQueue;io=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var u=s,c=u.next;u.next=null,null===l?i=c:l.next=c,l=u;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=c:f.next=c,d.lastBaseUpdate=u)}}if(null!==i){for(f=o.baseState,l=0,d=c=u=null;;){s=i.lane;var p=i.eventTime;if((r&s)===s){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var m=e,g=i;switch(s=t,p=n,g.tag){case 1:if("function"==typeof(m=g.payload)){f=m.call(p,f,s);break e}f=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(s="function"==typeof(m=g.payload)?m.call(p,f,s):m))break e;f=a({},f,s);break e;case 2:io=!0}}null!==i.callback&&(e.flags|=32,null===(s=o.effects)?o.effects=[i]:s.push(i))}else p={eventTime:p,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(c=d=p,u=f):d=d.next=p,l|=s;if(null===(i=i.next)){if(null===(s=o.shared.pending))break;i=s.next,s.next=null,o.lastBaseUpdate=s,o.shared.pending=null}}null===d&&(u=f),o.baseState=u,o.firstBaseUpdate=c,o.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=f}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(i(191,a));a.call(r)}}}var go=(new r.Component).refs;function ho(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:a({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&Ke(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=uo(r,a);o.payload=t,null!=n&&(o.callback=n),co(e,o),ms(e,a,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=uo(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),co(e,o),ms(e,a,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fs(),r=ps(e),a=uo(n,r);a.tag=2,null!=t&&(a.callback=t),co(e,a),ms(e,r,n)}};function vo(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!dr(n,r)||!dr(a,o))}function yo(e,t,n){var r=!1,a=da,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(a=ha(t)?ma:fa.current,o=(r=null!=(r=t.contextTypes))?ga(e,a):da),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&bo.enqueueReplaceState(t,t.state,null)}function Eo(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs=go,lo(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=oo(o):(o=ha(t)?ma:fa.current,a.context=ga(e,o)),po(e,n,a,r),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(ho(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&bo.enqueueReplaceState(a,a.state,null),po(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4)}var ko=Array.isArray;function So(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===go&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function xo(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function _o(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(e,t){return(e=Ws(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Qs(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function u(e,t,n,r){return null!==t&&t.elementType===n.type?((r=a(t,n.props)).ref=So(e,t,n),r.return=e,r):((r=qs(n.type,n.key,n.props,null,e.mode,r)).ref=So(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xs(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Ys(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Qs(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=qs(t.type,t.key,t.props,null,e.mode,n)).ref=So(e,null,t),n.return=e,n;case S:return(t=Xs(t,e.mode,n)).return=e,t}if(ko(t)||j(t))return(t=Ys(t,e.mode,n,null)).return=e,t;xo(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===a?n.type===x?d(e,t,n.props.children,r,a):u(e,t,n,r):null;case S:return n.key===a?c(e,t,n,r):null}if(ko(n)||j(n))return null!==a?null:d(e,t,n,r,null);xo(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return e=e.get(null===r.key?n:r.key)||null,r.type===x?d(t,e,r.props.children,a,r.key):u(t,e,r,a);case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a)}if(ko(r)||j(r))return d(t,e=e.get(n)||null,r,a,null);xo(t,r)}return null}function g(a,i,l,s){for(var u=null,c=null,d=i,g=i=0,h=null;null!==d&&g<l.length;g++){d.index>g?(h=d,d=null):h=d.sibling;var b=p(a,d,l[g],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(a,d),i=o(b,i,g),null===c?u=b:c.sibling=b,c=b,d=h}if(g===l.length)return n(a,d),u;if(null===d){for(;g<l.length;g++)null!==(d=f(a,l[g],s))&&(i=o(d,i,g),null===c?u=d:c.sibling=d,c=d);return u}for(d=r(a,d);g<l.length;g++)null!==(h=m(d,a,g,l[g],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?g:h.key),i=o(h,i,g),null===c?u=h:c.sibling=h,c=h);return e&&d.forEach((function(e){return t(a,e)})),u}function h(a,l,s,u){var c=j(s);if("function"!=typeof c)throw Error(i(150));if(null==(s=c.call(s)))throw Error(i(151));for(var d=c=null,g=l,h=l=0,b=null,v=s.next();null!==g&&!v.done;h++,v=s.next()){g.index>h?(b=g,g=null):b=g.sibling;var y=p(a,g,v.value,u);if(null===y){null===g&&(g=b);break}e&&g&&null===y.alternate&&t(a,g),l=o(y,l,h),null===d?c=y:d.sibling=y,d=y,g=b}if(v.done)return n(a,g),c;if(null===g){for(;!v.done;h++,v=s.next())null!==(v=f(a,v.value,u))&&(l=o(v,l,h),null===d?c=v:d.sibling=v,d=v);return c}for(g=r(a,g);!v.done;h++,v=s.next())null!==(v=m(g,a,h,v.value,u))&&(e&&null!==v.alternate&&g.delete(null===v.key?h:v.key),l=o(v,l,h),null===d?c=v:d.sibling=v,d=v);return e&&g.forEach((function(e){return t(a,e)})),c}return function(e,r,o,s){var u="object"==typeof o&&null!==o&&o.type===x&&null===o.key;u&&(o=o.props.children);var c="object"==typeof o&&null!==o;if(c)switch(o.$$typeof){case k:e:{for(c=o.key,u=r;null!==u;){if(u.key===c){if(7===u.tag){if(o.type===x){n(e,u.sibling),(r=a(u,o.props.children)).return=e,e=r;break e}}else if(u.elementType===o.type){n(e,u.sibling),(r=a(u,o.props)).ref=So(e,u,o),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}o.type===x?((r=Ys(o.props.children,e.mode,s,o.key)).return=e,e=r):((s=qs(o.type,o.key,o.props,null,e.mode,s)).ref=So(e,r,o),s.return=e,e=s)}return l(e);case S:e:{for(u=o.key;null!==r;){if(r.key===u){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=a(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Xs(o,e.mode,s)).return=e,e=r}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=a(r,o)).return=e,e=r):(n(e,r),(r=Qs(o,e.mode,s)).return=e,e=r),l(e);if(ko(o))return g(e,r,o,s);if(j(o))return h(e,r,o,s);if(c&&xo(e,o),void 0===o&&!u)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,q(e.type)||"Component"))}return n(e,r)}}var Ao=_o(!0),Co=_o(!1),To={},No=sa(To),Oo=sa(To),Lo=sa(To);function Po(e){if(e===To)throw Error(i(174));return e}function Ro(e,t){switch(ca(Lo,t),ca(Oo,e),ca(No,To),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ua(No),ca(No,t)}function Io(){ua(No),ua(Oo),ua(Lo)}function Mo(e){Po(Lo.current);var t=Po(No.current),n=pe(t,e.type);t!==n&&(ca(Oo,e),ca(No,n))}function Do(e){Oo.current===e&&(ua(No),ua(Oo))}var Fo=sa(0);function Bo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(64&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var zo=null,$o=null,Uo=!1;function jo(e,t){var n=Vs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ho(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Vo(e){if(Uo){var t=$o;if(t){var n=t;if(!Ho(e,t)){if(!(t=qr(n.nextSibling))||!Ho(e,t))return e.flags=-1025&e.flags|2,Uo=!1,void(zo=e);jo(zo,n)}zo=e,$o=qr(t.firstChild)}else e.flags=-1025&e.flags|2,Uo=!1,zo=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;zo=e}function Wo(e){if(e!==zo)return!1;if(!Uo)return Go(e),Uo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Hr(t,e.memoizedProps))for(t=$o;t;)jo(e,t),t=qr(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){$o=qr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}$o=null}}else $o=zo?qr(e.stateNode.nextSibling):null;return!0}function qo(){$o=zo=null,Uo=!1}var Yo=[];function Ko(){for(var e=0;e<Yo.length;e++)Yo[e]._workInProgressVersionPrimary=null;Yo.length=0}var Qo=E.ReactCurrentDispatcher,Xo=E.ReactCurrentBatchConfig,Zo=0,Jo=null,ei=null,ti=null,ni=!1,ri=!1;function ai(){throw Error(i(321))}function oi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ur(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,a,o){if(Zo=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qo.current=null===e||null===e.memoizedState?Pi:Ri,e=n(r,a),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ti=ei=null,t.updateQueue=null,Qo.current=Ii,e=n(r,a)}while(ri)}if(Qo.current=Li,t=null!==ei&&null!==ei.next,Zo=0,ti=ei=Jo=null,ni=!1,t)throw Error(i(300));return e}function li(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ti?Jo.memoizedState=ti=e:ti=ti.next=e,ti}function si(){if(null===ei){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=ei.next;var t=null===ti?Jo.memoizedState:ti.next;if(null!==t)ti=t,ei=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ei=e).memoizedState,baseState:ei.baseState,baseQueue:ei.baseQueue,queue:ei.queue,next:null},null===ti?Jo.memoizedState=ti=e:ti=ti.next=e}return ti}function ui(e,t){return"function"==typeof t?t(e):t}function ci(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ei,a=r.baseQueue,o=n.pending;if(null!==o){if(null!==a){var l=a.next;a.next=o.next,o.next=l}r.baseQueue=a=o,n.pending=null}if(null!==a){a=a.next,r=r.baseState;var s=l=o=null,u=a;do{var c=u.lane;if((Zo&c)===c)null!==s&&(s=s.next={lane:0,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null}),r=u.eagerReducer===e?u.eagerState:e(r,u.action);else{var d={lane:c,action:u.action,eagerReducer:u.eagerReducer,eagerState:u.eagerState,next:null};null===s?(l=s=d,o=r):s=s.next=d,Jo.lanes|=c,Ul|=c}u=u.next}while(null!==u&&u!==a);null===s?o=r:s.next=l,ur(r,t.memoizedState)||(Di=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=s,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function di(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{o=e(o,l.action),l=l.next}while(l!==a);ur(o,t.memoizedState)||(Di=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function fi(e,t,n){var r=t._getVersion;r=r(t._source);var a=t._workInProgressVersionPrimary;if(null!==a?e=a===r:(e=e.mutableReadLanes,(e=(Zo&e)===e)&&(t._workInProgressVersionPrimary=r,Yo.push(t))),e)return n(t._source);throw Yo.push(t),Error(i(350))}function pi(e,t,n,r){var a=Rl;if(null===a)throw Error(i(349));var o=t._getVersion,l=o(t._source),s=Qo.current,u=s.useState((function(){return fi(a,t,n)})),c=u[1],d=u[0];u=ti;var f=e.memoizedState,p=f.refs,m=p.getSnapshot,g=f.source;f=f.subscribe;var h=Jo;return e.memoizedState={refs:p,source:t,subscribe:r},s.useEffect((function(){p.getSnapshot=n,p.setSnapshot=c;var e=o(t._source);if(!ur(l,e)){e=n(t._source),ur(d,e)||(c(e),e=ps(h),a.mutableReadLanes|=e&a.pendingLanes),e=a.mutableReadLanes,a.entangledLanes|=e;for(var r=a.entanglements,i=e;0<i;){var s=31-Ht(i),u=1<<s;r[s]|=e,i&=~u}}}),[n,t,r]),s.useEffect((function(){return r(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var r=ps(h);a.mutableReadLanes|=r&a.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),ur(m,n)&&ur(g,t)&&ur(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:d}).dispatch=c=Oi.bind(null,Jo,e),u.queue=e,u.baseQueue=null,d=fi(a,t,n),u.memoizedState=u.baseState=d),d}function mi(e,t,n){return pi(si(),e,t,n)}function gi(e){var t=li();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ui,lastRenderedState:e}).dispatch=Oi.bind(null,Jo,e),[t.memoizedState,e]}function hi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function bi(e){return e={current:e},li().memoizedState=e}function vi(){return si().memoizedState}function yi(e,t,n,r){var a=li();Jo.flags|=e,a.memoizedState=hi(1|t,n,void 0,void 0===r?null:r)}function wi(e,t,n,r){var a=si();r=void 0===r?null:r;var o=void 0;if(null!==ei){var i=ei.memoizedState;if(o=i.destroy,null!==r&&oi(r,i.deps))return void hi(t,n,o,r)}Jo.flags|=e,a.memoizedState=hi(1|t,n,o,r)}function Ei(e,t){return yi(516,4,e,t)}function ki(e,t){return wi(516,4,e,t)}function Si(e,t){return wi(4,2,e,t)}function xi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function _i(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,xi.bind(null,t,e),n)}function Ai(){}function Ci(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ti(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ni(e,t){var n=Ha();Ga(98>n?98:n,(function(){e(!0)})),Ga(97<n?97:n,(function(){var n=Xo.transition;Xo.transition=1;try{e(!1),t()}finally{Xo.transition=n}}))}function Oi(e,t,n){var r=fs(),a=ps(e),o={lane:a,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===Jo||null!==i&&i===Jo)ri=ni=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(o.eagerReducer=i,o.eagerState=s,ur(s,l))return}catch(u){}ms(e,a,r)}}var Li={readContext:oo,useCallback:ai,useContext:ai,useEffect:ai,useImperativeHandle:ai,useLayoutEffect:ai,useMemo:ai,useReducer:ai,useRef:ai,useState:ai,useDebugValue:ai,useDeferredValue:ai,useTransition:ai,useMutableSource:ai,useOpaqueIdentifier:ai,unstable_isNewReconciler:!1},Pi={readContext:oo,useCallback:function(e,t){return li().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:Ei,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,yi(4,2,xi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=li();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=li();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Oi.bind(null,Jo,e),[r.memoizedState,e]},useRef:bi,useState:gi,useDebugValue:Ai,useDeferredValue:function(e){var t=gi(e),n=t[0],r=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=gi(!1),t=e[0];return bi(e=Ni.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=li();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},pi(r,e,t,n)},useOpaqueIdentifier:function(){if(Uo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Kr++).toString(36))),Error(i(355))})),n=gi(t)[1];return!(2&Jo.mode)&&(Jo.flags|=516,hi(5,(function(){n("r:"+(Kr++).toString(36))}),void 0,null)),t}return gi(t="r:"+(Kr++).toString(36)),t},unstable_isNewReconciler:!1},Ri={readContext:oo,useCallback:Ci,useContext:oo,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ti,useReducer:ci,useRef:vi,useState:function(){return ci(ui)},useDebugValue:Ai,useDeferredValue:function(e){var t=ci(ui),n=t[0],r=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=ci(ui)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return ci(ui)[0]},unstable_isNewReconciler:!1},Ii={readContext:oo,useCallback:Ci,useContext:oo,useEffect:ki,useImperativeHandle:_i,useLayoutEffect:Si,useMemo:Ti,useReducer:di,useRef:vi,useState:function(){return di(ui)},useDebugValue:Ai,useDeferredValue:function(e){var t=di(ui),n=t[0],r=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=di(ui)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ui)[0]},unstable_isNewReconciler:!1},Mi=E.ReactCurrentOwner,Di=!1;function Fi(e,t,n,r){t.child=null===e?Co(t,null,n,r):Ao(t,e.child,n,r)}function Bi(e,t,n,r,a){n=n.render;var o=t.ref;return ao(t,a),r=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Fi(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function zi(e,t,n,r,a,o){if(null===e){var i=n.type;return"function"!=typeof i||Gs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=qs(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,$i(e,t,i,r,a,o))}return i=e.child,a&o||(a=i.memoizedProps,!(n=null!==(n=n.compare)?n:dr)(a,r)||e.ref!==t.ref)?(t.flags|=1,(e=Ws(i,r)).ref=t.ref,e.return=t,t.child=e):ol(e,t,o)}function $i(e,t,n,r,a,o){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Di=!1,!(o&a))return t.lanes=e.lanes,ol(e,t,o);16384&e.flags&&(Di=!0)}return Hi(e,t,n,r,o)}function Ui(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(4&t.mode){if(!(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},ks(t,e),null;t.memoizedState={baseLanes:0},ks(t,null!==o?o.baseLanes:n)}else t.memoizedState={baseLanes:0},ks(t,n);else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,ks(t,r);return Fi(e,t,a,n),t.child}function ji(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Hi(e,t,n,r,a){var o=ha(n)?ma:fa.current;return o=ga(t,o),ao(t,a),n=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Fi(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function Vi(e,t,n,r,a){if(ha(n)){var o=!0;wa(t)}else o=!1;if(ao(t,a),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),yo(t,n,r),Eo(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,u=n.contextType;"object"==typeof u&&null!==u?u=oo(u):u=ga(t,u=ha(n)?ma:fa.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==u)&&wo(t,i,r,u),io=!1;var f=t.memoizedState;i.state=f,po(t,r,i,a),s=t.memoizedState,l!==r||f!==s||pa.current||io?("function"==typeof c&&(ho(t,n,c,r),s=t.memoizedState),(l=io||vo(t,n,l,r,f,s,u))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=u,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,so(e,t),l=t.memoizedProps,u=t.type===t.elementType?l:Qa(t.type,l),i.props=u,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=oo(s):s=ga(t,s=ha(n)?ma:fa.current);var p=n.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&wo(t,i,r,s),io=!1,f=t.memoizedState,i.state=f,po(t,r,i,a);var m=t.memoizedState;l!==d||f!==m||pa.current||io?("function"==typeof p&&(ho(t,n,p,r),m=t.memoizedState),(u=io||vo(t,n,u,r,f,m,s))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=s,r=u):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Gi(e,t,n,r,o,a)}function Gi(e,t,n,r,a,o){ji(e,t);var i=!!(64&t.flags);if(!r&&!i)return a&&Ea(t,n,!1),ol(e,t,o);r=t.stateNode,Mi.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Ao(t,e.child,null,o),t.child=Ao(t,null,l,o)):Fi(e,t,l,o),t.memoizedState=r.state,a&&Ea(t,n,!0),t.child}function Wi(e){var t=e.stateNode;t.pendingContext?va(0,t.pendingContext,t.pendingContext!==t.context):t.context&&va(0,t.context,!1),Ro(e,t.containerInfo)}var qi,Yi,Ki,Qi,Xi={dehydrated:null,retryLane:0};function Zi(e,t,n){var r,a=t.pendingProps,o=Fo.current,i=!1;return(r=!!(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&!!(2&o)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===a.fallback||!0===a.unstable_avoidThisFallback||(o|=1),ca(Fo,1&o),null===e?(void 0!==a.fallback&&Vo(t),e=a.children,o=a.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof a.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Ks({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(a=tl(e,t,a.children,a.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Xi,a):(n=el(e,t,a.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var a=e.mode,o=e.child;return t={mode:"hidden",children:t},2&a||null===o?o=Ks(t,a,0,null):(o.childLanes=0,o.pendingProps=t),n=Ys(n,a,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,r){var a=e.child;return e=a.sibling,n=Ws(a,{mode:"visible",children:n}),!(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,r,a){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 2&o||t.child===i?n=Ws(i,l):((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null),null!==e?r=Ws(e,r):(r=Ys(r,o,a,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function rl(e,t,n,r,a,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a,i.lastEffect=o)}function al(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(Fi(e,t,r.children,n),2&(r=Fo.current))r=1&r|2,t.flags|=64;else{if(null!==e&&64&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(ca(Fo,r),2&t.mode)switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===Bo(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),rl(t,!1,a,n,o,t.lastEffect);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===Bo(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}rl(t,!0,n,null,o,t.lastEffect);break;case"together":rl(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,n&t.childLanes){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Ws(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Ws(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!Uo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ll(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return ha(t.type)&&ba(),null;case 3:return Io(),ua(pa),ua(fa),Ko(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Wo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Yi(t),null;case 5:Do(t);var o=Po(Lo.current);if(n=t.type,null!==e&&null!=t.stateNode)Ki(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Po(No.current),Wo(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[Xr]=t,r[Zr]=l,n){case"dialog":Nr("cancel",r),Nr("close",r);break;case"iframe":case"object":case"embed":Nr("load",r);break;case"video":case"audio":for(e=0;e<_r.length;e++)Nr(_r[e],r);break;case"source":Nr("error",r);break;case"img":case"image":case"link":Nr("error",r),Nr("load",r);break;case"details":Nr("toggle",r);break;case"input":ee(r,l),Nr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!l.multiple},Nr("invalid",r);break;case"textarea":se(r,l),Nr("invalid",r)}for(var u in Se(n,l),e=null,l)l.hasOwnProperty(u)&&(o=l[u],"children"===u?"string"==typeof o?r.textContent!==o&&(e=["children",o]):"number"==typeof o&&r.textContent!==""+o&&(e=["children",""+o]):s.hasOwnProperty(u)&&null!=o&&"onScroll"===u&&Nr("scroll",r));switch(n){case"input":Q(r),re(r,l,!0);break;case"textarea":Q(r),ce(r);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(r.onclick=zr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(u=9===o.nodeType?o:o.ownerDocument,e===de.html&&(e=fe(n)),e===de.html?"script"===n?((e=u.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=u.createElement(n,{is:r.is}):(e=u.createElement(n),"select"===n&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,n),e[Xr]=t,e[Zr]=r,qi(e,t,!1,!1),t.stateNode=e,u=xe(n,r),n){case"dialog":Nr("cancel",e),Nr("close",e),o=r;break;case"iframe":case"object":case"embed":Nr("load",e),o=r;break;case"video":case"audio":for(o=0;o<_r.length;o++)Nr(_r[o],e);o=r;break;case"source":Nr("error",e),o=r;break;case"img":case"image":case"link":Nr("error",e),Nr("load",e),o=r;break;case"details":Nr("toggle",e),o=r;break;case"input":ee(e,r),o=J(e,r),Nr("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=a({},r,{value:void 0}),Nr("invalid",e);break;case"textarea":se(e,r),o=le(e,r),Nr("invalid",e);break;default:o=r}Se(n,o);var c=o;for(l in c)if(c.hasOwnProperty(l)){var d=c[l];"style"===l?Ee(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&he(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Nr("scroll",e):null!=d&&w(e,l,d,u))}switch(n){case"input":Q(e),re(e,r,!1);break;case"textarea":Q(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+Y(r.value));break;case"select":e.multiple=!!r.multiple,null!=(l=r.value)?ie(e,!!r.multiple,l,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=zr)}jr(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Qi(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Po(Lo.current),Po(No.current),Wo(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return ua(Fo),r=t.memoizedState,64&t.flags?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Wo(t):n=null!==e.memoizedState,r&&!n&&2&t.mode&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||1&Fo.current?0===Bl&&(Bl=3):(0!==Bl&&3!==Bl||(Bl=4),null===Rl||!(134217727&Ul)&&!(134217727&jl)||vs(Rl,Ml))),(r||n)&&(t.flags|=4),null);case 4:return Io(),Yi(t),null===e&&Lr(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(ua(Fo),null===(r=t.memoizedState))return null;if(l=!!(64&t.flags),null===(u=r.rendering))if(l)il(r,!1);else{if(0!==Bl||null!==e&&64&e.flags)for(e=t.child;null!==e;){if(null!==(u=Bo(e))){for(t.flags|=64,il(r,!1),null!==(l=u.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(u=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=u.childLanes,l.lanes=u.lanes,l.child=u.child,l.memoizedProps=u.memoizedProps,l.memoizedState=u.memoizedState,l.updateQueue=u.updateQueue,l.type=u.type,e=u.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return ca(Fo,1&Fo.current|2),t.child}e=e.sibling}null!==r.tail&&ja()>Wl&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Bo(u))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(r,!0),null===r.tail&&"hidden"===r.tailMode&&!u.alternate&&!Uo)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*ja()-r.renderingStartTime>Wl&&1073741824!==n&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432);r.isBackwards?(u.sibling=t.child,t.child=u):(null!==(n=r.last)?n.sibling=u:t.child=u,r.last=u)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=ja(),n.sibling=null,t=Fo.current,ca(Fo,l?1&t|2:1&t),n):null;case 23:case 24:return Ss(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:ha(e.type)&&ba();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Io(),ua(pa),ua(fa),Ko(),64&(t=e.flags))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return ua(Fo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ua(Fo),null;case 4:return Io(),null;case 10:return no(e),null;case 23:case 24:return Ss(),null;default:return null}}function ul(e,t){try{var n="",r=t;do{n+=W(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a}}function cl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}qi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Yi=function(){},Ki=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Po(No.current);var i,l=null;switch(n){case"input":o=J(e,o),r=J(e,r),l=[];break;case"option":o=oe(e,o),r=oe(e,r),l=[];break;case"select":o=a({},o,{value:void 0}),r=a({},r,{value:void 0}),l=[];break;case"textarea":o=le(e,o),r=le(e,r),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=zr)}for(d in Se(n,r),n=null,o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var u=o[d];for(i in u)u.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in r){var c=r[d];if(u=null!=o?o[d]:void 0,r.hasOwnProperty(d)&&c!==u&&(null!=c||null!=u))if("style"===d)if(u){for(i in u)!u.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in c)c.hasOwnProperty(i)&&u[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(l||(l=[]),l.push(d,n)),n=c;else"dangerouslySetInnerHTML"===d?(c=c?c.__html:void 0,u=u?u.__html:void 0,null!=c&&u!==c&&(l=l||[]).push(d,c)):"children"===d?"string"!=typeof c&&"number"!=typeof c||(l=l||[]).push(d,""+c):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=c&&"onScroll"===d&&Nr("scroll",e),l||u===c||(l=[])):"object"==typeof c&&null!==c&&c.$$typeof===M?c.toString():(l=l||[]).push(d,c))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Qi=function(e,t,n,r){n!==r&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=uo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ql||(Ql=!0,Xl=r),cl(0,t)},n}function pl(e,t,n){(n=uo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return cl(0,t),r(a)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Zl?Zl=new Set([this]):Zl.add(this),cl(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ml="function"==typeof WeakSet?WeakSet:Set;function gl(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){$s(e,n)}else t.current=null}function hl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Qa(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Wr(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(!(3&~e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var a=e;r=a.next,4&(a=a.tag)&&1&a&&(Fs(n,e),Ds(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Qa(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&jr(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&Et(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var a=n.memoizedProps.style;a=null!=a&&a.hasOwnProperty("display")?a.display:null,r.style.display=we("display",a)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(Sa&&"function"==typeof Sa.onCommitFiberUnmount)try{Sa.onCommitFiberUnmount(ka,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,a=r.destroy;if(r=r.tag,void 0!==a)if(4&r)Fs(t,n);else{r=t;try{a()}catch(o){$s(r,o)}}n=n.next}while(n!==e)}break;case 1:if(gl(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){$s(t,o)}break;case 5:gl(t);break;case 4:_l(e,t)}}function wl(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function El(e){return 5===e.tag||3===e.tag||4===e.tag}function kl(e){e:{for(var t=e.return;null!==t;){if(El(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||El(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Sl(e,n,t):xl(e,n,t)}function Sl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=zr));else if(4!==r&&null!==(e=e.child))for(Sl(e,t,n),e=e.sibling;null!==e;)Sl(e,t,n),e=e.sibling}function xl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(xl(e,t,n),e=e.sibling;null!==e;)xl(e,t,n),e=e.sibling}function _l(e,t){for(var n,r,a=t,o=!1;;){if(!o){o=a.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===a.tag||6===a.tag){e:for(var l=e,s=a,u=s;;)if(yl(l,u),null!==u.child&&4!==u.tag)u.child.return=u,u=u.child;else{if(u===s)break e;for(;null===u.sibling;){if(null===u.return||u.return===s)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}r?(l=n,s=a.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(a.stateNode)}else if(4===a.tag){if(null!==a.child){n=a.stateNode.containerInfo,r=!0,a.child.return=a,a=a.child;continue}}else if(yl(e,a),null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)return;4===(a=a.return).tag&&(o=!1)}a.sibling.return=a.return,a=a.sibling}}function Al(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{!(3&~r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var a=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Zr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),xe(e,a),t=xe(e,r),a=0;a<o.length;a+=2){var l=o[a],s=o[a+1];"style"===l?Ee(n,s):"dangerouslySetInnerHTML"===l?he(n,s):"children"===l?be(n,s):w(n,l,s,t)}switch(e){case"input":ne(n,r);break;case"textarea":ue(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ie(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,Et(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gl=ja(),vl(t.child,!0)),void Cl(t);case 19:return void Cl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Cl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ml),t.forEach((function(t){var r=js.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Tl(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Nl=Math.ceil,Ol=E.ReactCurrentDispatcher,Ll=E.ReactCurrentOwner,Pl=0,Rl=null,Il=null,Ml=0,Dl=0,Fl=sa(0),Bl=0,zl=null,$l=0,Ul=0,jl=0,Hl=0,Vl=null,Gl=0,Wl=1/0;function ql(){Wl=ja()+500}var Yl,Kl=null,Ql=!1,Xl=null,Zl=null,Jl=!1,es=null,ts=90,ns=[],rs=[],as=null,os=0,is=null,ls=-1,ss=0,us=0,cs=null,ds=!1;function fs(){return 48&Pl?ja():-1!==ls?ls:ls=ja()}function ps(e){if(!(2&(e=e.mode)))return 1;if(!(4&e))return 99===Ha()?1:2;if(0===ss&&(ss=$l),0!==Ka.transition){0!==us&&(us=null!==Vl?Vl.pendingLanes:0),e=ss;var t=4186112&~us;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Ha(),4&Pl&&98===e?e=zt(12,ss):e=zt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function ms(e,t,n){if(50<os)throw os=0,is=null,Error(i(185));if(null===(e=gs(e,t)))return null;jt(e,t,n),e===Rl&&(jl|=t,4===Bl&&vs(e,Ml));var r=Ha();1===t?8&Pl&&!(48&Pl)?ys(e):(hs(e,n),0===Pl&&(ql(),qa())):(!(4&Pl)||98!==r&&99!==r||(null===as?as=new Set([e]):as.add(e)),hs(e,n)),Vl=e}function gs(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function hs(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,a=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-Ht(l),u=1<<s,c=o[s];if(-1===c){if(!(u&r)||u&a){c=t,Dt(u);var d=Mt;o[s]=10<=d?c+250:6<=d?c+5e3:-1}}else c<=t&&(e.expiredLanes|=u);l&=~u}if(r=Ft(e,e===Rl?Ml:0),t=Mt,0===r)null!==n&&(n!==Da&&Aa(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Da&&Aa(n)}15===t?(n=ys.bind(null,e),null===Ba?(Ba=[n],za=_a(La,Ya)):Ba.push(n),n=Da):14===t?n=Wa(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Wa(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,us=ss=0,48&Pl)throw Error(i(327));var t=e.callbackNode;if(Ms()&&e.callbackNode!==t)return null;var n=Ft(e,e===Rl?Ml:0);if(0===n)return null;var r=n,a=Pl;Pl|=16;var o=As();for(Rl===e&&Ml===r||(ql(),xs(e,r));;)try{Ns();break}catch(s){_s(e,s)}if(to(),Ol.current=o,Pl=a,null!==Il?r=0:(Rl=null,Ml=0,r=Bl),$l&jl)xs(e,0);else if(0!==r){if(2===r&&(Pl|=64,e.hydrate&&(e.hydrate=!1,Wr(e.containerInfo)),0!==(n=Bt(e))&&(r=Cs(e,n))),1===r)throw t=zl,xs(e,0),vs(e,n),hs(e,ja()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Ps(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(r=Gl+500-ja())){if(0!==Ft(e,0))break;if(((a=e.suspendedLanes)&n)!==n){fs(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=Vr(Ps.bind(null,e),r);break}Ps(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(r=e.eventTimes,a=-1;0<n;){var l=31-Ht(n);o=1<<l,(l=r[l])>a&&(a=l),n&=~o}if(n=a,10<(n=(120>(n=ja()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Nl(n/1960))-n)){e.timeoutHandle=Vr(Ps.bind(null,e),n);break}Ps(e);break;default:throw Error(i(329))}}return hs(e,ja()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~Hl,t&=~jl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Ht(t),r=1<<n;e[n]=-1,t&=~r}}function ys(e){if(48&Pl)throw Error(i(327));if(Ms(),e===Rl&&e.expiredLanes&Ml){var t=Ml,n=Cs(e,t);$l&jl&&(n=Cs(e,t=Ft(e,t)))}else n=Cs(e,t=Ft(e,0));if(0!==e.tag&&2===n&&(Pl|=64,e.hydrate&&(e.hydrate=!1,Wr(e.containerInfo)),0!==(t=Bt(e))&&(n=Cs(e,t))),1===n)throw n=zl,xs(e,0),vs(e,t),hs(e,ja()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ps(e),hs(e,ja()),null}function ws(e,t){var n=Pl;Pl|=1;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}}function Es(e,t){var n=Pl;Pl&=-2,Pl|=8;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}}function ks(e,t){ca(Fl,Dl),Dl|=t,$l|=t}function Ss(){Dl=Fl.current,ua(Fl)}function xs(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Il)for(n=Il.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&ba();break;case 3:Io(),ua(pa),ua(fa),Ko();break;case 5:Do(r);break;case 4:Io();break;case 13:case 19:ua(Fo);break;case 10:no(r);break;case 23:case 24:Ss()}n=n.return}Rl=e,Il=Ws(e.current,null),Ml=Dl=$l=t,Bl=0,zl=null,Hl=jl=Ul=0}function _s(e,t){for(;;){var n=Il;try{if(to(),Qo.current=Li,ni){for(var r=Jo.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ni=!1}if(Zo=0,ti=ei=Jo=null,ri=!1,Ll.current=null,null===n||null===n.return){Bl=1,zl=t,Il=null;break}e:{var o=e,i=n.return,l=n,s=t;if(t=Ml,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var u=s;if(!(2&l.mode)){var c=l.alternate;c?(l.updateQueue=c.updateQueue,l.memoizedState=c.memoizedState,l.lanes=c.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=!!(1&Fo.current),f=i;do{var p;if(p=13===f.tag){var m=f.memoizedState;if(null!==m)p=null!==m.dehydrated;else{var g=f.memoizedProps;p=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!d)}}if(p){var h=f.updateQueue;if(null===h){var b=new Set;b.add(u),f.updateQueue=b}else h.add(u);if(!(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=uo(-1,1);v.tag=2,co(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,s=new Set,y.set(u,s)):void 0===(s=y.get(u))&&(s=new Set,y.set(u,s)),!s.has(l)){s.add(l);var w=Us.bind(null,o,u,l);u.then(w,w)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);s=Error((q(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Bl&&(Bl=2),s=ul(s,l),f=i;do{switch(f.tag){case 3:o=s,f.flags|=4096,t&=-t,f.lanes|=t,fo(f,fl(0,o,t));break e;case 1:o=s;var E=f.type,k=f.stateNode;if(!(64&f.flags||"function"!=typeof E.getDerivedStateFromError&&(null===k||"function"!=typeof k.componentDidCatch||null!==Zl&&Zl.has(k)))){f.flags|=4096,t&=-t,f.lanes|=t,fo(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ls(n)}catch(S){t=S,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function As(){var e=Ol.current;return Ol.current=Li,null===e?Li:e}function Cs(e,t){var n=Pl;Pl|=16;var r=As();for(Rl===e&&Ml===t||xs(e,t);;)try{Ts();break}catch(a){_s(e,a)}if(to(),Pl=n,Ol.current=r,null!==Il)throw Error(i(261));return Rl=null,Ml=0,Bl}function Ts(){for(;null!==Il;)Os(Il)}function Ns(){for(;null!==Il&&!Ca();)Os(Il)}function Os(e){var t=Yl(e.alternate,e,Dl);e.memoizedProps=e.pendingProps,null===t?Ls(e):Il=t,Ll.current=null}function Ls(e){var t=e;do{var n=t.alternate;if(e=t.return,2048&t.flags){if(null!==(n=sl(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}else{if(null!==(n=ll(n,t,Dl)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||1073741824&Dl||!(4&n.mode)){for(var r=0,a=n.child;null!==a;)r|=a.lanes|a.childLanes,a=a.sibling;n.childLanes=r}null!==e&&!(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===Bl&&(Bl=5)}function Ps(e){var t=Ha();return Ga(99,Rs.bind(null,e,t)),null}function Rs(e,t){do{Ms()}while(null!==es);if(48&Pl)throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,a=r,o=e.pendingLanes&~a;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=a,e.mutableReadLanes&=a,e.entangledLanes&=a,a=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<o;){var u=31-Ht(o),c=1<<u;a[u]=0,l[u]=-1,s[u]=-1,o&=~c}if(null!==as&&!(24&r)&&as.has(e)&&as.delete(e),e===Rl&&(Il=Rl=null,Ml=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(a=Pl,Pl|=32,Ll.current=null,$r=Yt,hr(l=gr())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(c=s.getSelection&&s.getSelection())&&0!==c.rangeCount){s=c.anchorNode,o=c.anchorOffset,u=c.focusNode,c=c.focusOffset;try{s.nodeType,u.nodeType}catch(A){s=null;break e}var d=0,f=-1,p=-1,m=0,g=0,h=l,b=null;t:for(;;){for(var v;h!==s||0!==o&&3!==h.nodeType||(f=d+o),h!==u||0!==c&&3!==h.nodeType||(p=d+c),3===h.nodeType&&(d+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===l)break t;if(b===s&&++m===o&&(f=d),b===u&&++g===c&&(p=d),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}s=-1===f||-1===p?null:{start:f,end:p}}else s=null;s=s||{start:0,end:0}}else s=null;Ur={focusedElem:l,selectionRange:s},Yt=!1,cs=null,ds=!1,Kl=r;do{try{Is()}catch(A){if(null===Kl)throw Error(i(330));$s(Kl,A),Kl=Kl.nextEffect}}while(null!==Kl);cs=null,Kl=r;do{try{for(l=e;null!==Kl;){var y=Kl.flags;if(16&y&&be(Kl.stateNode,""),128&y){var w=Kl.alternate;if(null!==w){var E=w.ref;null!==E&&("function"==typeof E?E(null):E.current=null)}}switch(1038&y){case 2:kl(Kl),Kl.flags&=-3;break;case 6:kl(Kl),Kl.flags&=-3,Al(Kl.alternate,Kl);break;case 1024:Kl.flags&=-1025;break;case 1028:Kl.flags&=-1025,Al(Kl.alternate,Kl);break;case 4:Al(Kl.alternate,Kl);break;case 8:_l(l,s=Kl);var k=s.alternate;wl(s),null!==k&&wl(k)}Kl=Kl.nextEffect}}catch(A){if(null===Kl)throw Error(i(330));$s(Kl,A),Kl=Kl.nextEffect}}while(null!==Kl);if(E=Ur,w=gr(),y=E.focusedElem,l=E.selectionRange,w!==y&&y&&y.ownerDocument&&mr(y.ownerDocument.documentElement,y)){null!==l&&hr(y)&&(w=l.start,void 0===(E=l.end)&&(E=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(E,y.value.length)):(E=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(E=E.getSelection(),s=y.textContent.length,k=Math.min(l.start,s),l=void 0===l.end?k:Math.min(l.end,s),!E.extend&&k>l&&(s=l,l=k,k=s),s=pr(y,k),o=pr(y,l),s&&o&&(1!==E.rangeCount||E.anchorNode!==s.node||E.anchorOffset!==s.offset||E.focusNode!==o.node||E.focusOffset!==o.offset)&&((w=w.createRange()).setStart(s.node,s.offset),E.removeAllRanges(),k>l?(E.addRange(w),E.extend(o.node,o.offset)):(w.setEnd(o.node,o.offset),E.addRange(w))))),w=[];for(E=y;E=E.parentNode;)1===E.nodeType&&w.push({element:E,left:E.scrollLeft,top:E.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(E=w[y]).element.scrollLeft=E.left,E.element.scrollTop=E.top}Yt=!!$r,Ur=$r=null,e.current=n,Kl=r;do{try{for(y=e;null!==Kl;){var S=Kl.flags;if(36&S&&bl(y,Kl.alternate,Kl),128&S){w=void 0;var x=Kl.ref;if(null!==x){var _=Kl.stateNode;Kl.tag,w=_,"function"==typeof x?x(w):x.current=w}}Kl=Kl.nextEffect}}catch(A){if(null===Kl)throw Error(i(330));$s(Kl,A),Kl=Kl.nextEffect}}while(null!==Kl);Kl=null,Fa(),Pl=a}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Kl=r;null!==Kl;)t=Kl.nextEffect,Kl.nextEffect=null,8&Kl.flags&&((S=Kl).sibling=null,S.stateNode=null),Kl=t;if(0===(r=e.pendingLanes)&&(Zl=null),1===r?e===is?os++:(os=0,is=e):os=0,n=n.stateNode,Sa&&"function"==typeof Sa.onCommitFiberRoot)try{Sa.onCommitFiberRoot(ka,n,void 0,!(64&~n.current.flags))}catch(A){}if(hs(e,ja()),Ql)throw Ql=!1,e=Xl,Xl=null,e;return 8&Pl||qa(),null}function Is(){for(;null!==Kl;){var e=Kl.alternate;ds||null===cs||(8&Kl.flags?Je(Kl,cs)&&(ds=!0):13===Kl.tag&&Tl(e,Kl)&&Je(Kl,cs)&&(ds=!0));var t=Kl.flags;256&t&&hl(e,Kl),!(512&t)||Jl||(Jl=!0,Wa(97,(function(){return Ms(),null}))),Kl=Kl.nextEffect}}function Ms(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Ga(e,Bs)}return!1}function Ds(e,t){ns.push(t,e),Jl||(Jl=!0,Wa(97,(function(){return Ms(),null})))}function Fs(e,t){rs.push(t,e),Jl||(Jl=!0,Wa(97,(function(){return Ms(),null})))}function Bs(){if(null===es)return!1;var e=es;if(es=null,48&Pl)throw Error(i(331));var t=Pl;Pl|=32;var n=rs;rs=[];for(var r=0;r<n.length;r+=2){var a=n[r],o=n[r+1],l=a.destroy;if(a.destroy=void 0,"function"==typeof l)try{l()}catch(u){if(null===o)throw Error(i(330));$s(o,u)}}for(n=ns,ns=[],r=0;r<n.length;r+=2){a=n[r],o=n[r+1];try{var s=a.create;a.destroy=s()}catch(u){if(null===o)throw Error(i(330));$s(o,u)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Pl=t,qa(),!0}function zs(e,t,n){co(e,t=fl(0,t=ul(n,t),1)),t=fs(),null!==(e=gs(e,1))&&(jt(e,1,t),hs(e,t))}function $s(e,t){if(3===e.tag)zs(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){zs(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Zl||!Zl.has(r))){var a=pl(n,e=ul(t,e),1);if(co(n,a),a=fs(),null!==(n=gs(n,1)))jt(n,1,a),hs(n,a);else if("function"==typeof r.componentDidCatch&&(null===Zl||!Zl.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Us(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=fs(),e.pingedLanes|=e.suspendedLanes&n,Rl===e&&(Ml&n)===n&&(4===Bl||3===Bl&&(62914560&Ml)===Ml&&500>ja()-Gl?xs(e,0):Hl|=n),hs(e,t)}function js(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(2&(t=e.mode)?4&t?(0===ss&&(ss=$l),0===(t=$t(62914560&~ss))&&(t=4194304)):t=99===Ha()?1:2:t=1),n=fs(),null!==(e=gs(e,t))&&(jt(e,t,n),hs(e,n))}function Hs(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Vs(e,t,n,r){return new Hs(e,t,n,r)}function Gs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Ws(e,t){var n=e.alternate;return null===n?((n=Vs(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function qs(e,t,n,r,a,o){var l=2;if(r=e,"function"==typeof e)Gs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case x:return Ys(n.children,a,o,t);case D:l=8,a|=16;break;case _:l=8,a|=1;break;case A:return(e=Vs(12,n,t,8|a)).elementType=A,e.type=A,e.lanes=o,e;case O:return(e=Vs(13,n,t,a)).type=O,e.elementType=O,e.lanes=o,e;case L:return(e=Vs(19,n,t,a)).elementType=L,e.lanes=o,e;case F:return Ks(n,a,o,t);case B:return(e=Vs(24,n,t,a)).elementType=B,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case T:l=9;break e;case N:l=11;break e;case P:l=14;break e;case R:l=16,r=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Vs(l,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function Ys(e,t,n,r){return(e=Vs(7,e,r,t)).lanes=n,e}function Ks(e,t,n,r){return(e=Vs(23,e,r,t)).elementType=F,e.lanes=n,e}function Qs(e,t,n){return(e=Vs(6,e,null,t)).lanes=n,e}function Xs(e,t,n){return(t=Vs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Zs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Ut(0),this.expirationTimes=Ut(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ut(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n,r){var a=t.current,o=fs(),l=ps(a);e:if(n){t:{if(Ke(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(ha(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var u=n.type;if(ha(u)){n=ya(n,u,s);break e}}n=s}else n=da;return null===t.context?t.context=n:t.pendingContext=n,(t=uo(o,l)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),co(a,t),ms(a,l,o),l}function eu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nu(e,t){tu(e,t),(e=e.alternate)&&tu(e,t)}function ru(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Zs(e,t,null!=n&&!0===n.hydrate),t=Vs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,lo(t),e[Jr]=n.current,Lr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var a=(t=r[e])._getVersion;a=a(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,a]:n.mutableSourceEagerHydrationData.push(t,a)}this._internalRoot=n}function au(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function ou(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof a){var l=a;a=function(){var e=eu(i);l.call(e)}}Js(t,i,e,a)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new ru(e,0,t?{hydrate:!0}:void 0)}(n,r),i=o._internalRoot,"function"==typeof a){var s=a;a=function(){var e=eu(i);s.call(e)}}Es((function(){Js(t,i,e,a)}))}return eu(i)}function iu(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!au(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Yl=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||pa.current)Di=!0;else{if(!(n&r)){switch(Di=!1,t.tag){case 3:Wi(t),qo();break;case 5:Mo(t);break;case 1:ha(t.type)&&wa(t);break;case 4:Ro(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var a=t.type._context;ca(Xa,a._currentValue),a._currentValue=r;break;case 13:if(null!==t.memoizedState)return n&t.child.childLanes?Zi(e,t,n):(ca(Fo,1&Fo.current),null!==(t=ol(e,t,n))?t.sibling:null);ca(Fo,1&Fo.current);break;case 19:if(r=!!(n&t.childLanes),64&e.flags){if(r)return al(e,t,n);t.flags|=64}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),ca(Fo,Fo.current),r)break;return null;case 23:case 24:return t.lanes=0,Ui(e,t,n)}return ol(e,t,n)}Di=!!(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=ga(t,fa.current),ao(t,n),a=ii(null,t,r,e,a,n),t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,ha(r)){var o=!0;wa(t)}else o=!1;t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,lo(t);var l=r.getDerivedStateFromProps;"function"==typeof l&&ho(t,r,l,e),a.updater=bo,t.stateNode=a,a._reactInternals=t,Eo(t,r,e,n),t=Gi(null,t,r,!0,o,n)}else t.tag=0,Fi(null,t,a,n),t=t.child;return t;case 16:a=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=(o=a._init)(a._payload),t.type=a,o=t.tag=function(e){if("function"==typeof e)return Gs(e)?1:0;if(null!=e){if((e=e.$$typeof)===N)return 11;if(e===P)return 14}return 2}(a),e=Qa(a,e),o){case 0:t=Hi(null,t,a,e,n);break e;case 1:t=Vi(null,t,a,e,n);break e;case 11:t=Bi(null,t,a,e,n);break e;case 14:t=zi(null,t,a,Qa(a.type,e),r,n);break e}throw Error(i(306,a,""))}return t;case 0:return r=t.type,a=t.pendingProps,Hi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 1:return r=t.type,a=t.pendingProps,Vi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 3:if(Wi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,a=null!==(a=t.memoizedState)?a.element:null,so(e,t),po(t,r,null,n),(r=t.memoizedState.element)===a)qo(),t=ol(e,t,n);else{if((o=(a=t.stateNode).hydrate)&&($o=qr(t.stateNode.containerInfo.firstChild),zo=t,o=Uo=!0),o){if(null!=(e=a.mutableSourceEagerHydrationData))for(a=0;a<e.length;a+=2)(o=e[a])._workInProgressVersionPrimary=e[a+1],Yo.push(o);for(n=Co(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Fi(e,t,r,n),qo();t=t.child}return t;case 5:return Mo(t),null===e&&Vo(t),r=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,l=a.children,Hr(r,a)?l=null:null!==o&&Hr(r,o)&&(t.flags|=16),ji(e,t),Fi(e,t,l,n),t.child;case 6:return null===e&&Vo(t),null;case 13:return Zi(e,t,n);case 4:return Ro(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ao(t,null,r,n):Fi(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,Bi(e,t,r,a=t.elementType===r?a:Qa(r,a),n);case 7:return Fi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Fi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,a=t.pendingProps,l=t.memoizedProps,o=a.value;var s=t.type._context;if(ca(Xa,s._currentValue),s._currentValue=o,null!==l)if(s=l.value,0===(o=ur(s,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(s,o):1073741823))){if(l.children===a.children&&!pa.current){t=ol(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var u=s.dependencies;if(null!==u){l=s.child;for(var c=u.firstContext;null!==c;){if(c.context===r&&c.observedBits&o){1===s.tag&&((c=uo(-1,n&-n)).tag=2,co(s,c)),s.lanes|=n,null!==(c=s.alternate)&&(c.lanes|=n),ro(s.return,n),u.lanes|=n;break}c=c.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Fi(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=(o=t.pendingProps).children,ao(t,n),r=r(a=oo(a,o.unstable_observedBits)),t.flags|=1,Fi(e,t,r,n),t.child;case 14:return o=Qa(a=t.type,t.pendingProps),zi(e,t,a,o=Qa(a.type,o),r,n);case 15:return $i(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:Qa(r,a),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,ha(r)?(e=!0,wa(t)):e=!1,ao(t,n),yo(t,r,a),Eo(t,r,a,n),Gi(null,t,r,!0,e,n);case 19:return al(e,t,n);case 23:case 24:return Ui(e,t,n)}throw Error(i(156,t.tag))},ru.prototype.render=function(e){Js(e,this._internalRoot,null,null)},ru.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Js(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(ms(e,4,fs()),nu(e,4))},tt=function(e){13===e.tag&&(ms(e,67108864,fs()),nu(e,67108864))},nt=function(e){if(13===e.tag){var t=fs(),n=ps(e);ms(e,n,t),nu(e,n)}},rt=function(e,t){return t()},Ae=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=aa(r);if(!a)throw Error(i(90));X(r),ne(r,a)}}}break;case"textarea":ue(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Pe=ws,Re=function(e,t,n,r,a){var o=Pl;Pl|=4;try{return Ga(98,e.bind(null,t,n,r,a))}finally{0===(Pl=o)&&(ql(),qa())}},Ie=function(){!(49&Pl)&&(function(){if(null!==as){var e=as;as=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hs(e,ja())}))}qa()}(),Ms())},Me=function(e,t){var n=Pl;Pl|=2;try{return e(t)}finally{0===(Pl=n)&&(ql(),qa())}};var lu={Events:[na,ra,aa,Oe,Le,Ms,{current:!1}]},su={findFiberByHostInstance:ta,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},uu={bundleType:su.bundleType,version:su.version,rendererPackageName:su.rendererPackageName,rendererConfig:su.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:E.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ze(e))?null:e.stateNode},findFiberByHostInstance:su.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var cu=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!cu.isDisabled&&cu.supportsFiber)try{ka=cu.inject(uu),Sa=cu}catch(ge){}}t.hydrate=function(e,t,n){if(!au(t))throw Error(i(200));return ou(null,e,t,!0,n)}},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,u,c;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(c=e.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;for(c=e.entries();!(s=c.next()).done;)if(!o(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(c=e.entries();!(s=c.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===i.toString();if((l=(u=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,u[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==u[s]&&"__v"!==u[s]&&"__o"!==u[s]||!e.$$typeof)&&!o(e[u[s]],i[u[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),a=n(5556),o=n.n(a),i=n(115),l=n.n(i),s=n(311),u=n.n(s),c=n(2833),d=n.n(c);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function g(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map((function(e){return h[e]})),E={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(E).reduce((function(e,t){return e[E[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=S(e,h.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},_=function(e){return S(e,"onChangeClientState")||function(){}},A=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},C=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},T=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var u=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][u]&&(a[n][u]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},N=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},O=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},P=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},R=[h.NOSCRIPT,h.SCRIPT,h.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},M=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[E[n]||n]=e[n],t}),t)},F=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=E[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},B=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=D(n,a),[r.createElement(h.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=M(n),o=O(t);return a?"<"+e+' data-rh="true" '+a+">"+I(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,u=e.titleAttributes,c=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=L(e.metaTags,y),o=L(t,b),i=L(n,v);return{priorityMethods:{toComponent:function(){return[].concat(F(h.META,a.priority),F(h.LINK,o.priority),F(h.SCRIPT,i.priority))},toString:function(){return B(h.META,a.priority,r)+" "+B(h.LINK,o.priority,r)+" "+B(h.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=m.priorityMethods,c=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:B(h.BASE,t,r),bodyAttributes:B("bodyAttributes",n,r),htmlAttributes:B("htmlAttributes",a,r),link:B(h.LINK,c,r),meta:B(h.META,d,r),noscript:B(h.NOSCRIPT,o,r),script:B(h.SCRIPT,f,r),style:B(h.STYLE,i,r),title:B(h.TITLE,{title:s,titleAttributes:u},r)}},$=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?$:n.instances},add:function(e){(n.canUseDOM?$:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?$:n.instances).indexOf(e);(n.canUseDOM?$:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},j=r.createContext({}),H=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),V="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(j.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=V,G.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var W=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],u=t[s]||"";n.getAttribute(s)!==u&&n.setAttribute(s,u),-1===a.indexOf(s)&&a.push(s);var c=o.indexOf(s);-1!==c&&o.splice(c,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Y=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,u=e.styleTags,c=e.title,d=e.titleAttributes;q(h.BODY,e.bodyAttributes),q(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=O(e)),q(h.TITLE,t)}(c,d);var f={baseTag:W(h.BASE,n),linkTags:W(h.LINK,a),metaTags:W(h.META,o),noscriptTags:W(h.NOSCRIPT,i),scriptTags:W(h.SCRIPT,s),styleTags:W(h.STYLE,u)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),l(e,p,m)},K=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:C(["href"],e),bodyAttributes:A("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:A("htmlAttributes",e),linkTags:T(h.LINK,["rel","href"],e),metaTags:T(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:T(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:T(h.SCRIPT,["src","innerHTML"],e),styleTags:T(h.STYLE,["cssText"],e),title:x(e),titleAttributes:A("titleAttributes",e),prioritizeSeoTags:N(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){Y(t,(function(){K=null}))})):(Y(t),K=null)):z&&(a=z(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Q.propTypes={context:H.isRequired},Q.displayName="HelmetDispatcher";var X=["children"],Z=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(P(this.props,"helmetData"),P(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},a,{bodyAttributes:f({},o)});case h.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return u()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),u()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=g(r,X),l=Object.keys(i).reduce((function(e,t){return e[k[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,Z),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?r.createElement(Q,f({},a,{context:o.value,helmetData:void 0})):r.createElement(j.Consumer,null,(function(e){return r.createElement(Q,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function E(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case u:case f:case h:case g:case s:return e;default:return t}}case a:return t}}}function k(e){return E(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=h,t.Memo=g,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return k(e)||E(e)===c},t.isConcurrentMode=k,t.isContextConsumer=function(e){return E(e)===u},t.isContextProvider=function(e){return E(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return E(e)===f},t.isFragment=function(e){return E(e)===o},t.isLazy=function(e){return E(e)===h},t.isMemo=function(e){return E(e)===g},t.isPortal=function(e){return E(e)===a},t.isProfiler=function(e){return E(e)===l},t.isStrictMode=function(e){return E(e)===i},t.isSuspense=function(e){return E(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===g||e.$$typeof===s||e.$$typeof===u||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=E},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}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;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var l=n(6540),s=n(5556),u=[],c=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),g=null;function h(){return g||(g=e(m.loader)),g.promise}return u.push(h),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),g=e(m.loader),r._loadModule()})),h(),r.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),g.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),f}function g(e){return m(d,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(h,"propTypes",{report:s.func.isRequired}),o(h,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),g.Capture=h,g.preloadAll=function(){return new Promise((function(e,t){b(u).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=g},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(2681),a=n(8168),o=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.dO,n,e.map((function(e,n){return o.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.A)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{Kd:()=>c,N_:()=>h,k2:()=>y});var r=n(2681),a=n(2892),o=n(6540),i=n(1513),l=n(8168),s=n(8587),u=n(8997),c=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},p=function(e){return e},m=o.forwardRef;void 0===m&&(m=p);var g=m((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),u=i.target,c=(0,l.A)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||u&&"_self"!==u||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=p!==m&&t||n,o.createElement("a",c)}));var h=m((function(e,t){var n=e.component,a=void 0===n?g:n,c=e.replace,h=e.to,b=e.innerRef,v=(0,s.A)(e,["component","replace","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,u.A)(!1);var n=e.history,r=f(d(h,e.location),e.location),s=r?n.createHref(r):"",g=(0,l.A)({},v,{href:s,navigate:function(){var t=d(h,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(f(t));(c||r?n.replace:n.push)(t)}});return p!==m?g.ref=t||b:g.innerRef=b,o.createElement(a,g)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,c=void 0===i?"active":i,p=e.activeStyle,m=e.className,g=e.exact,y=e.isActive,w=e.location,E=e.sensitive,k=e.strict,S=e.style,x=e.to,_=e.innerRef,A=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,u.A)(!1);var n=w||e.location,i=f(d(x,n),n),s=i.pathname,C=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=C?(0,r.B6)(n.pathname,{path:C,exact:g,sensitive:E,strict:k}):null,N=!!(y?y(T,n):T),O="function"==typeof m?m(N):m,L="function"==typeof S?S(N):S;N&&(O=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(O,c),L=(0,l.A)({},L,p));var P=(0,l.A)({"aria-current":N&&a||null,className:O,style:L,to:i},A);return b!==v?P.ref=t||_:P.innerRef=_,o.createElement(h,P)}))}))},2681:(e,t,n)=>{"use strict";n.d(t,{qh:()=>_,Ix:()=>w,dO:()=>L,XZ:()=>y,B6:()=>x,W6:()=>R,zy:()=>I});var r=n(2892),a=n(6540),o=n(1513),i=n(5556),l=n.n(i),s=1073741823,u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var c=a.createContext||function(e,t){var n,o,i="__create-react-context-"+function(){var e="__global_unique_id__";return u[e]=(u[e]||0)+1}()+"__",c=function(e){function n(){var t,n,r;return(t=e.apply(this,arguments)||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[i]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):s,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);c.childContextTypes=((n={})[i]=l().object.isRequired,n);var d=function(t){function n(){var e;return(e=t.apply(this,arguments)||this).state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?s:t},a.componentDidMount=function(){this.context[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?s:e},a.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},a.getValue=function(){return this.context[i]?this.context[i].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return d.contextTypes=((o={})[i]=l().object,o),{Provider:c,Consumer:d}};const d=c;var f=n(8997),p=n(8168),m=n(8505),g=n.n(m),h=(n(4363),n(8587)),b=(n(4146),function(e){var t=d();return t.displayName=e,t}),v=b("Router-History"),y=b("Router"),w=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(v.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.Component;var E={},k=1e4,S=0;function x(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,u=void 0!==s&&s;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=E[n]||(E[n]={});if(r[e])return r[e];var a=[],o={regexp:g()(e,a,t),keys:a};return S<k&&(r[e]=o,S++),o}(n,{end:o,strict:l,sensitive:u}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var c=s[0],d=s.slice(1),f=e===c;return o&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=d[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,f.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?x(n.pathname,e.props):t.match,o=(0,p.A)({},t,{location:n,match:r}),i=e.props,l=i.children,s=i.component,u=i.render;return Array.isArray(l)&&function(e){return 0===a.Children.count(e)}(l)&&(l=null),a.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:s?a.createElement(s,o):u?u(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function A(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=A(e);return 0!==t.pathname.indexOf(n)?t:(0,p.A)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,o.AO)(e)}function N(e){return function(){(0,f.A)(!1)}}function O(){}a.Component;var L=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,f.A)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?x(o.pathname,(0,p.A)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var P=a.useContext;function R(){return P(v)}function I(){return P(y).location}},8505:(e,t,n)=>{var r=n(4634);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=g&&null!=m&&m!==g,k="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,_=b||v;r.push({name:h||o++,prefix:g||"",delimiter:x,optional:S,repeat:k,partial:E,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(x)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,u=0;u<e.length;u++){var c=e[u];if("string"!=typeof c){var d,f=l[c.name];if(null==f){if(c.optional){c.partial&&(o+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(f)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[u].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?c.prefix:c.delimiter)+d}}else{if(d=c.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[u].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');o+=c.prefix+d}}else o+=c}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function u(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var u=e[l];if("string"==typeof u)i+=s(u);else{var f=s(u.prefix),p="(?:"+u.pattern+")";t.push(u),u.repeat&&(p+="(?:"+f+p+")*"),i+=p=u.optional?u.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),g=i.slice(-m.length)===m;return a||(i=(g?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&g?"":"(?="+m+"|$)",c(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return c(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return c(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},5287:(e,t,n)=>{"use strict";var r=n(5228),a=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var u=60115,c=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;a=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),u=d("react.memo"),c=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,r(y,h.prototype),y.isPureReactComponent=!0;var w={current:null},E=Object.prototype.hasOwnProperty,k={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var r,o={},i=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)E.call(t,r)&&!k.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var u=Array(s),c=0;c<s;c++)u[c]=arguments[c+2];o.children=u}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return{$$typeof:a,type:e,key:i,ref:l,props:o,_owner:w.current}}function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}var _=/\/+/g;function A(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function C(e,t,n,r,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case a:case o:s=!0}}if(s)return i=i(s=e),e=""===r?"."+A(s,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(_,"$&/")+"/"),C(i,t,n,"",(function(e){return e}))):null!=i&&(x(i)&&(i=function(e,t){return{$$typeof:a,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(_,"$&/")+"/")+e)),t.push(i)),1;if(s=0,r=""===r?".":r+":",Array.isArray(e))for(var u=0;u<e.length;u++){var c=r+A(l=e[u],u);s+=C(l,t,n,c,i)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),u=0;!(l=e.next()).done;)s+=C(l=l.value,t,n,c=r+A(l,u++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function T(e,t,n){if(null==e)return e;var r=[],a=0;return C(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function N(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var O={current:null};function L(){var e=O.current;if(null===e)throw Error(p(321));return e}var P={ReactCurrentDispatcher:O,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:T,forEach:function(e,t,n){T(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return T(e,(function(){t++})),t},toArray:function(e){return T(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error(p(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=r({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var u=e.type.defaultProps;for(c in t)E.call(t,c)&&!k.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==u?u[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=n;else if(1<c){u=Array(c);for(var d=0;d<c;d++)u[d]=arguments[d+2];o.children=u}return{$$typeof:a,type:e.type,key:i,ref:l,props:o,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=S,t.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:u,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return L().useCallback(e,t)},t.useContext=function(e,t){return L().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return L().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return L().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return L().useLayoutEffect(e,t)},t.useMemo=function(e,t){return L().useMemo(e,t)},t.useReducer=function(e,t,n){return L().useReducer(e,t,n)},t.useRef=function(e){return L().useRef(e)},t.useState=function(e){return L().useState(e)},t.version="17.0.2"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},7463:(e,t)=>{"use strict";var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,c=null,d=function(){if(null!==u)try{var e=t.unstable_now();u(!0,e),u=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==u?setTimeout(n,0,e):(u=e,setTimeout(d,0))},r=function(e,t){c=setTimeout(e,t)},a=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,E=w.port2;w.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?E.postMessage(null):(g=!1,h=null)}catch(n){throw E.postMessage(null),n}}else g=!1},n=function(e){h=e,g||(g=!0,E.postMessage(null))},r=function(e,n){b=f((function(){e(t.unstable_now())}),n)},a=function(){p(b),b=-1}}function k(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,a=e[r];if(!(void 0!==a&&0<_(a,t)))break e;e[r]=t,e[n]=a,n=r}}function S(e){return void 0===(e=e[0])?null:e}function x(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length;r<a;){var o=2*(r+1)-1,i=e[o],l=o+1,s=e[l];if(void 0!==i&&0>_(i,n))void 0!==s&&0>_(s,i)?(e[r]=s,e[l]=n,r=l):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==s&&0>_(s,n)))break e;e[r]=s,e[l]=n,r=l}}}return t}return null}function _(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var A=[],C=[],T=1,N=null,O=3,L=!1,P=!1,R=!1;function I(e){for(var t=S(C);null!==t;){if(null===t.callback)x(C);else{if(!(t.startTime<=e))break;x(C),t.sortIndex=t.expirationTime,k(A,t)}t=S(C)}}function M(e){if(R=!1,I(e),!P)if(null!==S(A))P=!0,n(D);else{var t=S(C);null!==t&&r(M,t.startTime-e)}}function D(e,n){P=!1,R&&(R=!1,a()),L=!0;var o=O;try{for(I(n),N=S(A);null!==N&&(!(N.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=N.callback;if("function"==typeof i){N.callback=null,O=N.priorityLevel;var l=i(N.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?N.callback=l:N===S(A)&&x(A),I(n)}else x(A);N=S(A)}if(null!==N)var s=!0;else{var u=S(C);null!==u&&r(M,u.startTime-n),s=!1}return s}finally{N=null,O=o,L=!1}}var F=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){P||L||(P=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return O},t.unstable_getFirstCallbackNode=function(){return S(A)},t.unstable_next=function(e){switch(O){case 1:case 2:case 3:var t=3;break;default:t=O}var n=O;O=t;try{return e()}finally{O=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=F,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=O;O=e;try{return t()}finally{O=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:T++,callback:o,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,k(C,e),null===S(A)&&e===S(C)&&(R?a():R=!0,r(M,i-l))):(e.sortIndex=s,k(A,e),P||L||(P=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=O;return function(){var n=O;O=t;try{return e.apply(this,arguments)}finally{O=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var u=o[s];if(!l(u))return!1;var c=e[u],d=t[u];if(!1===(a=n?n.call(r,c,d,u):void 0)||void 0===a&&c!==d)return!1}return!0}},8997:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t;throw new Error(n?a+": "+n:a)}}},4784:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r={title:"Raccoon",tagline:"Raccoon is a high-throughput, low-latency service to collect events in real-time from your web, mobile apps, and services using multiple network protocols.",url:"https://raystack.github.io/",baseUrl:"/raccoon/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"favicon.ico",organizationName:"Raystack",projectName:"raccoon",presets:[["@docusaurus/preset-classic",{gtag:{trackingID:"G-XXX"},docs:{routeBasePath:"/",sidebarPath:"/home/runner/work/raccoon/raccoon/docs/sidebars.js",editUrl:"https://github.com/raystack/raccoon/edit/master/docs/",sidebarCollapsed:!1,breadcrumbs:!1},blog:!1,theme:{customCss:["/home/runner/work/raccoon/raccoon/docs/src/css/theme.css","/home/runner/work/raccoon/raccoon/docs/src/css/icons.css"]}}]],themeConfig:{colorMode:{defaultMode:"light",respectPrefersColorScheme:!0,disableSwitch:!1},navbar:{title:"Raccoon",logo:{src:"/logo.svg"},hideOnScroll:!0,items:[{type:"doc",docId:"introduction",position:"right",label:"Documentation"},{to:"/support",label:"Support",position:"right"},{href:"https://bit.ly/2RzPbtn",position:"right",className:"header-slack-link"},{href:"https://github.com/raystack/raccoon",className:"navbar-item-github",position:"right"}]},footer:{style:"light",links:[]},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:["toml","protobuf","groovy","java"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},announcementBar:{id:"star-repo",content:'\u2b50\ufe0f If you like Raccoon, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/raystack/raccoon">GitHub</a>! \u2b50',backgroundColor:"#222",textColor:"#eee",isCloseable:!0},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",path:"i18n",locales:["en"],localeConfigs:{}},onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>a})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{A:()=>r})},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/raccoon/-7c4":{"__comp":"1be78505","__context":{"plugin":"3585ba8f"},"versionMetadata":"935f2afb"},"/raccoon/-550":{"__comp":"17896441","content":"a09c2993"},"/raccoon/concepts/architecture-4a8":{"__comp":"17896441","content":"8a1416ba"},"/raccoon/concepts/structure-b0f":{"__comp":"17896441","content":"fadecd94"},"/raccoon/contribute/contribution-2b1":{"__comp":"17896441","content":"f3275a05"},"/raccoon/contribute/development-38e":{"__comp":"17896441","content":"7ff2cdfe"},"/raccoon/contribute/release-a64":{"__comp":"17896441","content":"338d3fa8"},"/raccoon/guides/deployment-190":{"__comp":"17896441","content":"caaf7770"},"/raccoon/guides/monitoring-213":{"__comp":"17896441","content":"7de6ea50"},"/raccoon/guides/overview-fc4":{"__comp":"17896441","content":"c5e4a08a"},"/raccoon/guides/publishing-752":{"__comp":"17896441","content":"1425879c"},"/raccoon/guides/troubleshooting-bfe":{"__comp":"17896441","content":"03be7dae"},"/raccoon/quickstart-114":{"__comp":"17896441","content":"8070e160"},"/raccoon/reference/benchmarks-068":{"__comp":"17896441","content":"010df87a"},"/raccoon/reference/configurations-a76":{"__comp":"17896441","content":"58175526"},"/raccoon/reference/metrics-351":{"__comp":"17896441","content":"fc49bffc"},"/raccoon/roadmap-182":{"__comp":"17896441","content":"0dffb83e"},"/raccoon/support-a67":{"__comp":"17896441","content":"d9e16301"}}')}},e=>{e.O(0,[869],(()=>{return t=5660,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.6c7acd83.js.LICENSE.txt b/assets/js/main.3588fb71.js.LICENSE.txt similarity index 100% rename from assets/js/main.6c7acd83.js.LICENSE.txt rename to assets/js/main.3588fb71.js.LICENSE.txt diff --git a/assets/js/main.6c7acd83.js b/assets/js/main.6c7acd83.js deleted file mode 100644 index eb9b6584..00000000 --- a/assets/js/main.6c7acd83.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.6c7acd83.js.LICENSE.txt */ -(self.webpackChunkfirehose=self.webpackChunkfirehose||[]).push([[179],{723:function(e,t,n){"use strict";n.d(t,{Z:function(){return p}});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887),u={"010df87a":[function(){return n.e(52).then(n.bind(n,7894))},"@site/docs/reference/benchmarks.md",7894],"03be7dae":[function(){return n.e(729).then(n.bind(n,8261))},"@site/docs/guides/troubleshooting.md",8261],"0dffb83e":[function(){return n.e(75).then(n.bind(n,3208))},"@site/docs/roadmap.md",3208],"1425879c":[function(){return n.e(285).then(n.bind(n,3331))},"@site/docs/guides/publishing.md",3331],17896441:[function(){return Promise.all([n.e(532),n.e(918)]).then(n.bind(n,2710))},"@theme/DocItem",2710],"1be78505":[function(){return Promise.all([n.e(532),n.e(514)]).then(n.bind(n,7994))},"@theme/DocPage",7994],"338d3fa8":[function(){return n.e(668).then(n.bind(n,8333))},"@site/docs/contribute/release.md",8333],"3585ba8f":[function(){return n.e(144).then(n.t.bind(n,3769,19))},"/home/runner/work/raccoon/raccoon/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],58175526:[function(){return n.e(409).then(n.bind(n,8836))},"@site/docs/reference/configurations.md",8836],"7de6ea50":[function(){return n.e(510).then(n.bind(n,5025))},"@site/docs/guides/monitoring.md",5025],"7ff2cdfe":[function(){return n.e(641).then(n.bind(n,5506))},"@site/docs/contribute/development.md",5506],"8070e160":[function(){return n.e(651).then(n.bind(n,2257))},"@site/docs/quickstart.md",2257],"8a1416ba":[function(){return n.e(886).then(n.bind(n,4730))},"@site/docs/concepts/architecture.md",4730],"935f2afb":[function(){return n.e(53).then(n.t.bind(n,1109,19))},"~docs/default/version-current-metadata-prop-751.json",1109],a09c2993:[function(){return n.e(128).then(n.bind(n,8495))},"@site/docs/introduction.md",8495],c5e4a08a:[function(){return n.e(266).then(n.bind(n,4967))},"@site/docs/guides/overview.md",4967],caaf7770:[function(){return n.e(119).then(n.bind(n,5667))},"@site/docs/guides/deployment.md",5667],d9e16301:[function(){return n.e(217).then(n.bind(n,7243))},"@site/docs/support.md",7243],f3275a05:[function(){return n.e(403).then(n.bind(n,5057))},"@site/docs/contribute/contribution.md",5057],fadecd94:[function(){return n.e(338).then(n.bind(n,527))},"@site/docs/concepts/structure.md",527],fc49bffc:[function(){return n.e(643).then(n.bind(n,2723))},"@site/docs/reference/metrics.md",2723]};function s(e){var t=e.error,n=e.retry,a=e.pastDelay;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:s,loader:function(){return n.e(972).then(n.bind(n,4972))},modules:["@theme/NotFound"],webpack:function(){return[4972]},render:function(e,t){var n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});var o=l[e+"-"+t],f={},p=[],m=[],h=(0,c.Z)(o);return Object.entries(h).forEach((function(e){var t=e[0],n=e[1],r=u[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:s,loader:f,modules:p,webpack:function(){return m},render:function(t,n){var i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((function(t){var n=t[0],r=t[1],a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((function(e){return"default"!==e})).forEach((function(e){a[e]=r[e]}));var o=i,l=n.split(".");l.slice(0,-1).forEach((function(e){o=o[e]})),o[l[l.length-1]]=a}));var l=i.__comp;delete i.__comp;var u=i.__context;return delete i.__context,r.createElement(d.z,{value:u},r.createElement(l,(0,a.Z)({},i,n)))}})}var p=[{path:"/raccoon/",component:f("/raccoon/","7c4"),routes:[{path:"/raccoon/",component:f("/raccoon/","550"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/concepts/architecture",component:f("/raccoon/concepts/architecture","4a8"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/concepts/structure",component:f("/raccoon/concepts/structure","b0f"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/contribution",component:f("/raccoon/contribute/contribution","2b1"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/development",component:f("/raccoon/contribute/development","38e"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/contribute/release",component:f("/raccoon/contribute/release","a64"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/deployment",component:f("/raccoon/guides/deployment","190"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/monitoring",component:f("/raccoon/guides/monitoring","213"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/overview",component:f("/raccoon/guides/overview","fc4"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/publishing",component:f("/raccoon/guides/publishing","752"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/guides/troubleshooting",component:f("/raccoon/guides/troubleshooting","bfe"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/quickstart",component:f("/raccoon/quickstart","114"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/reference/benchmarks",component:f("/raccoon/reference/benchmarks","068"),exact:!0},{path:"/raccoon/reference/configurations",component:f("/raccoon/reference/configurations","a76"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/reference/metrics",component:f("/raccoon/reference/metrics","351"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/roadmap",component:f("/raccoon/roadmap","182"),exact:!0,sidebar:"docsSidebar"},{path:"/raccoon/support",component:f("/raccoon/support","a67"),exact:!0}]},{path:"*",component:f("*")}]},8934:function(e,t,n){"use strict";n.d(t,{_:function(){return a},t:function(){return o}});var r=n(7294),a=r.createContext(!1);function o(e){var t=e.children,n=(0,r.useState)(!1),o=n[0],i=n[1];return(0,r.useEffect)((function(){i(!0)}),[]),r.createElement(a.Provider,{value:o},t)}},9383:function(e,t,n){"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412),u=[n(6200),n(2497),n(3310),n(8320),n(5308),n(3121)],s=n(723),c=n(6775),d=n(8790);function f(e){var t=e.children;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),v=n(4711),b=n(6668),y=n(9727),w=n(1944),k=n(3320),E=n(197);function S(){var e=(0,h.Z)().i18n,t=e.defaultLocale,n=e.localeConfigs,a=(0,v.l)();return r.createElement(m.Z,null,Object.entries(n).map((function(e){var t=e[0],n=e[1].htmlLang;return r.createElement("link",{key:t,rel:"alternate",href:a.createUrl({locale:t,fullyQualified:!0}),hrefLang:n})})),r.createElement("link",{rel:"alternate",href:a.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){var t=e.permalink,n=(0,h.Z)().siteConfig.url,a=function(){var e=(0,h.Z)().siteConfig.url,t=(0,c.TH)().pathname;return e+(0,g.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){var e=(0,h.Z)().i18n.currentLocale,t=(0,b.L)(),n=t.metadata,a=t.image;return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:y.h})),a&&r.createElement(w.d,{image:a}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,n.map((function(e,t){return r.createElement("meta",(0,p.Z)({key:t},e))}))))}var _=new Map;function T(e){if(_.has(e.pathname))return Object.assign({},e,{pathname:_.get(e.pathname)});if((0,d.f)(s.Z,e.pathname).some((function(e){return!0===e.route.exact})))return _.set(e.pathname,e.pathname),e;var t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),Object.assign({},e,{pathname:t})}var A=n(8934),L=n(8940),R=n(4578);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=u.map((function(t){var r,a,o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o.apply(void 0,n)}));return function(){return a.forEach((function(e){return null==e?void 0:e()}))}}var N=function(e){var t=e.children,n=e.location,a=e.previousLocation;return(0,r.useLayoutEffect)((function(){a!==n&&(a&&function(e){var t=e.hash;if(t){var n=decodeURIComponent(t.substring(1)),r=document.getElementById(n);null==r||r.scrollIntoView()}else window.scrollTo(0,0)}(n),O("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){var t=(0,d.f)(s.Z,e);return Promise.all(t.map((function(e){return null==e.route.component.preload?void 0:e.route.component.preload()})))}var I=function(e){function t(t){var n;return(n=e.call(this,t)||this).previousLocation=void 0,n.routeUpdateCleanupCb=void 0,n.previousLocation=null,n.routeUpdateCleanupCb=l.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:n.props.location}):function(){},n.state={nextRouteHasLoaded:!0},n}(0,R.Z)(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e,t){var n=this;if(e.location===this.props.location)return t.nextRouteHasLoaded;var r=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:r}),P(r.pathname).then((function(){n.routeUpdateCleanupCb(),n.setState({nextRouteHasLoaded:!0})})).catch((function(e){console.warn(e),window.location.reload()})),!1},n.render=function(){var e=this.props,t=e.children,n=e.location;return r.createElement(N,{previousLocation:this.previousLocation,location:n},r.createElement(c.AW,{location:n,render:function(){return t}}))},t}(r.Component),D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+D+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n<div id="docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseurl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">'+e+"</span> "+("/"===e?" (default value)":"")+'</p>\n <p>We suggest trying baseUrl = <span id="'+M+'" style="font-weight: bold; color: green;"></span></p>\n</div>\n'}(e)).replace(/</g,"\\<")+";\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('"+M+"');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n"}function B(){var e=(0,h.Z)().siteConfig.baseUrl;return(0,r.useLayoutEffect)((function(){window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,j(e))),r.createElement("div",{id:D}))}function z(){var e=(0,h.Z)().siteConfig,t=e.baseUrl,n=e.baseUrlIssueBanner,a=(0,c.TH)().pathname;return n&&a===t?r.createElement(B,null):null}function U(){var e=(0,h.Z)(),t=e.siteConfig,n=t.favicon,a=t.title,o=e.i18n,i=o.currentLocale,l=o.localeConfigs,u=(0,g.Z)(n),s=l[i],c=s.htmlLang,d=s.direction;return r.createElement(m.Z,null,r.createElement("html",{lang:c,dir:d}),r.createElement("title",null,a),r.createElement("meta",{property:"og:title",content:a}),n&&r.createElement("link",{rel:"icon",href:u}))}var $=n(4763);function q(){var e=(0,d.H)(s.Z),t=(0,c.TH)();return r.createElement($.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(C,null),r.createElement(z,null),r.createElement(I,{location:T(t)},e)))))}var Z=n(6887);var H=function(e){try{return document.createElement("link").relList.supports(e)}catch(t){return!1}}("prefetch")?function(e){return new Promise((function(t,n){var r,a;if("undefined"!=typeof document){var o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=function(){return t()},o.onerror=function(){return n()};var i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}else n()}))}:function(e){return new Promise((function(t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=function(){200===r.status?t():n()},r.send(null)}))};var G=n(9670),V=new Set,W=new Set,Y=function(){var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch:function(e){if(!function(e){return!Y()&&!W.has(e)&&!V.has(e)}(e))return!1;V.add(e);var t=(0,d.f)(s.Z,e).flatMap((function(e){return t=e.route.path,Object.entries(Z).filter((function(e){return e[0].replace(/-[^-]+$/,"")===t})).flatMap((function(e){var t=e[1];return Object.values((0,G.Z)(t))}));var t}));return Promise.all(t.map((function(e){var t=n.gca(e);return t&&!t.includes("undefined")?H(t).catch((function(){})):Promise.resolve()})))},preload:function(e){return!!function(e){return!Y()&&!W.has(e)}(e)&&(W.add(e),P(e))}},X=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=X;var Q=a.hydrate;P(window.location.pathname).then((function(){Q(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:function(e,t,n){"use strict";n.d(t,{_:function(){return c},M:function(){return d}});var r=n(7294),a=n(6809),o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-XXX","anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/raccoon/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/raccoon/","mainDocId":"introduction","docs":[{"id":"concepts/architecture","path":"/raccoon/concepts/architecture","sidebar":"docsSidebar"},{"id":"concepts/structure","path":"/raccoon/concepts/structure","sidebar":"docsSidebar"},{"id":"contribute/contribution","path":"/raccoon/contribute/contribution","sidebar":"docsSidebar"},{"id":"contribute/development","path":"/raccoon/contribute/development","sidebar":"docsSidebar"},{"id":"contribute/release","path":"/raccoon/contribute/release","sidebar":"docsSidebar"},{"id":"guides/deployment","path":"/raccoon/guides/deployment","sidebar":"docsSidebar"},{"id":"guides/monitoring","path":"/raccoon/guides/monitoring","sidebar":"docsSidebar"},{"id":"guides/overview","path":"/raccoon/guides/overview","sidebar":"docsSidebar"},{"id":"guides/publishing","path":"/raccoon/guides/publishing","sidebar":"docsSidebar"},{"id":"guides/troubleshooting","path":"/raccoon/guides/troubleshooting","sidebar":"docsSidebar"},{"id":"introduction","path":"/raccoon/","sidebar":"docsSidebar"},{"id":"quickstart","path":"/raccoon/quickstart","sidebar":"docsSidebar"},{"id":"reference/benchmarks","path":"/raccoon/reference/benchmarks"},{"id":"reference/configurations","path":"/raccoon/reference/configurations","sidebar":"docsSidebar"},{"id":"reference/metrics","path":"/raccoon/reference/metrics","sidebar":"docsSidebar"},{"id":"roadmap","path":"/raccoon/roadmap","sidebar":"docsSidebar"},{"id":"support","path":"/raccoon/support"}],"draftIds":[],"sidebars":{"docsSidebar":{"link":{"path":"/raccoon/","label":"introduction"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory"}}}'),l=n(7529),u=JSON.parse('{"docusaurusVersion":"0.0.0-5124","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"0.0.0-5124"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"0.0.0-5124"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"0.0.0-5124"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"0.0.0-5124"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"0.0.0-5124"}}}'),s={siteConfig:a.Z,siteMetadata:u,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(s);function d(e){var t=e.children;return r.createElement(c.Provider,{value:s},t)}},4763:function(e,t,n){"use strict";n.d(t,{Z:function(){return d}});var r=n(4578),a=n(7294),o=n(412),i=n(5742),l=n(5257);function u(e){var t=e.error,n=e.tryAgain;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},a.createElement("h1",null,"This page crashed."),a.createElement("p",null,t.message),a.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){var t=e.error,n=e.tryAgain;return a.createElement(d,{fallback:function(){return a.createElement(u,{error:t,tryAgain:n})}},a.createElement(i.Z,null,a.createElement("title",null,"Page Error")),a.createElement(l.Z,null,a.createElement(u,{error:t,tryAgain:n})))}var c=function(e){return a.createElement(s,e)},d=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={error:null},n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidCatch=function(e){o.Z.canUseDOM&&this.setState({error:e})},n.render=function(){var e=this,t=this.props.children,n=this.state.error;if(n){var r,a={error:n,tryAgain:function(){return e.setState({error:null})}};return(null!=(r=this.props.fallback)?r:c)(a)}return null!=t?t:null},t}(a.Component)},412:function(e,t){"use strict";var n=!("undefined"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:n,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:n&&"IntersectionObserver"in window,canUseViewport:n&&!!window.screen};t.Z=r},5742:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:function(e,t,n){"use strict";n.d(t,{Z:function(){return h}});var r=n(7462),a=n(3366),o=n(7294),i=n(3727),l=n(8780),u=n(2263),s=n(3919),c=n(412),d=o.createContext({collectLink:function(){}});var f=n(4996),p=["isNavLink","to","href","activeClassName","isActive","data-noBrokenLinkCheck","autoAddBaseUrl"];function m(e,t){var n,m,h=e.isNavLink,g=e.to,v=e.href,b=e.activeClassName,y=e.isActive,w=e["data-noBrokenLinkCheck"],k=e.autoAddBaseUrl,E=void 0===k||k,S=(0,a.Z)(e,p),x=(0,u.Z)().siteConfig,C=x.trailingSlash,_=x.baseUrl,T=(0,f.C)().withBaseUrl,A=(0,o.useContext)(d),L=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(function(){return L.current}));var R=g||v;var O,N=(0,s.Z)(R),P=null==R?void 0:R.replace("pathname://",""),I=void 0!==P?(O=P,E&&function(e){return e.startsWith("/")}(O)?T(O):O):void 0;I&&N&&(I=(0,l.applyTrailingSlash)(I,{trailingSlash:C,baseUrl:_}));var D=(0,o.useRef)(!1),M=h?i.OL:i.rU,F=c.Z.canUseIntersectionObserver,j=(0,o.useRef)();(0,o.useEffect)((function(){return!F&&N&&null!=I&&window.docusaurus.prefetch(I),function(){F&&j.current&&j.current.disconnect()}}),[j,I,F,N]);var B=null!=(n=null==(m=I)?void 0:m.startsWith("#"))&&n,z=!I||!N||B;return z||w||A.collectLink(I),z?o.createElement("a",(0,r.Z)({ref:L,href:I},R&&!N&&{target:"_blank",rel:"noopener noreferrer"},S)):o.createElement(M,(0,r.Z)({},S,{onMouseEnter:function(){D.current||null==I||(window.docusaurus.preload(I),D.current=!0)},innerRef:function(e){L.current=e,F&&e&&N&&(j.current=new window.IntersectionObserver((function(t){t.forEach((function(t){e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=I&&window.docusaurus.prefetch(I))}))})),j.current.observe(e))},to:I},h&&{isActive:y,activeClassName:b}))}var h=o.forwardRef(m)},5999:function(e,t,n){"use strict";n.d(t,{Z:function(){return u},I:function(){return l}});var r=n(7294);function a(e,t){var n=e.split(/(\{\w+\})/).map((function(e,n){if(n%2==1){var r=null==t?void 0:t[e.slice(1,-1)];if(void 0!==r)return r}return e}));return n.some((function(e){return(0,r.isValidElement)(e)}))?n.map((function(e,t){return(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e})).filter((function(e){return""!==e})):n.join("")}var o=n(7529);function i(e){var t,n,r=e.id,a=e.message;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){return a(i({message:e.message,id:e.id}),t)}function u(e){var t=e.children,n=e.id,o=e.values;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");var l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:function(e,t,n){"use strict";n.d(t,{m:function(){return r}});var r="default"},3919:function(e,t,n){"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:function(){return a},b:function(){return r}})},4996:function(e,t,n){"use strict";n.d(t,{C:function(){return o},Z:function(){return i}});var r=n(2263),a=n(3919);function o(){var e=(0,r.Z)().siteConfig,t=e.baseUrl,n=e.url;return{withBaseUrl:function(e,r){return function(e,t,n,r){var o=void 0===r?{}:r,i=o.forcePrependBaseUrl,l=void 0!==i&&i,u=o.absolute,s=void 0!==u&&u;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(l)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;var c=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+c:c}(n,t,e,r)}}}function i(e,t){return void 0===t&&(t={}),(0,o().withBaseUrl)(e,t)}},2263:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:function(e,t,n){"use strict";n.d(t,{Z:function(){return r}});function r(e){var t={};return function e(n,r){Object.entries(n).forEach((function(n){var a,o=n[0],i=n[1],l=r?r+"."+o:o;"object"==typeof(a=i)&&a&&Object.keys(a).length>0?e(i,l):t[l]=i}))}(e),t}},226:function(e,t,n){"use strict";n.d(t,{_:function(){return a},z:function(){return o}});var r=n(7294),a=r.createContext(null);function o(e){var t=e.children,n=e.value,o=r.useContext(a),i=(0,r.useMemo)((function(){return function(e){var t=e.parent,n=e.value;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}var r=Object.assign({},t.data,null==n?void 0:n.data);return{plugin:t.plugin,data:r}}({parent:o,value:n})}),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:function(e,t,n){"use strict";n.d(t,{Iw:function(){return h},gA:function(){return f},_r:function(){return c},Jo:function(){return g},zh:function(){return d},yW:function(){return m},gB:function(){return p}});var r=n(6775),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});var n=(0,a.Z)().globalData[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}var l=function(e){return e.versions.find((function(e){return e.isLast}))};function u(e,t){var n,a,o=function(e,t){var n=l(e);return[].concat(e.versions.filter((function(e){return e!==n})),[n]).find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})}))}(e,t),i=null==o?void 0:o.docs.find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})}));return{activeVersion:o,activeDoc:i,alternateDocVersions:i?(n=i.id,a={},e.versions.forEach((function(e){e.docs.forEach((function(t){t.id===n&&(a[e.name]=t)}))})),a):{}}}var s={},c=function(){var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:s},d=function(e){return function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});var r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0})};function f(e){return void 0===e&&(e={}),function(e,t,n){void 0===n&&(n={});var a=Object.entries(e).sort((function(e,t){return t[1].path.localeCompare(e[1].path)})).find((function(e){var n=e[1];return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((function(e){return e.path})).join(", "));return o}(c(),(0,r.TH)().pathname,e)}function p(e){return d(e).versions}function m(e){var t=d(e);return l(t)}function h(e){return u(d(e),(0,r.TH)().pathname)}function g(e){return function(e,t){var n=l(e);return{latestDocSuggestion:u(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(d(e),(0,r.TH)().pathname)}},6200:function(e,t,n){"use strict";n.r(t);var r={onRouteDidUpdate:function(e){var t=e.location,n=e.previousLocation;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((function(){window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}};t.default=r},8320:function(e,t,n){"use strict";n.r(t);var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});var o={onRouteUpdate:function(e){var t=e.location,n=e.previousLocation;if(n&&t.pathname!==n.pathname){var r=window.setTimeout((function(){a().start()}),200);return function(){return window.clearTimeout(r)}}},onRouteDidUpdate:function(){a().done()}};t.default=o},3310:function(e,t,n){"use strict";n.r(t);var r,a,o=n(7410),i=n(6809);r=o.Z,a=i.Z.themeConfig.prism.additionalLanguages,globalThis.Prism=r,a.forEach((function(e){n(6726)("./prism-"+e)})),delete globalThis.Prism},8483:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294),a="iconExternalLink_lCJq";function o(e){var t=e.width,n=void 0===t?13.5:t,o=e.height,i=void 0===o?13.5:o;return r.createElement("svg",{width:n,height:i,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},5257:function(e,t,n){"use strict";n.d(t,{Z:function(){return kt}});var r=n(7294),a=n(6010),o=n(4763),i=n(9727),l=n(1944),u=n(5281),s=n(5999),c=n(6775),d=n(5936);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}var p="skipToContent_fXgn";function m(){var e=function(){var e=(0,r.useRef)(null),t=(0,c.k6)().action,n=(0,r.useCallback)((function(e){var t;e.preventDefault();var n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+u.k.wrapper.main);n&&f(n)}),[]);return(0,d.S)((function(n){var r=n.location;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}(),t=e.containerRef,n=e.handleSkip;return r.createElement("div",{ref:t,role:"region"},r.createElement("a",{href:"#",className:p,onClick:n},r.createElement(s.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var h=n(9689),g=n(6668),v=n(7462),b=n(3366),y=["width","height","color","strokeWidth","className"];function w(e){var t=e.width,n=void 0===t?21:t,a=e.height,o=void 0===a?21:a,i=e.color,l=void 0===i?"currentColor":i,u=e.strokeWidth,s=void 0===u?1.2:u,c=(e.className,(0,b.Z)(e,y));return r.createElement("svg",(0,v.Z)({viewBox:"0 0 15 15",width:n,height:o},c),r.createElement("g",{stroke:l,strokeWidth:s},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}var k="announcementBar_mb4j",E="announcementBarPlaceholder_vyr4",S="announcementBarClose_gvF7",x="announcementBarContent_xLdY";function C(){var e=(0,h.nT)(),t=e.isActive,n=e.close,o=(0,g.L)().announcementBar;if(!t)return null;var i=o.content,l=o.backgroundColor,u=o.textColor,c=o.isCloseable;return r.createElement("div",{className:k,style:{backgroundColor:l,color:u},role:"banner"},c&&r.createElement("div",{className:E}),r.createElement("div",{className:x,dangerouslySetInnerHTML:{__html:i}}),c?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",S),onClick:n,"aria-label":(0,s.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(w,{width:14,height:14,strokeWidth:3.1})):null)}var _=n(2961),T=n(2466);var A=n(9688),L=n(3102),R=r.createContext(null);function O(e){var t,n,a,o,i,l,u,s=e.children,c=(t=(0,_.e)(),n=(0,L.HY)(),a=(0,r.useState)(!1),o=a[0],i=a[1],l=null!==n.component,u=(0,A.D9)(l),(0,r.useEffect)((function(){l&&!u&&i(!0)}),[l,u]),(0,r.useEffect)((function(){l?t.shown||i(!0):i(!1)}),[t.shown,l]),(0,r.useMemo)((function(){return[o,i]}),[o]));return r.createElement(R.Provider,{value:c},s)}function N(e){if(e.component){var t=e.component;return r.createElement(t,e.props)}}function P(){var e=(0,r.useContext)(R);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");var t=e[0],n=e[1],a=(0,r.useCallback)((function(){return n(!1)}),[n]),o=(0,L.HY)();return(0,r.useMemo)((function(){return{shown:t,hide:a,content:N(o)}}),[a,o,t])}function I(e){var t=e.header,n=e.primaryMenu,o=e.secondaryMenu,i=P().shown;return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var D=n(2949),M=n(2389);function F(e){return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function j(e){return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}var B={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function z(e){var t=e.className,n=e.value,o=e.onChange,i=(0,M.Z)(),l=(0,s.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,s.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(B.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",B.toggleButton,!i&&B.toggleButtonDisabled),type:"button",onClick:function(){return o("dark"===n?"light":"dark")},disabled:!i,title:l,"aria-label":l},r.createElement(F,{className:(0,a.Z)(B.toggleIcon,B.lightToggleIcon)}),r.createElement(j,{className:(0,a.Z)(B.toggleIcon,B.darkToggleIcon)})))}var U=r.memo(z);function $(e){var t=e.className,n=(0,g.L)().colorMode.disableSwitch,a=(0,D.I)(),o=a.colorMode,i=a.setColorMode;return n?null:r.createElement(U,{className:t,value:o,onChange:i})}var q=n(1327);function Z(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function H(){var e=(0,_.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:function(){return e.toggle()}},r.createElement(w,{color:"var(--ifm-color-emphasis-600)"}))}function G(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(Z,null),r.createElement($,{className:"margin-right--md"}),r.createElement(H,null))}var V=n(9960),W=n(4996),Y=n(3919);function K(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var X=n(8483),Q=["activeBasePath","activeBaseRegex","to","href","label","html","isDropdownLink","prependBaseUrlToHref"];function J(e){var t=e.activeBasePath,n=e.activeBaseRegex,a=e.to,o=e.href,i=e.label,l=e.html,u=e.isDropdownLink,s=e.prependBaseUrlToHref,c=(0,b.Z)(e,Q),d=(0,W.Z)(a),f=(0,W.Z)(t),p=(0,W.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,Y.Z)(o),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(X.Z,u&&{width:12,height:12}))};return o?r.createElement(V.Z,(0,v.Z)({href:s?p:o},c,h)):r.createElement(V.Z,(0,v.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:function(e,t){return n?K(n,t.pathname):t.pathname.startsWith(f)}},c,h))}var ee=["className","isDropdownItem"],te=["className","isDropdownItem"],ne=["mobile","position"];function re(e){var t=e.className,n=e.isDropdownItem,o=void 0!==n&&n,i=(0,b.Z)(e,ee),l=r.createElement(J,(0,v.Z)({className:(0,a.Z)(o?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:o},i));return o?r.createElement("li",null,l):l}function ae(e){var t=e.className,n=(e.isDropdownItem,(0,b.Z)(e,te));return r.createElement("li",{className:"menu__list-item"},r.createElement(J,(0,v.Z)({className:(0,a.Z)("menu__link",t)},n)))}function oe(e){var t,n=e.mobile,a=void 0!==n&&n,o=(e.position,(0,b.Z)(e,ne)),i=a?ae:re;return r.createElement(i,(0,v.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:a?"menu__link--active":"navbar__link--active"}))}var ie=n(8596),le=n(2263);var ue=n(6043),se=["items","position","className","onClick"],ce=["items","className","position","onClick"],de=["mobile"];function fe(e,t){return e.some((function(e){return function(e,t){return!!(0,ie.Mg)(e.to,t)||!!K(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)}))}function pe(e){var t,n=e.items,o=e.position,i=e.className,l=(e.onClick,(0,b.Z)(e,se)),u=(0,r.useRef)(null),s=(0,r.useState)(!1),c=s[0],d=s[1];return(0,r.useEffect)((function(){var e=function(e){u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),function(){document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":c})},r.createElement(J,(0,v.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},l,{onClick:l.to?void 0:function(e){return e.preventDefault()},onKeyDown:function(e){"Enter"===e.key&&(e.preventDefault(),d(!c))}}),null!=(t=l.children)?t:l.label),r.createElement("ul",{className:"dropdown__menu"},n.map((function(e,t){return r.createElement(Ie,(0,v.Z)({isDropdownItem:!0,onKeyDown:function(e){if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);var r=u.current.nextElementSibling;if(r)(r instanceof HTMLAnchorElement?r:r.querySelector("a")).focus()}},activeClassName:"dropdown__link--active"},e,{key:t}))}))))}function me(e){var t,n,o=e.items,i=e.className,l=(e.position,e.onClick),u=(0,b.Z)(e,ce),s=(n=(0,le.Z)().siteConfig.baseUrl,(0,c.TH)().pathname.replace(n,"/")),d=fe(o,s),f=(0,ue.u)({initialState:function(){return!d}}),p=f.collapsed,m=f.toggleCollapsed,h=f.setCollapsed;return(0,r.useEffect)((function(){d&&h(!d)}),[s,d,h]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(J,(0,v.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",i)},u,{onClick:function(e){e.preventDefault(),m()}}),null!=(t=u.children)?t:u.label),r.createElement(ue.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},o.map((function(e,t){return r.createElement(Ie,(0,v.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))}))))}function he(e){var t=e.mobile,n=void 0!==t&&t,a=(0,b.Z)(e,de),o=n?me:pe;return r.createElement(o,a)}var ge=n(4711),ve=["width","height"];function be(e){var t=e.width,n=void 0===t?20:t,a=e.height,o=void 0===a?20:a,i=(0,b.Z)(e,ve);return r.createElement("svg",(0,v.Z)({viewBox:"0 0 24 24",width:n,height:o,"aria-hidden":!0},i),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}var ye="iconLanguage_nlXk",we=["mobile","dropdownItemsBefore","dropdownItemsAfter"];var ke=function(){return null},Ee="searchBox_ZlJk";function Se(e){var t=e.children,n=e.className;return r.createElement("div",{className:(0,a.Z)(n,Ee)},t)}var xe=n(143),Ce=n(8425),_e=["docId","label","docsPluginId"];var Te=["sidebarId","label","docsPluginId"];var Ae=["label","to","docsPluginId"];var Le=n(373),Re=["mobile","docsPluginId","dropdownActiveClassDisabled","dropdownItemsBefore","dropdownItemsAfter"],Oe=function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))};var Ne={default:oe,localeDropdown:function(e){var t=e.mobile,n=e.dropdownItemsBefore,a=e.dropdownItemsAfter,o=(0,b.Z)(e,we),i=(0,le.Z)().i18n,l=i.currentLocale,u=i.locales,c=i.localeConfigs,d=(0,ge.l)(),f=u.map((function(e){var n="pathname://"+d.createUrl({locale:e,fullyQualified:!1});return{label:c[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===l?t?"menu__link--active":"dropdown__link--active":""}})),p=[].concat(n,f,a),m=t?(0,s.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):c[l].label;return r.createElement(he,(0,v.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(be,{className:ye}),m),items:p}))},search:function(e){var t=e.mobile,n=e.className;return t?null:r.createElement(Se,{className:n},r.createElement(ke,null))},dropdown:he,html:function(e){var t=e.value,n=e.className,o=e.mobile,i=void 0!==o&&o,l=e.isDropdownItem,u=void 0!==l&&l,s=u?"li":"div";return r.createElement(s,{className:(0,a.Z)({navbar__item:!i&&!u,"menu__list-item":i},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){var t=e.docId,n=e.label,a=e.docsPluginId,o=(0,b.Z)(e,_e),i=(0,xe.Iw)(a).activeDoc,l=(0,Ce.vY)(t,a);return null===l?null:r.createElement(oe,(0,v.Z)({exact:!0},o,{isActive:function(){return(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar},label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){var t=e.sidebarId,n=e.label,a=e.docsPluginId,o=(0,b.Z)(e,Te),i=(0,xe.Iw)(a).activeDoc,l=(0,Ce.oz)(t,a).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(oe,(0,v.Z)({exact:!0},o,{isActive:function(){return(null==i?void 0:i.sidebar)===t},label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){var t=e.label,n=e.to,a=e.docsPluginId,o=(0,b.Z)(e,Ae),i=(0,Ce.lO)(a)[0],l=null!=t?t:i.label,u=null!=n?n:function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))}(i).path;return r.createElement(oe,(0,v.Z)({},o,{label:l,to:u}))},docsVersionDropdown:function(e){var t=e.mobile,n=e.docsPluginId,a=e.dropdownActiveClassDisabled,o=e.dropdownItemsBefore,i=e.dropdownItemsAfter,l=(0,b.Z)(e,Re),u=(0,xe.Iw)(n),c=(0,xe.gB)(n),d=(0,Le.J)(n).savePreferredVersionName,f=c.map((function(e){var t,n=null!=(t=u.alternateDocVersions[e.name])?t:Oe(e);return{label:e.label,to:n.path,isActive:function(){return e===u.activeVersion},onClick:function(){return d(e.name)}}})),p=[].concat(o,f,i),m=(0,Ce.lO)(n)[0],h=t&&p.length>1?(0,s.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,g=t&&p.length>1?void 0:Oe(m).path;return p.length<=1?r.createElement(oe,(0,v.Z)({},l,{mobile:t,label:h,to:g,isActive:a?function(){return!1}:void 0})):r.createElement(he,(0,v.Z)({},l,{mobile:t,label:h,to:g,items:p,isActive:a?function(){return!1}:void 0}))}},Pe=["type"];function Ie(e){var t=e.type,n=(0,b.Z)(e,Pe),a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ne[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function De(){var e=(0,_.e)(),t=(0,g.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map((function(t,n){return r.createElement(Ie,(0,v.Z)({mobile:!0},t,{onClick:function(){return e.toggle()},key:n}))})))}function Me(e){return r.createElement("button",(0,v.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(s.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Fe(){var e=0===(0,g.L)().navbar.items.length,t=P();return r.createElement(r.Fragment,null,!e&&r.createElement(Me,{onClick:function(){return t.hide()}}),t.content)}function je(){var e,t=(0,_.e)();return void 0===(e=t.shown)&&(e=!0),(0,r.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e]),t.shouldRender?r.createElement(I,{header:r.createElement(G,null),primaryMenu:r.createElement(De,null),secondaryMenu:r.createElement(Fe,null)}):null}var Be="navbarHideable_m1mJ",ze="navbarHidden_jGov";function Ue(e){return r.createElement("div",(0,v.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function $e(e){var t=e.children,n=(0,g.L)().navbar,o=n.hideOnScroll,i=n.style,l=(0,_.e)(),u=function(e){var t=(0,r.useState)(e),n=t[0],a=t[1],o=(0,r.useRef)(!1),i=(0,r.useRef)(0),l=(0,r.useCallback)((function(e){null!==e&&(i.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)((function(t,n){var r=t.scrollY;if(e)if(r<i.current)a(!0);else if(o.current)o.current=!1;else{var l=null==n?void 0:n.scrollY,u=document.documentElement.scrollHeight-i.current,s=window.innerHeight;l&&r>=l?a(!1):r+s<u&&a(!0)}})),(0,d.S)((function(t){if(e)return t.location.hash?(o.current=!0,void a(!1)):void a(!0)})),{navbarRef:l,isNavbarVisible:n}}(o),s=u.navbarRef,c=u.isNavbarVisible;return r.createElement("nav",{ref:s,className:(0,a.Z)("navbar","navbar--fixed-top",o&&[Be,!c&&ze],{"navbar--dark":"dark"===i,"navbar--primary":"primary"===i,"navbar-sidebar--show":l.shown})},t,r.createElement(Ue,{onClick:l.toggle}),r.createElement(je,null))}function qe(e){var t=e.children;return r.createElement(L.n2,null,r.createElement(_.M,null,r.createElement(O,null,t)))}var Ze=["width","height","className"];function He(e){var t=e.width,n=void 0===t?30:t,a=e.height,o=void 0===a?30:a,i=e.className,l=(0,b.Z)(e,Ze);return r.createElement("svg",(0,v.Z)({className:i,width:n,height:o,viewBox:"0 0 30 30","aria-hidden":"true"},l),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Ge(){var e=(0,_.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(He,null))}var Ve="colorModeToggle_DEke";function We(e){var t=e.items;return r.createElement(r.Fragment,null,t.map((function(e,t){return r.createElement(Ie,(0,v.Z)({},e,{key:t}))})))}function Ye(e){var t=e.left,n=e.right;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ke(){var e=(0,_.e)(),t=(0,g.L)().navbar.items,n=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((function(e){return!t(e)}))]}(t),a=n[0],o=n[1],i=t.find((function(e){return"search"===e.type}));return r.createElement(Ye,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ge,null),r.createElement(Z,null),r.createElement(We,{items:a})),right:r.createElement(r.Fragment,null,r.createElement(We,{items:o}),r.createElement($,{className:Ve}),!i&&r.createElement(Se,null,r.createElement(ke,null)))})}function Xe(){return r.createElement($e,null,r.createElement(Ke,null))}var Qe=["to","href","label","prependBaseUrlToHref"];function Je(e){var t=e.item,n=t.to,a=t.href,o=t.label,i=t.prependBaseUrlToHref,l=(0,b.Z)(t,Qe),u=(0,W.Z)(n),s=(0,W.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(V.Z,(0,v.Z)({className:"footer__link-item"},a?{href:i?s:a}:{to:u},l),o,a&&!(0,Y.Z)(a)&&r.createElement(X.Z,null))}function et(e){var t,n=e.item;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(Je,{item:n}))}function tt(e){var t=e.column;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map((function(e,t){return r.createElement(et,{key:t,item:e})}))))}function nt(e){var t=e.columns;return r.createElement("div",{className:"row footer__links"},t.map((function(e,t){return r.createElement(tt,{key:t,column:e})})))}function rt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function at(e){var t=e.item;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Je,{item:t})}function ot(e){var t=e.links;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map((function(e,n){return r.createElement(r.Fragment,{key:n},r.createElement(at,{item:e}),t.length!==n+1&&r.createElement(rt,null))}))))}function it(e){var t=e.links;return function(e){return"title"in e[0]}(t)?r.createElement(nt,{columns:t}):r.createElement(ot,{links:t})}var lt=n(941),ut="footerLogoLink_BH7S";function st(e){var t,n=e.logo,a=(0,W.C)().withBaseUrl,o={light:a(n.src),dark:a(null!=(t=n.srcDark)?t:n.src)};return r.createElement(lt.Z,{className:"footer__logo",alt:n.alt,sources:o,width:n.width,height:n.height})}function ct(e){var t=e.logo;return t.href?r.createElement(V.Z,{href:t.href,className:ut,target:t.target},r.createElement(st,{logo:t})):r.createElement(st,{logo:t})}function dt(e){var t=e.copyright;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ft(e){var t=e.style,n=e.links,o=e.logo,i=e.copyright;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function pt(){var e=(0,g.L)().footer;if(!e)return null;var t=e.copyright,n=e.links,a=e.logo,o=e.style;return r.createElement(ft,{style:o,links:n&&n.length>0&&r.createElement(it,{links:n}),logo:a&&r.createElement(ct,{logo:a}),copyright:t&&r.createElement(dt,{copyright:t})})}var mt=r.memo(pt),ht=n(12),gt="docusaurus.tab.",vt=r.createContext(void 0);function bt(e){var t=e.children,n=function(){var e=(0,r.useState)({}),t=e[0],n=e[1],a=(0,r.useCallback)((function(e,t){(0,ht.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((function(){try{var e={};(0,ht._)().forEach((function(t){if(t.startsWith(gt)){var n=t.substring(gt.length);e[n]=(0,ht.W)(t).get()}})),n(e)}catch(t){console.error(t)}}),[]);var o=(0,r.useCallback)((function(e,t){n((function(n){var r;return Object.assign({},n,((r={})[e]=t,r))})),a(e,t)}),[a]);return(0,r.useMemo)((function(){return{tabGroupChoices:t,setTabGroupChoices:o}}),[t,o])}();return r.createElement(vt.Provider,{value:n},t)}function yt(e){var t=e.children;return r.createElement(D.S,null,r.createElement(h.pl,null,r.createElement(bt,null,r.createElement(T.OC,null,r.createElement(Le.L5,null,r.createElement(l.VC,null,r.createElement(qe,null,t)))))))}function wt(e){var t=e.error,n=e.tryAgain;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(s.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(s.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}function kt(e){var t=e.children,n=e.noFooter,s=e.wrapperClassName,c=e.title,d=e.description;return(0,i.t)(),r.createElement(yt,null,r.createElement(l.d,{title:c,description:d}),r.createElement(m,null),r.createElement(C,null),r.createElement(Xe,null),r.createElement("div",{className:(0,a.Z)(u.k.wrapper.main,s)},r.createElement(o.Z,{fallback:function(e){return r.createElement(wt,e)}},t)),!n&&r.createElement(mt,null))}},1327:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var r=n(7462),a=n(3366),o=n(7294),i=n(9960),l=n(4996),u=n(2263),s=n(6668),c=n(941),d=["imageClassName","titleClassName"];function f(e){var t=(0,u.Z)().siteConfig.title,n=(0,s.L)().navbar,f=n.title,p=n.logo,m=void 0===p?{src:""}:p,h=e.imageClassName,g=e.titleClassName,v=(0,a.Z)(e,d),b=(0,l.Z)(m.href||"/"),y={light:(0,l.Z)(m.src),dark:(0,l.Z)(m.srcDark||m.src)},w=o.createElement(c.Z,{sources:y,height:m.height,width:m.width,alt:m.alt||f||t});return o.createElement(i.Z,(0,r.Z)({to:b},v,m.target&&{target:m.target}),m.src&&(h?o.createElement("div",{className:h},w):w),null!=f&&o.createElement("b",{className:g},f))}},197:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294),a=n(5742);function o(e){var t=e.locale,n=e.version,o=e.tag,i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:function(e,t,n){"use strict";n.d(t,{Z:function(){return d}});var r=n(7462),a=n(3366),o=n(7294),i=n(6010),l=n(2389),u=n(2949),s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"},c=["sources","className","alt"];function d(e){var t=(0,l.Z)(),n=(0,u.I)().colorMode,d=e.sources,f=e.className,p=e.alt,m=(0,a.Z)(e,c),h=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,h.map((function(e){return o.createElement("img",(0,r.Z)({key:e,src:d[e],alt:p,className:(0,i.Z)(s.themedImage,s["themedImage--"+e],f)},m))})))}},6043:function(e,t,n){"use strict";n.d(t,{u:function(){return s},z:function(){return v}});var r=n(7462),a=n(3366),o=n(7294),i=n(412),l=["collapsed"],u=["lazy"];function s(e){var t=e.initialState,n=(0,o.useState)(null!=t&&t),r=n[0],a=n[1],i=(0,o.useCallback)((function(){a((function(e){return!e}))}),[]);return{collapsed:r,setCollapsed:a,toggleCollapsed:i}}var c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){var n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){var t=e.collapsibleRef,n=e.collapsed,r=e.animation,a=(0,o.useRef)(!1);(0,o.useEffect)((function(){var e,o=t.current;function i(){var e,t,n=o.scrollHeight,a=null!=(e=null==r?void 0:r.duration)?e:function(e){var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}(n);return{transition:"height "+a+"ms "+(null!=(t=null==r?void 0:r.easing)?t:"ease-in-out"),height:n+"px"}}function l(){var e=i();o.style.transition=e.transition,o.style.height=e.height}if(!a.current)return f(o,n),void(a.current=!0);return o.style.willChange="height",e=requestAnimationFrame((function(){n?(l(),requestAnimationFrame((function(){o.style.height=c.height,o.style.overflow=c.overflow}))):(o.style.display="block",requestAnimationFrame((function(){l()})))})),function(){return cancelAnimationFrame(e)}}),[t,n,r])}function m(e){if(!i.Z.canUseDOM)return e?c:d}function h(e){var t=e.as,n=void 0===t?"div":t,r=e.collapsed,a=e.children,i=e.animation,l=e.onCollapseTransitionEnd,u=e.className,s=e.disableSSRStyle,c=(0,o.useRef)(null);return p({collapsibleRef:c,collapsed:r,animation:i}),o.createElement(n,{ref:c,style:s?void 0:m(r),onTransitionEnd:function(e){"height"===e.propertyName&&(f(c.current,r),null==l||l(r))},className:u},a)}function g(e){var t=e.collapsed,n=(0,a.Z)(e,l),i=(0,o.useState)(!t),u=i[0],s=i[1],c=(0,o.useState)(t),d=c[0],f=c[1];return(0,o.useLayoutEffect)((function(){t||s(!0)}),[t]),(0,o.useLayoutEffect)((function(){u&&f(t)}),[u,t]),u?o.createElement(h,(0,r.Z)({},n,{collapsed:d})):null}function v(e){var t=e.lazy,n=(0,a.Z)(e,u),r=t?g:h;return o.createElement(r,n)}},9689:function(e,t,n){"use strict";n.d(t,{nT:function(){return m},pl:function(){return p}});var r=n(7294),a=n(2389),o=n(12),i=n(9688),l=n(6668),u=(0,o.W)("docusaurus.announcement.dismiss"),s=(0,o.W)("docusaurus.announcement.id"),c=function(){return"true"===u.get()},d=function(e){return u.set(String(e))},f=r.createContext(null);function p(e){var t=e.children,n=function(){var e=(0,l.L)().announcementBar,t=(0,a.Z)(),n=(0,r.useState)((function(){return!!t&&c()})),o=n[0],i=n[1];(0,r.useEffect)((function(){i(c())}),[]);var u=(0,r.useCallback)((function(){d(!0),i(!0)}),[]);return(0,r.useEffect)((function(){if(e){var t=e.id,n=s.get();"annoucement-bar"===n&&(n="announcement-bar");var r=t!==n;s.set(t),r&&d(!1),!r&&c()||i(!1)}}),[e]),(0,r.useMemo)((function(){return{isActive:!!e&&!o,close:u}}),[e,o,u])}();return r.createElement(f.Provider,{value:n},t)}function m(){var e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:function(e,t,n){"use strict";n.d(t,{I:function(){return g},S:function(){return h}});var r=n(7294),a=n(412),o=n(9688),i=n(12),l=n(6668),u=r.createContext(void 0),s="theme",c=(0,i.W)(s),d="light",f="dark",p=function(e){return e===f?f:d};function m(){var e=(0,l.L)().colorMode,t=e.defaultMode,n=e.disableSwitch,o=e.respectPrefersColorScheme,i=(0,r.useState)(function(e){return a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e)}(t)),u=i[0],m=i[1];(0,r.useEffect)((function(){n&&c.del()}),[n]);var h=(0,r.useCallback)((function(e,n){void 0===n&&(n={});var r=n.persist,a=void 0===r||r;e?(m(e),a&&function(e){c.set(p(e))}(e)):(m(o?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:t),c.del())}),[o,t]);(0,r.useEffect)((function(){document.documentElement.setAttribute("data-theme",p(u))}),[u]),(0,r.useEffect)((function(){if(!n){var e=function(e){if(e.key===s){var t=c.get();null!==t&&h(p(t))}};return window.addEventListener("storage",e),function(){return window.removeEventListener("storage",e)}}}),[n,h]);var g=(0,r.useRef)(!1);return(0,r.useEffect)((function(){if(!n||o){var e=window.matchMedia("(prefers-color-scheme: dark)"),t=function(){window.matchMedia("print").matches||g.current?g.current=window.matchMedia("print").matches:h(null)};return e.addListener(t),function(){return e.removeListener(t)}}}),[h,n,o]),(0,r.useMemo)((function(){return{colorMode:u,setColorMode:h,get isDarkTheme(){return u===f},setLightTheme:function(){h(d)},setDarkTheme:function(){h(f)}}}),[u,h])}function h(e){var t=e.children,n=m();return r.createElement(u.Provider,{value:n},t)}function g(){var e=(0,r.useContext)(u);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:function(e,t,n){"use strict";n.d(t,{J:function(){return y},L5:function(){return v}});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(8425),u=n(9688),s=n(12),c=function(e){return"docs-preferred-version-"+e},d=function(e,t,n){(0,s.W)(c(e),{persistence:t}).set(n)},f=function(e,t){return(0,s.W)(c(e),{persistence:t}).get()},p=function(e,t){(0,s.W)(c(e),{persistence:t}).del()};var m=r.createContext(null);function h(){var e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((function(){return Object.keys(e)}),[e]),o=(0,r.useState)((function(){return function(e){return Object.fromEntries(e.map((function(e){return[e,{preferredVersionName:null}]})))}(n)})),l=o[0],u=o[1];return(0,r.useEffect)((function(){u(function(e){var t=e.pluginIds,n=e.versionPersistence,r=e.allDocsData;return Object.fromEntries(t.map((function(e){return[e,(t=e,a=f(t,n),r[t].versions.some((function(e){return e.name===a}))?{preferredVersionName:a}:(p(t,n),{preferredVersionName:null}))];var t,a})))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]),[l,(0,r.useMemo)((function(){return{savePreferredVersion:function(e,n){d(e,t,n),u((function(t){var r;return Object.assign({},t,((r={})[e]={preferredVersionName:n},r))}))}}}),[t])]}function g(e){var t=e.children,n=h();return r.createElement(m.Provider,{value:n},t)}function v(e){var t=e.children;return l.cE?r.createElement(g,null,t):t}function b(){var e=(0,r.useContext)(m);if(!e)throw new u.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);var n=(0,a.zh)(e),i=b(),l=i[0],u=i[1],s=l[e].preferredVersionName;return{preferredVersion:null!=(t=n.versions.find((function(e){return e.name===s})))?t:null,savePreferredVersionName:(0,r.useCallback)((function(t){u.savePreferredVersion(e,t)}),[u,e])}}},1116:function(e,t,n){"use strict";n.d(t,{V:function(){return u},b:function(){return l}});var r=n(7294),a=n(9688),o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){var t=e.children,n=e.name,a=e.items,o=(0,r.useMemo)((function(){return n&&a?{name:n,items:a}:null}),[n,a]);return r.createElement(i.Provider,{value:o},t)}function u(){var e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:function(e,t,n){"use strict";n.d(t,{M:function(){return f},e:function(){return p}});var r=n(7294),a=n(3102),o=n(7524),i=n(6775),l=n(9688);function u(e){!function(e){var t=(0,i.k6)(),n=(0,l.ed)(e);(0,r.useEffect)((function(){return t.block((function(e,t){return n(e,t)}))}),[t,n])}((function(t,n){if("POP"===n)return e(t,n)}))}var s=n(6668),c=r.createContext(void 0);function d(){var e,t=(e=(0,a.HY)(),0===(0,s.L)().navbar.items.length&&!e.component),n=(0,o.i)(),i=!t&&"mobile"===n,l=(0,r.useState)(!1),c=l[0],d=l[1];u((function(){if(c)return d(!1),!1}));var f=(0,r.useCallback)((function(){d((function(e){return!e}))}),[]);return(0,r.useEffect)((function(){"desktop"===n&&d(!1)}),[n]),(0,r.useMemo)((function(){return{disabled:t,shouldRender:i,toggle:f,shown:c}}),[t,i,f,c])}function f(e){var t=e.children,n=d();return r.createElement(c.Provider,{value:n},t)}function p(){var e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:function(e,t,n){"use strict";n.d(t,{HY:function(){return l},Zo:function(){return u},n2:function(){return i}});var r=n(7294),a=n(9688),o=r.createContext(null);function i(e){var t=e.children,n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){var e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){var t=e.component,n=e.props,i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");var l=i[1],u=(0,a.Ql)(n);return(0,r.useEffect)((function(){l({component:t,props:u})}),[l,t,u]),(0,r.useEffect)((function(){return function(){return l({component:null,props:null})}}),[l]),null}},9727:function(e,t,n){"use strict";n.d(t,{h:function(){return a},t:function(){return o}});var r=n(7294),a="navigation-with-keyboard";function o(){(0,r.useEffect)((function(){function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),function(){document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:function(e,t,n){"use strict";n.d(t,{i:function(){return s}});var r=n(7294),a=n(412),o="desktop",i="mobile",l="ssr";function u(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function s(){var e=(0,r.useState)((function(){return u()})),t=e[0],n=e[1];return(0,r.useEffect)((function(){function e(){n(u())}return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),t}},5281:function(e,t,n){"use strict";n.d(t,{k:function(){return r}});var r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:function(e){return"theme-admonition-"+e}},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:function(e){return"theme-doc-sidebar-item-category-level-"+e},docSidebarItemLinkLevel:function(e){return"theme-doc-sidebar-item-link-level-"+e}},blog:{}}},8425:function(e,t,n){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function a(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var a=0;return function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}n.d(t,{Wl:function(){return m},_F:function(){return g},cE:function(){return p},hI:function(){return k},lO:function(){return b},vY:function(){return w},oz:function(){return y},s1:function(){return v}});var o=n(7294),i=n(6775),l=n(8790),u=n(143),s=n(373),c=n(1116);function d(e){return Array.from(new Set(e))}var f=n(8596),p=!!u._r;function m(e){if(e.href)return e.href;for(var t,n=a(e.items);!(t=n()).done;){var r=t.value;if("link"===r.type)return r.href;if("category"===r.type){var o=m(r);if(o)return o}}}var h=function(e,t){return void 0!==e&&(0,f.Mg)(e,t)};function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||function(e,t){return e.some((function(e){return g(e,t)}))}(e.items,t))}function v(){var e,t=(0,c.V)(),n=(0,i.TH)().pathname;if(!1===(null==(e=(0,u.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;var r=[];return function e(t){for(var o,i=a(t);!(o=i()).done;){var l=o.value;if("category"===l.type&&((0,f.Mg)(l.href,n)||e(l.items))||"link"===l.type&&(0,f.Mg)(l.href,n))return r.push(l),!0}return!1}(t.items),r.reverse()}function b(e){var t=(0,u.Iw)(e).activeVersion,n=(0,s.J)(e).preferredVersion,r=(0,u.yW)(e);return(0,o.useMemo)((function(){return d([t,n,r].filter(Boolean))}),[t,n,r])}function y(e,t){var n=b(t);return(0,o.useMemo)((function(){var t=n.flatMap((function(e){return e.sidebars?Object.entries(e.sidebars):[]})),r=t.find((function(t){return t[0]===e}));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((function(e){return e.name})).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function w(e,t){var n=b(t);return(0,o.useMemo)((function(){var t=n.flatMap((function(e){return e.docs})),r=t.find((function(t){return t.id===e}));if(!r){if(n.flatMap((function(e){return e.draftIds})).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((function(e){return e.name})).join(", ")+'".\nAvailable doc ids are:\n- '+d(t.map((function(e){return e.id}))).join("\n- "))}return r}),[e,n])}function k(e){var t=e.route,n=e.versionMetadata,r=(0,i.TH)(),a=t.routes,o=a.find((function(e){return(0,i.LX)(r.pathname,e)}));if(!o)return null;var u=o.sidebar,s=u?n.docsSidebars[u]:void 0;return{docElement:(0,l.H)(a,{versionMetadata:n}),sidebarName:u,sidebarItems:s}}},1944:function(e,t,n){"use strict";n.d(t,{FG:function(){return f},d:function(){return c},VC:function(){return p}});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){var e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var u=n(4996),s=n(2263);function c(e){var t=e.title,n=e.description,a=e.keywords,i=e.image,l=e.children,c=function(e){var t=(0,s.Z)().siteConfig,n=t.title,r=t.titleDelimiter;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),d=(0,u.C)().withBaseUrl,f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}var d=r.createContext(void 0);function f(e){var t=e.className,n=e.children,i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){var t=e.children,n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,""),i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},9688:function(e,t,n){"use strict";n.d(t,{i6:function(){return m},ed:function(){return f},D9:function(){return p},Ql:function(){return h}});var r=n(6528),a=n(4578);function o(e){return o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}var i=n(9611);function l(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function u(e,t,n){return u=l()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var a=new(Function.bind.apply(e,r));return n&&(0,i.Z)(a,n.prototype),a},u.apply(null,arguments)}function s(e){var t="function"==typeof Map?new Map:void 0;return s=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return u(e,arguments,o(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,i.Z)(r,e)},s(e)}var c=n(7294),d=n(412).Z.canUseDOM?c.useLayoutEffect:c.useEffect;function f(e){var t=(0,c.useRef)(e);return d((function(){t.current=e}),[e]),(0,c.useCallback)((function(){return t.current.apply(t,arguments)}),[])}function p(e){var t=(0,c.useRef)();return d((function(){t.current=e})),t.current}var m=function(e){function t(t,n){var a,o,i,l,u;return(u=e.call(this)||this).name="ReactContextError",u.message="Hook "+(null!=(a=null==(o=u.stack)||null==(i=o.split("\n")[1])||null==(l=i.match((0,r.Z)(/at (?:\w+\.)?(\w+)/,{name:1})))?void 0:l.groups.name)?a:"")+" is called outside the <"+t+">. "+(null!=n?n:""),u}return(0,a.Z)(t,e),t}(s(Error));function h(e){return(0,c.useMemo)((function(){return e}),[].concat(Object.keys(e),Object.values(e)))}},8596:function(e,t,n){"use strict";n.d(t,{Mg:function(){return i},Ns:function(){return l}});var r=n(7294),a=n(723),o=n(2263);function i(e,t){var n=function(e){var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){var e=(0,o.Z)().siteConfig.baseUrl;return(0,r.useMemo)((function(){return function(e){var t=e.baseUrl;function n(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0!==t.length)return t.find(n)||e(t.filter(r).flatMap((function(e){var t;return null!=(t=e.routes)?t:[]})))}(e.routes)}({routes:a.Z,baseUrl:e})}),[e])}},2466:function(e,t,n){"use strict";n.d(t,{Ct:function(){return f},OC:function(){return u},RF:function(){return d}});var r=n(7294),a=n(412),o=n(2389),i=n(9688);var l=r.createContext(void 0);function u(e){var t,n=e.children,a=(t=(0,r.useRef)(!0),(0,r.useMemo)((function(){return{scrollEventsEnabledRef:t,enableScrollEvents:function(){t.current=!0},disableScrollEvents:function(){t.current=!1}}}),[]));return r.createElement(l.Provider,{value:a},n)}function s(){var e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}var c=function(){return a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null};function d(e,t){void 0===t&&(t=[]);var n=s().scrollEventsEnabledRef,a=(0,r.useRef)(c()),o=(0,i.ed)(e);(0,r.useEffect)((function(){var e=function(){if(n.current){var e=c();o(e,a.current),a.current=e}},t={passive:!0};return e(),window.addEventListener("scroll",e,t),function(){return window.removeEventListener("scroll",e,t)}}),[o,n].concat(t))}function f(){var e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:function(n){e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),function(){}}(n):function(e){var t=null,n=document.documentElement.scrollTop>e;return function r(){var a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),function(){return t&&cancelAnimationFrame(t)}}(n)},cancelScroll:function(){return null==e.current?void 0:e.current()}}}},3320:function(e,t,n){"use strict";n.d(t,{HX:function(){return r},os:function(){return a}});n(2263);var r="default";function a(e,t){return"docs-"+e+"-"+t}},12:function(e,t,n){"use strict";n.d(t,{W:function(){return l},_:function(){return u}});var r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}var o=!1;var i={get:function(){return null},set:function(){},del:function(){}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t}}(e);var n=a(null==t?void 0:t.persistence);return null===n?i:{get:function(){try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:function(t){try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:function(){try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function u(e){void 0===e&&(e=r);var t=a(e);if(!t)return[];for(var n=[],o=0;o<t.length;o+=1){var i=t.key(o);null!==i&&n.push(i)}return n}},4711:function(e,t,n){"use strict";n.d(t,{l:function(){return o}});var r=n(2263),a=n(6775);function o(){var e=(0,r.Z)(),t=e.siteConfig,n=t.baseUrl,o=t.url,i=e.i18n,l=i.defaultLocale,u=i.currentLocale,s=(0,a.TH)().pathname,c=u===l?n:n.replace("/"+u+"/","/"),d=s.replace(n,"");return{createUrl:function(e){var t=e.locale;return""+(e.fullyQualified?o:"")+function(e){return e===l?""+c:""+c+e+"/"}(t)+d}}}},5936:function(e,t,n){"use strict";n.d(t,{S:function(){return i}});var r=n(7294),a=n(6775),o=n(9688);function i(e){var t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.ed)(e);(0,r.useEffect)((function(){n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:function(e,t,n){"use strict";n.d(t,{L:function(){return a}});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=t.trailingSlash,r=t.baseUrl;if(e.startsWith("#"))return e;if(void 0===n)return e;var a,o=e.split(/[#?]/)[0],i="/"===o||o===r?o:(a=o,n?function(e){return e.endsWith("/")?e:e+"/"}(a):function(e){return e.endsWith("/")?e.slice(0,-1):e}(a));return e.replace(o,i)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:function(e,t,n){"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n);else for(t in e)e[t]&&(a&&(a+=" "),a+=t);return a}function a(){for(var e,t,n=0,a="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}n.d(t,{Z:function(){return a}})},9318:function(e,t,n){"use strict";n.d(t,{lX:function(){return w},q_:function(){return _},ob:function(){return p},PP:function(){return A},Ep:function(){return f}});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}var i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),u=t&&a(t),s=l||u;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var c=i[i.length-1];n="."===c||".."===c||""===c}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!s)for(;d--;d)i.unshift("..");!s||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m},l=n(2177);function u(e){return"/"===e.charAt(0)?e:"/"+e}function s(e){return"/"===e.charAt(0)?e.substr(1):e}function c(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 d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var v="popstate",b="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,s=i.forceRefresh,w=void 0!==s&&s,k=i.getUserConfirmation,E=void 0===k?g:k,S=i.keyLength,x=void 0===S?6:S,C=e.basename?d(u(e.basename)):"";function _(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return C&&(o=c(o,C)),p(o,r,n)}function T(){return Math.random().toString(36).substr(2,x)}var A=m();function L(e){(0,r.Z)(U,e),U.length=n.length,A.notifyListeners(U.location,U.action)}function R(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(_(e.state))}function O(){P(_(y()))}var N=!1;function P(e){if(N)N=!1,L();else{A.confirmTransitionTo(e,"POP",E,(function(t){t?L({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(N=!0,F(a))}(e)}))}}var I=_(y()),D=[I.key];function M(e){return C+f(e)}function F(e){n.go(e)}var j=0;function B(e){1===(j+=e)&&1===e?(window.addEventListener(v,R),o&&window.addEventListener(b,O)):0===j&&(window.removeEventListener(v,R),o&&window.removeEventListener(b,O))}var z=!1;var U={length:n.length,action:"POP",location:I,createHref:M,push:function(e,t){var r="PUSH",o=p(e,t,T(),U.location);A.confirmTransitionTo(o,r,E,(function(e){if(e){var t=M(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var u=D.indexOf(U.location.key),s=D.slice(0,u+1);s.push(o.key),D=s,L({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,T(),U.location);A.confirmTransitionTo(o,r,E,(function(e){if(e){var t=M(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var u=D.indexOf(U.location.key);-1!==u&&(D[u]=o.key),L({action:r,location:o})}else window.location.replace(t)}}))},go:F,goBack:function(){F(-1)},goForward:function(){F(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(B(1),z=!0),function(){return z&&(z=!1,B(-1)),t()}},listen:function(e){var t=A.appendListener(e);return B(1),function(){B(-1),t()}}};return U}var k="hashchange",E={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+s(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:s,decodePath:u},slash:{encodePath:u,decodePath:u}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function x(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function C(e){window.location.replace(S(window.location.href)+"#"+e)}function _(e){void 0===e&&(e={}),h||(0,l.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?g:a,i=n.hashType,s=void 0===i?"slash":i,v=e.basename?d(u(e.basename)):"",b=E[s],y=b.encodePath,w=b.decodePath;function _(){var e=w(x());return v&&(e=c(e,v)),p(e)}var T=m();function A(e){(0,r.Z)(z,e),z.length=t.length,T.notifyListeners(z.location,z.action)}var L=!1,R=null;function O(){var e,t,n=x(),r=y(n);if(n!==r)C(r);else{var a=_(),i=z.location;if(!L&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(R===f(a))return;R=null,function(e){if(L)L=!1,A();else{var t="POP";T.confirmTransitionTo(e,t,o,(function(n){n?A({action:t,location:e}):function(e){var t=z.location,n=D.lastIndexOf(f(t));-1===n&&(n=0);var r=D.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(L=!0,M(a))}(e)}))}}(a)}}var N=x(),P=y(N);N!==P&&C(P);var I=_(),D=[f(I)];function M(e){t.go(e)}var F=0;function j(e){1===(F+=e)&&1===e?window.addEventListener(k,O):0===F&&window.removeEventListener(k,O)}var B=!1;var z={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(v+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(v+t);if(x()!==a){R=t,function(e){window.location.hash=e}(a);var o=D.lastIndexOf(f(z.location)),i=D.slice(0,o+1);i.push(t),D=i,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(v+t);x()!==a&&(R=t,C(a));var o=D.indexOf(f(z.location));-1!==o&&(D[o]=t),A({action:n,location:r})}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return B||(j(1),B=!0),function(){return B&&(B=!1,j(-1)),t()}},listen:function(e){var t=T.appendListener(e);return j(1),function(){j(-1),t()}}};return z}function T(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,u=t.keyLength,s=void 0===u?6:u,c=m();function d(e){(0,r.Z)(w,e),w.length=w.entries.length,c.notifyListeners(w.location,w.action)}function h(){return Math.random().toString(36).substr(2,s)}var g=T(l,0,o.length-1),v=o.map((function(e){return p(e,void 0,"string"==typeof e?h():e.key||h())})),b=f;function y(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];c.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:v.length,action:"POP",location:v[g],index:g,entries:v,createHref:b,push:function(e,t){var r="PUSH",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),c.setPrompt(e)},listen:function(e){return c.appendListener(e)}};return w}},8679:function(e,t,n){"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function u(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var s=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=u(t),h=u(n),g=0;g<i.length;++g){var v=i[g];if(!(o[v]||r&&r[v]||h&&h[v]||l&&l[v])){var b=f(n,v);try{s(t,v,b)}catch(y){}}}}return t}},1143:function(e){"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var u;if(void 0===t)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[n,r,a,o,i,l],c=0;(u=new Error(t.replace(/%s/g,(function(){return s[c++]})))).name="Invariant Violation"}throw u.framesToPop=1,u}}},5826:function(e){e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:function(e,t,n){"use strict";n.r(t)},3121:function(e,t,n){"use strict";n.r(t)},5308:function(e,t,n){"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=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:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),s=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),u(s,i(e,c,d)),1===e?(u(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){u(o,{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())}),r.trickleSpeed)};return r.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)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),s=document.querySelector(r.parent);return u(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),s!=document.body&&c(s,"nprogress-custom-parent"),s.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.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 l=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(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function s(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;s(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);s(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:function(e){"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,u=a(e),s=1;s<arguments.length;s++){for(var c in i=Object(arguments[s]))n.call(i,c)&&(u[c]=i[c]);if(t){l=t(i);for(var d=0;d<l.length;d++)r.call(i,l[d])&&(u[l[d]]=i[l[d]])}}return u}},7410:function(e,t){"use strict";var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var u in n)n.hasOwnProperty(u)&&(i[u]=n[u]);n.hasOwnProperty(l)||(i[l]=o[l])}var s=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===s&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var u=t[l],s=r.util.type(u);"Object"!==s||o[i(u)]?"Array"!==s||o[i(u)]||(o[i(u)]=!0,e(u,n,l,o)):(o[i(u)]=!0,e(u,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return r.hooks.run("before-tokenize",o),o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return u(a,a.head,e),i(e,a,t,a.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,c,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var h=p[m],g=h.inside,v=!!h.lookbehind,b=!!h.greedy,y=h.alias;if(b&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var k=h.pattern||h,E=l.next,S=c;E!==t.tail&&!(d&&S>=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,_=1;if(b){if(!(C=o(k,S,e,v))||C.index>=e.length)break;var T=C.index,A=C.index+C[0].length,L=S;for(L+=E.value.length;T>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(L<A||"string"==typeof R.value);R=R.next)_++,L+=R.value.length;_--,x=e.slice(S,L),C.index-=S}else if(!(C=o(k,0,x,v)))continue;T=C.index;var O=C[0],N=x.slice(0,T),P=x.slice(T+O.length),I=S+x.length;d&&I>d.reach&&(d.reach=I);var D=E.prev;if(N&&(D=u(t,D,N),S+=N.length),s(t,D,_),E=u(t,D,new a(f,g?r.tokenize(O,g):O,y,O)),P&&u(t,E,P),_>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function s(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var u in o.attributes)l+=" "+u+'="'+(o.attributes[u]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}(),r=n;n.default=n,r.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,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={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash: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}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};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[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|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|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|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|vcpkg|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;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\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}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.shell=e.languages.bash}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.c=r.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),r.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),r.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},r.languages.c.string],char:r.languages.c.char,comment:r.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:r.languages.c}}}}),r.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete r.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(r),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\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}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(r),r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.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]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"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:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,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"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside: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}(r),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\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:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?: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}(r),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \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(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].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,r=t.length;n<r;n++){var a=t[n];if("code"===a.type){var o=a.content[1],i=a.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),u="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,u]:i.alias.push(u):i.alias=[u]}}else e(a.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r],s=/language-(.+)/.exec(o);if(s){n=s[1];break}}var c,d=e.languages[n];if(d)t.content=e.highlight((c=t.content,c.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),u(n);var r=l[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},u=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(r),r.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:r.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},r.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(d(["definition-mutation","punctuation"])&&"("===c(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=c(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===c(0).content&&(n++,p(c(0),"property-mutation"),a.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var u=n;u<l;u++){var s=t[u];"variable"===s.type&&a.indexOf(s.content)>=0&&p(s,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=c(n+t);if(!r||r.type!==e[n])return!1}return!0}function f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0===--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),r.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},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},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(?:COL|_INSERT)?|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|RETURN(?:ING|S)?|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(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function u(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function s(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,u(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=u(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var u=o.substring(0,l),d=s(c[a]),p=o.substring(l+a.length),m=[];if(u&&m.push(u),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r<a;r++){var o=n[r];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var u=f(l),s=l.alias,d=Array.isArray(s)?s[0]:s,p=e.languages[d];if(!p)continue;i[1]=c(u,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(r),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(r),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}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(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{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:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[a]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(r),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;if("string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var u=i(a);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(u+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(u=i(t[r-1])+u,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",u,null,u)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(r),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(r),r.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},r.languages.go=r.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},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/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),r.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete r.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var u=0;u<l.length&&!(a>=o.length);u++){var s=l[u];if("string"==typeof s||s.content&&"string"==typeof s.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof s?s:s.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof s?l.splice.apply(l,[u,1].concat(b)):s.content=b}}else s.content&&i(s.content)}return l}(n.tokens)}}}})}(r),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,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")})),e.languages.hbs=e.languages.handlebars}(r),r.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},r.languages.webmanifest=r.languages.json,r.languages.less=r.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),r.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),r.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-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",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/,function:{pattern:/(\()(?:abspath|addsuffix|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(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},r.languages.objectivec=r.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete r.languages.objectivec["class-name"],r.languages.objc=r.languages.objectivec,r.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},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|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},r.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:/[{}[\];(),.:]/},r.languages.python["string-interpolation"].inside.interpolation.inside.rest=r.languages.python,r.languages.py=r.languages.python,r.languages.reason=r.languages.extend("clike",{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(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),r.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete r.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,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\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(r),r.languages.scss=r.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),r.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),r.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),r.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),r.languages.scss.atrule.inside.rest=r.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},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+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(r),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(r),r.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|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|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!#$%&'*+\-./:<=>?@\\^`|~]+/,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:/[()]/},t.Z=r},9901:function(e){e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:function(e,t,n){const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:function(e,t,n){var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:function(e,t,n){var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:function(e){"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function a(r,o){if(!(r in n)){o.push(r);var i=o.indexOf(r);if(i<o.length-1)throw new Error("Circular dependency: "+o.slice(i).join(" -> "));var l={},u=e[r];if(u){function s(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(u.require,s),t(u.optional,s),t(u.modify,s)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var u=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),s=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(u);i=i.map(s),l=(l||[]).map(s);var c=n(i),d=n(l);i.forEach((function e(n){var r=u[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(u),m=c;a(m);){for(var h in f={},m){var g=u[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var v in d)if(!(v in c))for(var b in p(v))if(b in c){f[v]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},u={};function s(e){if(e in l)return l[e];u[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=s(e);return delete u[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)s(c);var d=[];for(var f in u)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:function(e,t,n){"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:function(e,t,n){e.exports=n(2703)()},414:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:function(e,t,n){"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(i(227));var l=new Set,u={};function s(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(u[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,m={},h={};function g(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var v={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){v[e]=new g(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];v[t]=new g(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){v[e]=new g(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){v[e]=new g(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){v[e]=new g(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){v[e]=new g(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){v[e]=new g(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){v[e]=new g(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){v[e]=new g(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var a=v.hasOwnProperty(t)?v[t]:null;(null!==a?0===a.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,a,r)&&(n=null),r||null===a?function(e){return!!p.call(h,e)||!p.call(m,e)&&(f.test(e)?h[e]=!0:(m[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,y);v[t]=new g(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,y);v[t]=new g(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,y);v[t]=new g(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){v[e]=new g(e,1,!1,e.toLowerCase(),null,!1,!1)})),v.xlinkHref=new g("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){v[e]=new g(e,1,!1,e.toLowerCase(),null,!0,!0)}));var k=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,E=60103,S=60106,x=60107,C=60108,_=60114,T=60109,A=60110,L=60112,R=60113,O=60120,N=60115,P=60116,I=60121,D=60128,M=60129,F=60130,j=60131;if("function"==typeof Symbol&&Symbol.for){var B=Symbol.for;E=B("react.element"),S=B("react.portal"),x=B("react.fragment"),C=B("react.strict_mode"),_=B("react.profiler"),T=B("react.provider"),A=B("react.context"),L=B("react.forward_ref"),R=B("react.suspense"),O=B("react.suspense_list"),N=B("react.memo"),P=B("react.lazy"),I=B("react.block"),B("react.scope"),D=B("react.opaque.id"),M=B("react.debug_trace_mode"),F=B("react.offscreen"),j=B("react.legacy_hidden")}var z,U="function"==typeof Symbol&&Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function q(e){if(void 0===z)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);z=t&&t[1]||""}return"\n"+z+e}var Z=!1;function H(e,t){if(!e||Z)return"";Z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(u){var r=u}Reflect.construct(e,[],t)}else{try{t.call()}catch(u){r=u}e.call(t.prototype)}else{try{throw Error()}catch(u){r=u}e()}}catch(u){if(u&&r&&"string"==typeof u.stack){for(var a=u.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l])return"\n"+a[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{Z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?q(e):""}function G(e){switch(e.tag){case 5:return q(e.type);case 16:return q("Lazy");case 13:return q("Suspense");case 19:return q("SuspenseList");case 0:case 2:case 15:return e=H(e.type,!1);case 11:return e=H(e.type.render,!1);case 22:return e=H(e.type._render,!1);case 1:return e=H(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case x:return"Fragment";case S:return"Portal";case _:return"Profiler";case C:return"StrictMode";case R:return"Suspense";case O:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case N:return V(e.type);case I:return V(e._render);case P:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return a({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=W(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=W(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ae(e,t.type,n):t.hasOwnProperty("defaultValue")&&ae(e,t.type,W(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ae(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=a({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+W(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ue(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function se(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ce(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de="http://www.w3.org/1999/xhtml",fe="http://www.w3.org/2000/svg";function pe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function me(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?pe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var he,ge,ve=(ge=function(e,t){if(e.namespaceURI!==fe||"innerHTML"in e)e.innerHTML=t;else{for((he=he||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=he.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ge(e,t)}))}:ge);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ye={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},we=["Webkit","ms","Moz","O"];function ke(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ye.hasOwnProperty(e)&&ye[e]?(""+t).trim():t+"px"}function Ee(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=ke(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(ye).forEach((function(e){we.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ye[t]=ye[e]}))}));var Se=a({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xe(e,t){if(t){if(Se[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function Ce(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Te=null,Ae=null,Le=null;function Re(e){if(e=ra(e)){if("function"!=typeof Te)throw Error(i(280));var t=e.stateNode;t&&(t=oa(t),Te(e.stateNode,e.type,t))}}function Oe(e){Ae?Le?Le.push(e):Le=[e]:Ae=e}function Ne(){if(Ae){var e=Ae,t=Le;if(Le=Ae=null,Re(e),t)for(e=0;e<t.length;e++)Re(t[e])}}function Pe(e,t){return e(t)}function Ie(e,t,n,r,a){return e(t,n,r,a)}function De(){}var Me=Pe,Fe=!1,je=!1;function Be(){null===Ae&&null===Le||(De(),Ne())}function ze(e,t){var n=e.stateNode;if(null===n)return null;var r=oa(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var Ue=!1;if(d)try{var $e={};Object.defineProperty($e,"passive",{get:function(){Ue=!0}}),window.addEventListener("test",$e,$e),window.removeEventListener("test",$e,$e)}catch(ge){Ue=!1}function qe(e,t,n,r,a,o,i,l,u){var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(c){this.onError(c)}}var Ze=!1,He=null,Ge=!1,Ve=null,We={onError:function(e){Ze=!0,He=e}};function Ye(e,t,n,r,a,o,i,l,u){Ze=!1,He=null,qe.apply(We,arguments)}function Ke(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Xe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Qe(e){if(Ke(e)!==e)throw Error(i(188))}function Je(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ke(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return Qe(a),e;if(o===r)return Qe(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var l=!1,u=a.child;u;){if(u===n){l=!0,n=a,r=o;break}if(u===r){l=!0,r=a,n=o;break}u=u.sibling}if(!l){for(u=o.child;u;){if(u===n){l=!0,n=o,r=a;break}if(u===r){l=!0,r=o,n=a;break}u=u.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function et(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var tt,nt,rt,at,ot=!1,it=[],lt=null,ut=null,st=null,ct=new Map,dt=new Map,ft=[],pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function mt(e,t,n,r,a){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:a,targetContainers:[r]}}function ht(e,t){switch(e){case"focusin":case"focusout":lt=null;break;case"dragenter":case"dragleave":ut=null;break;case"mouseover":case"mouseout":st=null;break;case"pointerover":case"pointerout":ct.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":dt.delete(t.pointerId)}}function gt(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e=mt(t,n,r,a,o),null!==t&&(null!==(t=ra(t))&&nt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function vt(e){var t=na(e.target);if(null!==t){var n=Ke(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Xe(n)))return e.blockedOn=t,void at(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){rt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=ra(n))&&nt(t),e.blockedOn=n,!1;t.shift()}return!0}function yt(e,t,n){bt(e)&&n.delete(t)}function wt(){for(ot=!1;0<it.length;){var e=it[0];if(null!==e.blockedOn){null!==(e=ra(e.blockedOn))&&tt(e);break}for(var t=e.targetContainers;0<t.length;){var n=Jt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&it.shift()}null!==lt&&bt(lt)&&(lt=null),null!==ut&&bt(ut)&&(ut=null),null!==st&&bt(st)&&(st=null),ct.forEach(yt),dt.forEach(yt)}function kt(e,t){e.blockedOn===t&&(e.blockedOn=null,ot||(ot=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,wt)))}function Et(e){function t(t){return kt(t,e)}if(0<it.length){kt(it[0],e);for(var n=1;n<it.length;n++){var r=it[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==lt&&kt(lt,e),null!==ut&&kt(ut,e),null!==st&&kt(st,e),ct.forEach(t),dt.forEach(t),n=0;n<ft.length;n++)(r=ft[n]).blockedOn===e&&(r.blockedOn=null);for(;0<ft.length&&null===(n=ft[0]).blockedOn;)vt(n),null===n.blockedOn&&ft.shift()}function St(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xt={animationend:St("Animation","AnimationEnd"),animationiteration:St("Animation","AnimationIteration"),animationstart:St("Animation","AnimationStart"),transitionend:St("Transition","TransitionEnd")},Ct={},_t={};function Tt(e){if(Ct[e])return Ct[e];if(!xt[e])return e;var t,n=xt[e];for(t in n)if(n.hasOwnProperty(t)&&t in _t)return Ct[e]=n[t];return e}d&&(_t=document.createElement("div").style,"AnimationEvent"in window||(delete xt.animationend.animation,delete xt.animationiteration.animation,delete xt.animationstart.animation),"TransitionEvent"in window||delete xt.transitionend.transition);var At=Tt("animationend"),Lt=Tt("animationiteration"),Rt=Tt("animationstart"),Ot=Tt("transitionend"),Nt=new Map,Pt=new Map,It=["abort","abort",At,"animationEnd",Lt,"animationIteration",Rt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Ot,"transitionEnd","waiting","waiting"];function Dt(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];a="on"+(a[0].toUpperCase()+a.slice(1)),Pt.set(r,t),Nt.set(r,a),s(a,[r])}}(0,o.unstable_now)();var Mt=8;function Ft(e){if(0!=(1&e))return Mt=15,1;if(0!=(2&e))return Mt=14,2;if(0!=(4&e))return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):0!=(32&e)?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):0!=(256&e)?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):0!=(4096&e)?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):0!=(134217728&e)?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):0!=(1073741824&e)?(Mt=1,1073741824):(Mt=8,e)}function jt(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,a=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)r=o,a=Mt=15;else if(0!==(o=134217727&n)){var u=o&~i;0!==u?(r=Ft(u),a=Mt):0!==(l&=o)&&(r=Ft(l),a=Mt)}else 0!==(o=n&~i)?(r=Ft(o),a=Mt):0!==l&&(r=Ft(l),a=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Zt(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Ft(t),a<=Mt)return t;Mt=a}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-Zt(t)),r|=e[n],t&=~a;return r}function Bt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function zt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=Ut(24&~t))?zt(10,t):e;case 10:return 0===(e=Ut(192&~t))?zt(8,t):e;case 8:return 0===(e=Ut(3584&~t))&&(0===(e=Ut(4186112&~t))&&(e=512)),e;case 2:return 0===(t=Ut(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function Ut(e){return e&-e}function $t(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function qt(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Zt(t)]=n}var Zt=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ht(e)/Gt|0)|0},Ht=Math.log,Gt=Math.LN2;var Vt=o.unstable_UserBlockingPriority,Wt=o.unstable_runWithPriority,Yt=!0;function Kt(e,t,n,r){Fe||De();var a=Qt,o=Fe;Fe=!0;try{Ie(a,e,t,n,r)}finally{(Fe=o)||Be()}}function Xt(e,t,n,r){Wt(Vt,Qt.bind(null,e,t,n,r))}function Qt(e,t,n,r){var a;if(Yt)if((a=0==(4&t))&&0<it.length&&-1<pt.indexOf(e))e=mt(null,e,t,n,r),it.push(e);else{var o=Jt(e,t,n,r);if(null===o)a&&ht(e,r);else{if(a){if(-1<pt.indexOf(e))return e=mt(o,e,t,n,r),void it.push(e);if(function(e,t,n,r,a){switch(t){case"focusin":return lt=gt(lt,e,t,n,r,a),!0;case"dragenter":return ut=gt(ut,e,t,n,r,a),!0;case"mouseover":return st=gt(st,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return ct.set(o,gt(ct.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,dt.set(o,gt(dt.get(o)||null,e,t,n,r,a)),!0}return!1}(o,e,t,n,r))return;ht(e,r)}Dr(e,t,r,null,n)}}}function Jt(e,t,n,r){var a=_e(r);if(null!==(a=na(a))){var o=Ke(a);if(null===o)a=null;else{var i=o.tag;if(13===i){if(null!==(a=Xe(o)))return a;a=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return Dr(e,t,r,a,n),null}var en=null,tn=null,nn=null;function rn(){if(nn)return nn;var e,t,n=tn,r=n.length,a="value"in en?en.value:en.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return nn=a.slice(e,1<t?1-t:void 0)}function an(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function on(){return!0}function ln(){return!1}function un(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?on:ln,this.isPropagationStopped=ln,this}return a(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=on)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=on)},persist:function(){},isPersistent:on}),t}var sn,cn,dn,fn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},pn=un(fn),mn=a({},fn,{view:0,detail:0}),hn=un(mn),gn=a({},mn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:An,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==dn&&(dn&&"mousemove"===e.type?(sn=e.screenX-dn.screenX,cn=e.screenY-dn.screenY):cn=sn=0,dn=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:cn}}),vn=un(gn),bn=un(a({},gn,{dataTransfer:0})),yn=un(a({},mn,{relatedTarget:0})),wn=un(a({},fn,{animationName:0,elapsedTime:0,pseudoElement:0})),kn=a({},fn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),En=un(kn),Sn=un(a({},fn,{data:0})),xn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Cn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},_n={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Tn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=_n[e])&&!!t[e]}function An(){return Tn}var Ln=a({},mn,{key:function(e){if(e.key){var t=xn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=an(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Cn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:An,charCode:function(e){return"keypress"===e.type?an(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?an(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Rn=un(Ln),On=un(a({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Nn=un(a({},mn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:An})),Pn=un(a({},fn,{propertyName:0,elapsedTime:0,pseudoElement:0})),In=a({},gn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Dn=un(In),Mn=[9,13,27,32],Fn=d&&"CompositionEvent"in window,jn=null;d&&"documentMode"in document&&(jn=document.documentMode);var Bn=d&&"TextEvent"in window&&!jn,zn=d&&(!Fn||jn&&8<jn&&11>=jn),Un=String.fromCharCode(32),$n=!1;function qn(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Zn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Hn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function Wn(e,t,n,r){Oe(r),0<(t=Fr(t,"onChange")).length&&(n=new pn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Yn=null,Kn=null;function Xn(e){Lr(e,0)}function Qn(e){if(X(aa(e)))return e}function Jn(e,t){if("change"===e)return t}var er=!1;if(d){var tr;if(d){var nr="oninput"in document;if(!nr){var rr=document.createElement("div");rr.setAttribute("oninput","return;"),nr="function"==typeof rr.oninput}tr=nr}else tr=!1;er=tr&&(!document.documentMode||9<document.documentMode)}function ar(){Yn&&(Yn.detachEvent("onpropertychange",or),Kn=Yn=null)}function or(e){if("value"===e.propertyName&&Qn(Kn)){var t=[];if(Wn(t,Kn,e,_e(e)),e=Xn,Fe)e(t);else{Fe=!0;try{Pe(e,t)}finally{Fe=!1,Be()}}}}function ir(e,t,n){"focusin"===e?(ar(),Kn=n,(Yn=t).attachEvent("onpropertychange",or)):"focusout"===e&&ar()}function lr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Kn)}function ur(e,t){if("click"===e)return Qn(t)}function sr(e,t){if("input"===e||"change"===e)return Qn(t)}var cr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},dr=Object.prototype.hasOwnProperty;function fr(e,t){if(cr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!dr.call(t,n[r])||!cr(e[n[r]],t[n[r]]))return!1;return!0}function pr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function mr(e,t){var n,r=pr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=pr(r)}}function hr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?hr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function gr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function vr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=d&&"documentMode"in document&&11>=document.documentMode,yr=null,wr=null,kr=null,Er=!1;function Sr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;Er||null==yr||yr!==Q(r)||("selectionStart"in(r=yr)&&vr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},kr&&fr(kr,r)||(kr=r,0<(r=Fr(wr,"onSelect")).length&&(t=new pn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=yr)))}Dt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Dt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Dt(It,2);for(var xr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Cr=0;Cr<xr.length;Cr++)Pt.set(xr[Cr],0);c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var _r="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Tr=new Set("cancel close invalid load scroll toggle".split(" ").concat(_r));function Ar(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,o,l,u,s){if(Ye.apply(this,arguments),Ze){if(!Ze)throw Error(i(198));var c=He;Ze=!1,He=null,Ge||(Ge=!0,Ve=c)}}(r,t,void 0,e),e.currentTarget=null}function Lr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],u=l.instance,s=l.currentTarget;if(l=l.listener,u!==o&&a.isPropagationStopped())break e;Ar(a,l,s),o=u}else for(i=0;i<r.length;i++){if(u=(l=r[i]).instance,s=l.currentTarget,l=l.listener,u!==o&&a.isPropagationStopped())break e;Ar(a,l,s),o=u}}}if(Ge)throw e=Ve,Ge=!1,Ve=null,e}function Rr(e,t){var n=ia(t),r=e+"__bubble";n.has(r)||(Ir(t,e,2,!1),n.add(r))}var Or="_reactListening"+Math.random().toString(36).slice(2);function Nr(e){e[Or]||(e[Or]=!0,l.forEach((function(t){Tr.has(t)||Pr(t,!1,e,null),Pr(t,!0,e,null)})))}function Pr(e,t,n,r){var a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Tr.has(e)){if("scroll"!==e)return;a|=2,o=r}var i=ia(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(a|=4),Ir(o,e,a,t),i.add(l))}function Ir(e,t,n,r){var a=Pt.get(t);switch(void 0===a?2:a){case 0:a=Kt;break;case 1:a=Xt;break;default:a=Qt}n=a.bind(null,t,n,e),a=void 0,!Ue||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Dr(e,t,n,r,a){var o=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var u=i.tag;if((3===u||4===u)&&((u=i.stateNode.containerInfo)===a||8===u.nodeType&&u.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=na(l)))return;if(5===(u=i.tag)||6===u){r=o=i;continue e}l=l.parentNode}}r=r.return}!function(e,t,n){if(je)return e(t,n);je=!0;try{Me(e,t,n)}finally{je=!1,Be()}}((function(){var r=o,a=_e(n),i=[];e:{var l=Nt.get(e);if(void 0!==l){var u=pn,s=e;switch(e){case"keypress":if(0===an(n))break e;case"keydown":case"keyup":u=Rn;break;case"focusin":s="focus",u=yn;break;case"focusout":s="blur",u=yn;break;case"beforeblur":case"afterblur":u=yn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":u=vn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":u=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":u=Nn;break;case At:case Lt:case Rt:u=wn;break;case Ot:u=Pn;break;case"scroll":u=hn;break;case"wheel":u=Dn;break;case"copy":case"cut":case"paste":u=En;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":u=On}var c=0!=(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,m=r;null!==m;){var h=(p=m).stateNode;if(5===p.tag&&null!==h&&(p=h,null!==f&&(null!=(h=ze(m,f))&&c.push(Mr(m,h,p)))),d)break;m=m.return}0<c.length&&(l=new u(l,s,null,n,a),i.push({event:l,listeners:c}))}}if(0==(7&t)){if(u="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(s=n.relatedTarget||n.fromElement)||!na(s)&&!s[ea])&&(u||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,u?(u=r,null!==(s=(s=n.relatedTarget||n.toElement)?na(s):null)&&(s!==(d=Ke(s))||5!==s.tag&&6!==s.tag)&&(s=null)):(u=null,s=r),u!==s)){if(c=vn,h="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(c=On,h="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==u?l:aa(u),p=null==s?l:aa(s),(l=new c(h,m+"leave",u,n,a)).target=d,l.relatedTarget=p,h=null,na(a)===r&&((c=new c(f,m+"enter",s,n,a)).target=p,c.relatedTarget=d,h=c),d=h,u&&s)e:{for(f=s,m=0,p=c=u;p;p=jr(p))m++;for(p=0,h=f;h;h=jr(h))p++;for(;0<m-p;)c=jr(c),m--;for(;0<p-m;)f=jr(f),p--;for(;m--;){if(c===f||null!==f&&c===f.alternate)break e;c=jr(c),f=jr(f)}c=null}else c=null;null!==u&&Br(i,l,u,c,!1),null!==s&&null!==d&&Br(i,d,s,c,!0)}if("select"===(u=(l=r?aa(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===u&&"file"===l.type)var g=Jn;else if(Vn(l))if(er)g=sr;else{g=lr;var v=ir}else(u=l.nodeName)&&"input"===u.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=ur);switch(g&&(g=g(e,r))?Wn(i,g,n,a):(v&&v(e,l,r),"focusout"===e&&(v=l._wrapperState)&&v.controlled&&"number"===l.type&&ae(l,"number",l.value)),v=r?aa(r):window,e){case"focusin":(Vn(v)||"true"===v.contentEditable)&&(yr=v,wr=r,kr=null);break;case"focusout":kr=wr=yr=null;break;case"mousedown":Er=!0;break;case"contextmenu":case"mouseup":case"dragend":Er=!1,Sr(i,n,a);break;case"selectionchange":if(br)break;case"keydown":case"keyup":Sr(i,n,a)}var b;if(Fn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Hn?qn(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(zn&&"ko"!==n.locale&&(Hn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Hn&&(b=rn()):(tn="value"in(en=a)?en.value:en.textContent,Hn=!0)),0<(v=Fr(r,y)).length&&(y=new Sn(y,e,null,n,a),i.push({event:y,listeners:v}),b?y.data=b:null!==(b=Zn(n))&&(y.data=b))),(b=Bn?function(e,t){switch(e){case"compositionend":return Zn(t);case"keypress":return 32!==t.which?null:($n=!0,Un);case"textInput":return(e=t.data)===Un&&$n?null:e;default:return null}}(e,n):function(e,t){if(Hn)return"compositionend"===e||!Fn&&qn(e,t)?(e=rn(),nn=tn=en=null,Hn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return zn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Fr(r,"onBeforeInput")).length&&(a=new Sn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=b))}Lr(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Fr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=ze(e,n))&&r.unshift(Mr(e,o,a)),null!=(o=ze(e,t))&&r.push(Mr(e,o,a))),e=e.return}return r}function jr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Br(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,u=l.alternate,s=l.stateNode;if(null!==u&&u===r)break;5===l.tag&&null!==s&&(l=s,a?null!=(u=ze(n,o))&&i.unshift(Mr(n,u,l)):a||null!=(u=ze(n,o))&&i.push(Mr(n,u,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function zr(){}var Ur=null,$r=null;function qr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Zr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Hr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Wr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Yr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Kr=0;var Xr=Math.random().toString(36).slice(2),Qr="__reactFiber$"+Xr,Jr="__reactProps$"+Xr,ea="__reactContainer$"+Xr,ta="__reactEvents$"+Xr;function na(e){var t=e[Qr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ea]||n[Qr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Yr(e);null!==e;){if(n=e[Qr])return n;e=Yr(e)}return t}n=(e=n).parentNode}return null}function ra(e){return!(e=e[Qr]||e[ea])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function aa(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function oa(e){return e[Jr]||null}function ia(e){var t=e[ta];return void 0===t&&(t=e[ta]=new Set),t}var la=[],ua=-1;function sa(e){return{current:e}}function ca(e){0>ua||(e.current=la[ua],la[ua]=null,ua--)}function da(e,t){ua++,la[ua]=e.current,e.current=t}var fa={},pa=sa(fa),ma=sa(!1),ha=fa;function ga(e,t){var n=e.type.contextTypes;if(!n)return fa;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function va(e){return null!=(e=e.childContextTypes)}function ba(){ca(ma),ca(pa)}function ya(e,t,n){if(pa.current!==fa)throw Error(i(168));da(pa,t),da(ma,n)}function wa(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(i(108,V(t)||"Unknown",o));return a({},n,r)}function ka(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||fa,ha=pa.current,da(pa,e),da(ma,ma.current),!0}function Ea(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=wa(e,t,ha),r.__reactInternalMemoizedMergedChildContext=e,ca(ma),ca(pa),da(pa,e)):ca(ma),da(ma,n)}var Sa=null,xa=null,Ca=o.unstable_runWithPriority,_a=o.unstable_scheduleCallback,Ta=o.unstable_cancelCallback,Aa=o.unstable_shouldYield,La=o.unstable_requestPaint,Ra=o.unstable_now,Oa=o.unstable_getCurrentPriorityLevel,Na=o.unstable_ImmediatePriority,Pa=o.unstable_UserBlockingPriority,Ia=o.unstable_NormalPriority,Da=o.unstable_LowPriority,Ma=o.unstable_IdlePriority,Fa={},ja=void 0!==La?La:function(){},Ba=null,za=null,Ua=!1,$a=Ra(),qa=1e4>$a?Ra:function(){return Ra()-$a};function Za(){switch(Oa()){case Na:return 99;case Pa:return 98;case Ia:return 97;case Da:return 96;case Ma:return 95;default:throw Error(i(332))}}function Ha(e){switch(e){case 99:return Na;case 98:return Pa;case 97:return Ia;case 96:return Da;case 95:return Ma;default:throw Error(i(332))}}function Ga(e,t){return e=Ha(e),Ca(e,t)}function Va(e,t,n){return e=Ha(e),_a(e,t,n)}function Wa(){if(null!==za){var e=za;za=null,Ta(e)}Ya()}function Ya(){if(!Ua&&null!==Ba){Ua=!0;var e=0;try{var t=Ba;Ga(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Ba=null}catch(n){throw null!==Ba&&(Ba=Ba.slice(e+1)),_a(Na,Wa),n}finally{Ua=!1}}}var Ka=k.ReactCurrentBatchConfig;function Xa(e,t){if(e&&e.defaultProps){for(var n in t=a({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Qa=sa(null),Ja=null,eo=null,to=null;function no(){to=eo=Ja=null}function ro(e){var t=Qa.current;ca(Qa),e.type._context._currentValue=t}function ao(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function oo(e,t){Ja=e,to=eo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Fi=!0),e.firstContext=null)}function io(e,t){if(to!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(to=e,t=1073741823),t={context:e,observedBits:t,next:null},null===eo){if(null===Ja)throw Error(i(308));eo=t,Ja.dependencies={lanes:0,firstContext:t,responders:null}}else eo=eo.next=t;return e._currentValue}var lo=!1;function uo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function so(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function co(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function fo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function po(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function mo(e,t,n,r){var o=e.updateQueue;lo=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,u=o.shared.pending;if(null!==u){o.shared.pending=null;var s=u,c=s.next;s.next=null,null===l?i=c:l.next=c,l=s;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=c:f.next=c,d.lastBaseUpdate=s)}}if(null!==i){for(f=o.baseState,l=0,d=c=s=null;;){u=i.lane;var p=i.eventTime;if((r&u)===u){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var m=e,h=i;switch(u=t,p=n,h.tag){case 1:if("function"==typeof(m=h.payload)){f=m.call(p,f,u);break e}f=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(u="function"==typeof(m=h.payload)?m.call(p,f,u):m))break e;f=a({},f,u);break e;case 2:lo=!0}}null!==i.callback&&(e.flags|=32,null===(u=o.effects)?o.effects=[i]:u.push(i))}else p={eventTime:p,lane:u,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(c=d=p,s=f):d=d.next=p,l|=u;if(null===(i=i.next)){if(null===(u=o.shared.pending))break;i=u.next,u.next=null,o.lastBaseUpdate=u,o.shared.pending=null}}null===d&&(s=f),o.baseState=s,o.firstBaseUpdate=c,o.lastBaseUpdate=d,Ul|=l,e.lanes=l,e.memoizedState=f}}function ho(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(i(191,a));a.call(r)}}}var go=(new r.Component).refs;function vo(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:a({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&Ke(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=fu(),a=pu(e),o=co(r,a);o.payload=t,null!=n&&(o.callback=n),fo(e,o),mu(e,a,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=fu(),a=pu(e),o=co(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),fo(e,o),mu(e,a,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fu(),r=pu(e),a=co(n,r);a.tag=2,null!=t&&(a.callback=t),fo(e,a),mu(e,r,n)}};function yo(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!fr(n,r)||!fr(a,o))}function wo(e,t,n){var r=!1,a=fa,o=t.contextType;return"object"==typeof o&&null!==o?o=io(o):(a=va(t)?ha:pa.current,o=(r=null!=(r=t.contextTypes))?ga(e,a):fa),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function ko(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&bo.enqueueReplaceState(t,t.state,null)}function Eo(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs=go,uo(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=io(o):(o=va(t)?ha:pa.current,a.context=ga(e,o)),mo(e,n,a,r),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(vo(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&bo.enqueueReplaceState(a,a.state,null),mo(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4)}var So=Array.isArray;function xo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===go&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Co(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function _o(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(e,t){return(e=Gu(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function u(e,t,n,r){return null===t||6!==t.tag?((t=Ku(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function s(e,t,n,r){return null!==t&&t.elementType===n.type?((r=a(t,n.props)).ref=xo(e,t,n),r.return=e,r):((r=Vu(n.type,n.key,n.props,null,e.mode,r)).ref=xo(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Xu(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Wu(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ku(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case E:return(n=Vu(t.type,t.key,t.props,null,e.mode,n)).ref=xo(e,null,t),n.return=e,n;case S:return(t=Xu(t,e.mode,n)).return=e,t}if(So(t)||$(t))return(t=Wu(t,e.mode,n,null)).return=e,t;Co(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==a?null:u(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case E:return n.key===a?n.type===x?d(e,t,n.props.children,r,a):s(e,t,n,r):null;case S:return n.key===a?c(e,t,n,r):null}if(So(n)||$(n))return null!==a?null:d(e,t,n,r,null);Co(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r||"number"==typeof r)return u(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case E:return e=e.get(null===r.key?n:r.key)||null,r.type===x?d(t,e,r.props.children,a,r.key):s(t,e,r,a);case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a)}if(So(r)||$(r))return d(t,e=e.get(n)||null,r,a,null);Co(t,r)}return null}function h(a,i,l,u){for(var s=null,c=null,d=i,h=i=0,g=null;null!==d&&h<l.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var v=p(a,d,l[h],u);if(null===v){null===d&&(d=g);break}e&&d&&null===v.alternate&&t(a,d),i=o(v,i,h),null===c?s=v:c.sibling=v,c=v,d=g}if(h===l.length)return n(a,d),s;if(null===d){for(;h<l.length;h++)null!==(d=f(a,l[h],u))&&(i=o(d,i,h),null===c?s=d:c.sibling=d,c=d);return s}for(d=r(a,d);h<l.length;h++)null!==(g=m(d,a,h,l[h],u))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),i=o(g,i,h),null===c?s=g:c.sibling=g,c=g);return e&&d.forEach((function(e){return t(a,e)})),s}function g(a,l,u,s){var c=$(u);if("function"!=typeof c)throw Error(i(150));if(null==(u=c.call(u)))throw Error(i(151));for(var d=c=null,h=l,g=l=0,v=null,b=u.next();null!==h&&!b.done;g++,b=u.next()){h.index>g?(v=h,h=null):v=h.sibling;var y=p(a,h,b.value,s);if(null===y){null===h&&(h=v);break}e&&h&&null===y.alternate&&t(a,h),l=o(y,l,g),null===d?c=y:d.sibling=y,d=y,h=v}if(b.done)return n(a,h),c;if(null===h){for(;!b.done;g++,b=u.next())null!==(b=f(a,b.value,s))&&(l=o(b,l,g),null===d?c=b:d.sibling=b,d=b);return c}for(h=r(a,h);!b.done;g++,b=u.next())null!==(b=m(h,a,g,b.value,s))&&(e&&null!==b.alternate&&h.delete(null===b.key?g:b.key),l=o(b,l,g),null===d?c=b:d.sibling=b,d=b);return e&&h.forEach((function(e){return t(a,e)})),c}return function(e,r,o,u){var s="object"==typeof o&&null!==o&&o.type===x&&null===o.key;s&&(o=o.props.children);var c="object"==typeof o&&null!==o;if(c)switch(o.$$typeof){case E:e:{for(c=o.key,s=r;null!==s;){if(s.key===c){if(7===s.tag){if(o.type===x){n(e,s.sibling),(r=a(s,o.props.children)).return=e,e=r;break e}}else if(s.elementType===o.type){n(e,s.sibling),(r=a(s,o.props)).ref=xo(e,s,o),r.return=e,e=r;break e}n(e,s);break}t(e,s),s=s.sibling}o.type===x?((r=Wu(o.props.children,e.mode,u,o.key)).return=e,e=r):((u=Vu(o.type,o.key,o.props,null,e.mode,u)).ref=xo(e,r,o),u.return=e,e=u)}return l(e);case S:e:{for(s=o.key;null!==r;){if(r.key===s){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=a(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Xu(o,e.mode,u)).return=e,e=r}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=a(r,o)).return=e,e=r):(n(e,r),(r=Ku(o,e.mode,u)).return=e,e=r),l(e);if(So(o))return h(e,r,o,u);if($(o))return g(e,r,o,u);if(c&&Co(e,o),void 0===o&&!s)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,V(e.type)||"Component"))}return n(e,r)}}var To=_o(!0),Ao=_o(!1),Lo={},Ro=sa(Lo),Oo=sa(Lo),No=sa(Lo);function Po(e){if(e===Lo)throw Error(i(174));return e}function Io(e,t){switch(da(No,t),da(Oo,e),da(Ro,Lo),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:me(null,"");break;default:t=me(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ca(Ro),da(Ro,t)}function Do(){ca(Ro),ca(Oo),ca(No)}function Mo(e){Po(No.current);var t=Po(Ro.current),n=me(t,e.type);t!==n&&(da(Oo,e),da(Ro,n))}function Fo(e){Oo.current===e&&(ca(Ro),ca(Oo))}var jo=sa(0);function Bo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var zo=null,Uo=null,$o=!1;function qo(e,t){var n=Zu(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Zo(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Ho(e){if($o){var t=Uo;if(t){var n=t;if(!Zo(e,t)){if(!(t=Wr(n.nextSibling))||!Zo(e,t))return e.flags=-1025&e.flags|2,$o=!1,void(zo=e);qo(zo,n)}zo=e,Uo=Wr(t.firstChild)}else e.flags=-1025&e.flags|2,$o=!1,zo=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;zo=e}function Vo(e){if(e!==zo)return!1;if(!$o)return Go(e),$o=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Zr(t,e.memoizedProps))for(t=Uo;t;)qo(e,t),t=Wr(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){Uo=Wr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}Uo=null}}else Uo=zo?Wr(e.stateNode.nextSibling):null;return!0}function Wo(){Uo=zo=null,$o=!1}var Yo=[];function Ko(){for(var e=0;e<Yo.length;e++)Yo[e]._workInProgressVersionPrimary=null;Yo.length=0}var Xo=k.ReactCurrentDispatcher,Qo=k.ReactCurrentBatchConfig,Jo=0,ei=null,ti=null,ni=null,ri=!1,ai=!1;function oi(){throw Error(i(321))}function ii(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!cr(e[n],t[n]))return!1;return!0}function li(e,t,n,r,a,o){if(Jo=o,ei=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Xo.current=null===e||null===e.memoizedState?Pi:Ii,e=n(r,a),ai){o=0;do{if(ai=!1,!(25>o))throw Error(i(301));o+=1,ni=ti=null,t.updateQueue=null,Xo.current=Di,e=n(r,a)}while(ai)}if(Xo.current=Ni,t=null!==ti&&null!==ti.next,Jo=0,ni=ti=ei=null,ri=!1,t)throw Error(i(300));return e}function ui(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ni?ei.memoizedState=ni=e:ni=ni.next=e,ni}function si(){if(null===ti){var e=ei.alternate;e=null!==e?e.memoizedState:null}else e=ti.next;var t=null===ni?ei.memoizedState:ni.next;if(null!==t)ni=t,ti=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ti=e).memoizedState,baseState:ti.baseState,baseQueue:ti.baseQueue,queue:ti.queue,next:null},null===ni?ei.memoizedState=ni=e:ni=ni.next=e}return ni}function ci(e,t){return"function"==typeof t?t(e):t}function di(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ti,a=r.baseQueue,o=n.pending;if(null!==o){if(null!==a){var l=a.next;a.next=o.next,o.next=l}r.baseQueue=a=o,n.pending=null}if(null!==a){a=a.next,r=r.baseState;var u=l=o=null,s=a;do{var c=s.lane;if((Jo&c)===c)null!==u&&(u=u.next={lane:0,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null}),r=s.eagerReducer===e?s.eagerState:e(r,s.action);else{var d={lane:c,action:s.action,eagerReducer:s.eagerReducer,eagerState:s.eagerState,next:null};null===u?(l=u=d,o=r):u=u.next=d,ei.lanes|=c,Ul|=c}s=s.next}while(null!==s&&s!==a);null===u?o=r:u.next=l,cr(r,t.memoizedState)||(Fi=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=u,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function fi(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{o=e(o,l.action),l=l.next}while(l!==a);cr(o,t.memoizedState)||(Fi=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function pi(e,t,n){var r=t._getVersion;r=r(t._source);var a=t._workInProgressVersionPrimary;if(null!==a?e=a===r:(e=e.mutableReadLanes,(e=(Jo&e)===e)&&(t._workInProgressVersionPrimary=r,Yo.push(t))),e)return n(t._source);throw Yo.push(t),Error(i(350))}function mi(e,t,n,r){var a=Pl;if(null===a)throw Error(i(349));var o=t._getVersion,l=o(t._source),u=Xo.current,s=u.useState((function(){return pi(a,t,n)})),c=s[1],d=s[0];s=ni;var f=e.memoizedState,p=f.refs,m=p.getSnapshot,h=f.source;f=f.subscribe;var g=ei;return e.memoizedState={refs:p,source:t,subscribe:r},u.useEffect((function(){p.getSnapshot=n,p.setSnapshot=c;var e=o(t._source);if(!cr(l,e)){e=n(t._source),cr(d,e)||(c(e),e=pu(g),a.mutableReadLanes|=e&a.pendingLanes),e=a.mutableReadLanes,a.entangledLanes|=e;for(var r=a.entanglements,i=e;0<i;){var u=31-Zt(i),s=1<<u;r[u]|=e,i&=~s}}}),[n,t,r]),u.useEffect((function(){return r(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var r=pu(g);a.mutableReadLanes|=r&a.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),cr(m,n)&&cr(h,t)&&cr(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:d}).dispatch=c=Oi.bind(null,ei,e),s.queue=e,s.baseQueue=null,d=pi(a,t,n),s.memoizedState=s.baseState=d),d}function hi(e,t,n){return mi(si(),e,t,n)}function gi(e){var t=ui();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:e}).dispatch=Oi.bind(null,ei,e),[t.memoizedState,e]}function vi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=ei.updateQueue)?(t={lastEffect:null},ei.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function bi(e){return e={current:e},ui().memoizedState=e}function yi(){return si().memoizedState}function wi(e,t,n,r){var a=ui();ei.flags|=e,a.memoizedState=vi(1|t,n,void 0,void 0===r?null:r)}function ki(e,t,n,r){var a=si();r=void 0===r?null:r;var o=void 0;if(null!==ti){var i=ti.memoizedState;if(o=i.destroy,null!==r&&ii(r,i.deps))return void vi(t,n,o,r)}ei.flags|=e,a.memoizedState=vi(1|t,n,o,r)}function Ei(e,t){return wi(516,4,e,t)}function Si(e,t){return ki(516,4,e,t)}function xi(e,t){return ki(4,2,e,t)}function Ci(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function _i(e,t,n){return n=null!=n?n.concat([e]):null,ki(4,2,Ci.bind(null,t,e),n)}function Ti(){}function Ai(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ii(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Li(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ii(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ri(e,t){var n=Za();Ga(98>n?98:n,(function(){e(!0)})),Ga(97<n?97:n,(function(){var n=Qo.transition;Qo.transition=1;try{e(!1),t()}finally{Qo.transition=n}}))}function Oi(e,t,n){var r=fu(),a=pu(e),o={lane:a,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===ei||null!==i&&i===ei)ai=ri=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,u=i(l,n);if(o.eagerReducer=i,o.eagerState=u,cr(u,l))return}catch(s){}mu(e,a,r)}}var Ni={readContext:io,useCallback:oi,useContext:oi,useEffect:oi,useImperativeHandle:oi,useLayoutEffect:oi,useMemo:oi,useReducer:oi,useRef:oi,useState:oi,useDebugValue:oi,useDeferredValue:oi,useTransition:oi,useMutableSource:oi,useOpaqueIdentifier:oi,unstable_isNewReconciler:!1},Pi={readContext:io,useCallback:function(e,t){return ui().memoizedState=[e,void 0===t?null:t],e},useContext:io,useEffect:Ei,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,Ci.bind(null,t,e),n)},useLayoutEffect:function(e,t){return wi(4,2,e,t)},useMemo:function(e,t){var n=ui();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=ui();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Oi.bind(null,ei,e),[r.memoizedState,e]},useRef:bi,useState:gi,useDebugValue:Ti,useDeferredValue:function(e){var t=gi(e),n=t[0],r=t[1];return Ei((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=gi(!1),t=e[0];return bi(e=Ri.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=ui();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},mi(r,e,t,n)},useOpaqueIdentifier:function(){if($o){var e=!1,t=function(e){return{$$typeof:D,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Kr++).toString(36))),Error(i(355))})),n=gi(t)[1];return 0==(2&ei.mode)&&(ei.flags|=516,vi(5,(function(){n("r:"+(Kr++).toString(36))}),void 0,null)),t}return gi(t="r:"+(Kr++).toString(36)),t},unstable_isNewReconciler:!1},Ii={readContext:io,useCallback:Ai,useContext:io,useEffect:Si,useImperativeHandle:_i,useLayoutEffect:xi,useMemo:Li,useReducer:di,useRef:yi,useState:function(){return di(ci)},useDebugValue:Ti,useDeferredValue:function(e){var t=di(ci),n=t[0],r=t[1];return Si((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=di(ci)[0];return[yi().current,e]},useMutableSource:hi,useOpaqueIdentifier:function(){return di(ci)[0]},unstable_isNewReconciler:!1},Di={readContext:io,useCallback:Ai,useContext:io,useEffect:Si,useImperativeHandle:_i,useLayoutEffect:xi,useMemo:Li,useReducer:fi,useRef:yi,useState:function(){return fi(ci)},useDebugValue:Ti,useDeferredValue:function(e){var t=fi(ci),n=t[0],r=t[1];return Si((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=fi(ci)[0];return[yi().current,e]},useMutableSource:hi,useOpaqueIdentifier:function(){return fi(ci)[0]},unstable_isNewReconciler:!1},Mi=k.ReactCurrentOwner,Fi=!1;function ji(e,t,n,r){t.child=null===e?Ao(t,null,n,r):To(t,e.child,n,r)}function Bi(e,t,n,r,a){n=n.render;var o=t.ref;return oo(t,a),r=li(e,t,n,r,o,a),null===e||Fi?(t.flags|=1,ji(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function zi(e,t,n,r,a,o){if(null===e){var i=n.type;return"function"!=typeof i||Hu(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Vu(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,Ui(e,t,i,r,a,o))}return i=e.child,0==(a&o)&&(a=i.memoizedProps,(n=null!==(n=n.compare)?n:fr)(a,r)&&e.ref===t.ref)?ol(e,t,o):(t.flags|=1,(e=Gu(i,r)).ref=t.ref,e.return=t,t.child=e)}function Ui(e,t,n,r,a,o){if(null!==e&&fr(e.memoizedProps,r)&&e.ref===t.ref){if(Fi=!1,0==(o&a))return t.lanes=e.lanes,ol(e,t,o);0!=(16384&e.flags)&&(Fi=!0)}return Zi(e,t,n,r,o)}function $i(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},Eu(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},Eu(t,e),null;t.memoizedState={baseLanes:0},Eu(t,null!==o?o.baseLanes:n)}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,Eu(t,r);return ji(e,t,a,n),t.child}function qi(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Zi(e,t,n,r,a){var o=va(n)?ha:pa.current;return o=ga(t,o),oo(t,a),n=li(e,t,n,r,o,a),null===e||Fi?(t.flags|=1,ji(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function Hi(e,t,n,r,a){if(va(n)){var o=!0;ka(t)}else o=!1;if(oo(t,a),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),wo(t,n,r),Eo(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var u=i.context,s=n.contextType;"object"==typeof s&&null!==s?s=io(s):s=ga(t,s=va(n)?ha:pa.current);var c=n.getDerivedStateFromProps,d="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||u!==s)&&ko(t,i,r,s),lo=!1;var f=t.memoizedState;i.state=f,mo(t,r,i,a),u=t.memoizedState,l!==r||f!==u||ma.current||lo?("function"==typeof c&&(vo(t,n,c,r),u=t.memoizedState),(l=lo||yo(t,n,l,r,f,u,s))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=u),i.props=r,i.state=u,i.context=s,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,so(e,t),l=t.memoizedProps,s=t.type===t.elementType?l:Xa(t.type,l),i.props=s,d=t.pendingProps,f=i.context,"object"==typeof(u=n.contextType)&&null!==u?u=io(u):u=ga(t,u=va(n)?ha:pa.current);var p=n.getDerivedStateFromProps;(c="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==u)&&ko(t,i,r,u),lo=!1,f=t.memoizedState,i.state=f,mo(t,r,i,a);var m=t.memoizedState;l!==d||f!==m||ma.current||lo?("function"==typeof p&&(vo(t,n,p,r),m=t.memoizedState),(s=lo||yo(t,n,s,r,f,m,u))?(c||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,u),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,u)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=u,r=s):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Gi(e,t,n,r,o,a)}function Gi(e,t,n,r,a,o){qi(e,t);var i=0!=(64&t.flags);if(!r&&!i)return a&&Ea(t,n,!1),ol(e,t,o);r=t.stateNode,Mi.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=To(t,e.child,null,o),t.child=To(t,null,l,o)):ji(e,t,l,o),t.memoizedState=r.state,a&&Ea(t,n,!0),t.child}function Vi(e){var t=e.stateNode;t.pendingContext?ya(0,t.pendingContext,t.pendingContext!==t.context):t.context&&ya(0,t.context,!1),Io(e,t.containerInfo)}var Wi,Yi,Ki,Xi={dehydrated:null,retryLane:0};function Qi(e,t,n){var r,a=t.pendingProps,o=jo.current,i=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&o)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===a.fallback||!0===a.unstable_avoidThisFallback||(o|=1),da(jo,1&o),null===e?(void 0!==a.fallback&&Ho(t),e=a.children,o=a.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof a.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Yu({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(a=tl(e,t,a.children,a.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Xi,a):(n=el(e,t,a.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var a=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&a)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Yu(t,a,0,null),n=Wu(n,a,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,r){var a=e.child;return e=a.sibling,n=Gu(a,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,r,a){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 0==(2&o)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Gu(i,l),null!==e?r=Gu(e,r):(r=Wu(r,o,a,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ao(e.return,t)}function rl(e,t,n,r,a,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a,i.lastEffect=o)}function al(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(ji(e,t,r.children,n),0!=(2&(r=jo.current)))r=1&r|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(da(jo,r),0==(2&t.mode))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===Bo(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),rl(t,!1,a,n,o,t.lastEffect);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===Bo(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}rl(t,!0,n,null,o,t.lastEffect);break;case"together":rl(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ul|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Gu(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Gu(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!$o)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ll(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return va(t.type)&&ba(),null;case 3:return Do(),ca(ma),ca(pa),Ko(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Vo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),null;case 5:Fo(t);var o=Po(No.current);if(n=t.type,null!==e&&null!=t.stateNode)Yi(e,t,n,r),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Po(Ro.current),Vo(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[Qr]=t,r[Jr]=l,n){case"dialog":Rr("cancel",r),Rr("close",r);break;case"iframe":case"object":case"embed":Rr("load",r);break;case"video":case"audio":for(e=0;e<_r.length;e++)Rr(_r[e],r);break;case"source":Rr("error",r);break;case"img":case"image":case"link":Rr("error",r),Rr("load",r);break;case"details":Rr("toggle",r);break;case"input":ee(r,l),Rr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!l.multiple},Rr("invalid",r);break;case"textarea":ue(r,l),Rr("invalid",r)}for(var s in xe(n,l),e=null,l)l.hasOwnProperty(s)&&(o=l[s],"children"===s?"string"==typeof o?r.textContent!==o&&(e=["children",o]):"number"==typeof o&&r.textContent!==""+o&&(e=["children",""+o]):u.hasOwnProperty(s)&&null!=o&&"onScroll"===s&&Rr("scroll",r));switch(n){case"input":K(r),re(r,l,!0);break;case"textarea":K(r),ce(r);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(r.onclick=zr)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(s=9===o.nodeType?o:o.ownerDocument,e===de&&(e=pe(n)),e===de?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),"select"===n&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[Qr]=t,e[Jr]=r,Wi(e,t),t.stateNode=e,s=Ce(n,r),n){case"dialog":Rr("cancel",e),Rr("close",e),o=r;break;case"iframe":case"object":case"embed":Rr("load",e),o=r;break;case"video":case"audio":for(o=0;o<_r.length;o++)Rr(_r[o],e);o=r;break;case"source":Rr("error",e),o=r;break;case"img":case"image":case"link":Rr("error",e),Rr("load",e),o=r;break;case"details":Rr("toggle",e),o=r;break;case"input":ee(e,r),o=J(e,r),Rr("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=a({},r,{value:void 0}),Rr("invalid",e);break;case"textarea":ue(e,r),o=le(e,r),Rr("invalid",e);break;default:o=r}xe(n,o);var c=o;for(l in c)if(c.hasOwnProperty(l)){var d=c[l];"style"===l?Ee(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&ve(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(u.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Rr("scroll",e):null!=d&&w(e,l,d,s))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ce(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(l=r.value)?ie(e,!!r.multiple,l,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=zr)}qr(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ki(0,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Po(No.current),Po(Ro.current),Vo(t)?(r=t.stateNode,n=t.memoizedProps,r[Qr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Qr]=t,t.stateNode=r)}return null;case 13:return ca(jo),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Vo(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&jo.current)?0===jl&&(jl=3):(0!==jl&&3!==jl||(jl=4),null===Pl||0==(134217727&Ul)&&0==(134217727&$l)||bu(Pl,Dl))),(r||n)&&(t.flags|=4),null);case 4:return Do(),null===e&&Nr(t.stateNode.containerInfo),null;case 10:return ro(t),null;case 19:if(ca(jo),null===(r=t.memoizedState))return null;if(l=0!=(64&t.flags),null===(s=r.rendering))if(l)il(r,!1);else{if(0!==jl||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(s=Bo(e))){for(t.flags|=64,il(r,!1),null!==(l=s.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(s=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=s.childLanes,l.lanes=s.lanes,l.child=s.child,l.memoizedProps=s.memoizedProps,l.memoizedState=s.memoizedState,l.updateQueue=s.updateQueue,l.type=s.type,e=s.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return da(jo,1&jo.current|2),t.child}e=e.sibling}null!==r.tail&&qa()>Gl&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Bo(s))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(r,!0),null===r.tail&&"hidden"===r.tailMode&&!s.alternate&&!$o)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*qa()-r.renderingStartTime>Gl&&1073741824!==n&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432);r.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=r.last)?n.sibling=s:t.child=s,r.last=s)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=qa(),n.sibling=null,t=jo.current,da(jo,l?1&t|2:1&t),n):null;case 23:case 24:return Su(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function ul(e){switch(e.tag){case 1:va(e.type)&&ba();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Do(),ca(ma),ca(pa),Ko(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Fo(e),null;case 13:return ca(jo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ca(jo),null;case 4:return Do(),null;case 10:return ro(e),null;case 23:case 24:return Su(),null;default:return null}}function sl(e,t){try{var n="",r=t;do{n+=G(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a}}function cl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Wi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Yi=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Po(Ro.current);var i,l=null;switch(n){case"input":o=J(e,o),r=J(e,r),l=[];break;case"option":o=oe(e,o),r=oe(e,r),l=[];break;case"select":o=a({},o,{value:void 0}),r=a({},r,{value:void 0}),l=[];break;case"textarea":o=le(e,o),r=le(e,r),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=zr)}for(d in xe(n,r),n=null,o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var s=o[d];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(u.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in r){var c=r[d];if(s=null!=o?o[d]:void 0,r.hasOwnProperty(d)&&c!==s&&(null!=c||null!=s))if("style"===d)if(s){for(i in s)!s.hasOwnProperty(i)||c&&c.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in c)c.hasOwnProperty(i)&&s[i]!==c[i]&&(n||(n={}),n[i]=c[i])}else n||(l||(l=[]),l.push(d,n)),n=c;else"dangerouslySetInnerHTML"===d?(c=c?c.__html:void 0,s=s?s.__html:void 0,null!=c&&s!==c&&(l=l||[]).push(d,c)):"children"===d?"string"!=typeof c&&"number"!=typeof c||(l=l||[]).push(d,""+c):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(u.hasOwnProperty(d)?(null!=c&&"onScroll"===d&&Rr("scroll",e),l||s===c||(l=[])):"object"==typeof c&&null!==c&&c.$$typeof===D?c.toString():(l=l||[]).push(d,c))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Ki=function(e,t,n,r){n!==r&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=co(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Kl||(Kl=!0,Xl=r),cl(0,t)},n}function pl(e,t,n){(n=co(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return cl(0,t),r(a)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Ql?Ql=new Set([this]):Ql.add(this),cl(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ml="function"==typeof WeakSet?WeakSet:Set;function hl(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){zu(e,n)}else t.current=null}function gl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Xa(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(i(163))}function vl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var a=e;r=a.next,0!=(4&(a=a.tag))&&0!=(1&a)&&(Fu(n,e),Mu(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Xa(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&ho(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}ho(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&qr(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&Et(n)))))}throw Error(i(163))}function bl(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var a=n.memoizedProps.style;a=null!=a&&a.hasOwnProperty("display")?a.display:null,r.style.display=ke("display",a)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(xa&&"function"==typeof xa.onCommitFiberUnmount)try{xa.onCommitFiberUnmount(Sa,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,a=r.destroy;if(r=r.tag,void 0!==a)if(0!=(4&r))Fu(t,n);else{r=t;try{a()}catch(o){zu(r,o)}}n=n.next}while(n!==e)}break;case 1:if(hl(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){zu(t,o)}break;case 5:hl(t);break;case 4:Cl(e,t)}}function wl(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function kl(e){return 5===e.tag||3===e.tag||4===e.tag}function El(e){e:{for(var t=e.return;null!==t;){if(kl(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||kl(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Sl(e,n,t):xl(e,n,t)}function Sl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=zr));else if(4!==r&&null!==(e=e.child))for(Sl(e,t,n),e=e.sibling;null!==e;)Sl(e,t,n),e=e.sibling}function xl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(xl(e,t,n),e=e.sibling;null!==e;)xl(e,t,n),e=e.sibling}function Cl(e,t){for(var n,r,a=t,o=!1;;){if(!o){o=a.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===a.tag||6===a.tag){e:for(var l=e,u=a,s=u;;)if(yl(l,s),null!==s.child&&4!==s.tag)s.child.return=s,s=s.child;else{if(s===u)break e;for(;null===s.sibling;){if(null===s.return||s.return===u)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}r?(l=n,u=a.stateNode,8===l.nodeType?l.parentNode.removeChild(u):l.removeChild(u)):n.removeChild(a.stateNode)}else if(4===a.tag){if(null!==a.child){n=a.stateNode.containerInfo,r=!0,a.child.return=a,a=a.child;continue}}else if(yl(e,a),null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)return;4===(a=a.return).tag&&(o=!1)}a.sibling.return=a.return,a=a.sibling}}function _l(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3==(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var a=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Jr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),Ce(e,a),t=Ce(e,r),a=0;a<o.length;a+=2){var l=o[a],u=o[a+1];"style"===l?Ee(n,u):"dangerouslySetInnerHTML"===l?ve(n,u):"children"===l?be(n,u):w(n,l,u,t)}switch(e){case"input":ne(n,r);break;case"textarea":se(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ie(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,Et(n.containerInfo)));case 13:return null!==t.memoizedState&&(Hl=qa(),bl(t.child,!0)),void Tl(t);case 19:return void Tl(t);case 23:case 24:return void bl(t,null!==t.memoizedState)}throw Error(i(163))}function Tl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ml),t.forEach((function(t){var r=$u.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Al(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ll=Math.ceil,Rl=k.ReactCurrentDispatcher,Ol=k.ReactCurrentOwner,Nl=0,Pl=null,Il=null,Dl=0,Ml=0,Fl=sa(0),jl=0,Bl=null,zl=0,Ul=0,$l=0,ql=0,Zl=null,Hl=0,Gl=1/0;function Vl(){Gl=qa()+500}var Wl,Yl=null,Kl=!1,Xl=null,Ql=null,Jl=!1,eu=null,tu=90,nu=[],ru=[],au=null,ou=0,iu=null,lu=-1,uu=0,su=0,cu=null,du=!1;function fu(){return 0!=(48&Nl)?qa():-1!==lu?lu:lu=qa()}function pu(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Za()?1:2;if(0===uu&&(uu=zl),0!==Ka.transition){0!==su&&(su=null!==Zl?Zl.pendingLanes:0),e=uu;var t=4186112&~su;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Za(),0!=(4&Nl)&&98===e?e=zt(12,uu):e=zt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),uu),e}function mu(e,t,n){if(50<ou)throw ou=0,iu=null,Error(i(185));if(null===(e=hu(e,t)))return null;qt(e,t,n),e===Pl&&($l|=t,4===jl&&bu(e,Dl));var r=Za();1===t?0!=(8&Nl)&&0==(48&Nl)?yu(e):(gu(e,n),0===Nl&&(Vl(),Wa())):(0==(4&Nl)||98!==r&&99!==r||(null===au?au=new Set([e]):au.add(e)),gu(e,n)),Zl=e}function hu(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function gu(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,a=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var u=31-Zt(l),s=1<<u,c=o[u];if(-1===c){if(0==(s&r)||0!=(s&a)){c=t,Ft(s);var d=Mt;o[u]=10<=d?c+250:6<=d?c+5e3:-1}}else c<=t&&(e.expiredLanes|=s);l&=~s}if(r=jt(e,e===Pl?Dl:0),t=Mt,0===r)null!==n&&(n!==Fa&&Ta(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Fa&&Ta(n)}15===t?(n=yu.bind(null,e),null===Ba?(Ba=[n],za=_a(Na,Ya)):Ba.push(n),n=Fa):14===t?n=Va(99,yu.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Va(n,vu.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function vu(e){if(lu=-1,su=uu=0,0!=(48&Nl))throw Error(i(327));var t=e.callbackNode;if(Du()&&e.callbackNode!==t)return null;var n=jt(e,e===Pl?Dl:0);if(0===n)return null;var r=n,a=Nl;Nl|=16;var o=_u();for(Pl===e&&Dl===r||(Vl(),xu(e,r));;)try{Lu();break}catch(u){Cu(e,u)}if(no(),Rl.current=o,Nl=a,null!==Il?r=0:(Pl=null,Dl=0,r=jl),0!=(zl&$l))xu(e,0);else if(0!==r){if(2===r&&(Nl|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=Bt(e))&&(r=Tu(e,n))),1===r)throw t=Bl,xu(e,0),bu(e,n),gu(e,qa()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Nu(e);break;case 3:if(bu(e,n),(62914560&n)===n&&10<(r=Hl+500-qa())){if(0!==jt(e,0))break;if(((a=e.suspendedLanes)&n)!==n){fu(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=Hr(Nu.bind(null,e),r);break}Nu(e);break;case 4:if(bu(e,n),(4186112&n)===n)break;for(r=e.eventTimes,a=-1;0<n;){var l=31-Zt(n);o=1<<l,(l=r[l])>a&&(a=l),n&=~o}if(n=a,10<(n=(120>(n=qa()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ll(n/1960))-n)){e.timeoutHandle=Hr(Nu.bind(null,e),n);break}Nu(e);break;default:throw Error(i(329))}}return gu(e,qa()),e.callbackNode===t?vu.bind(null,e):null}function bu(e,t){for(t&=~ql,t&=~$l,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Zt(t),r=1<<n;e[n]=-1,t&=~r}}function yu(e){if(0!=(48&Nl))throw Error(i(327));if(Du(),e===Pl&&0!=(e.expiredLanes&Dl)){var t=Dl,n=Tu(e,t);0!=(zl&$l)&&(n=Tu(e,t=jt(e,t)))}else n=Tu(e,t=jt(e,0));if(0!==e.tag&&2===n&&(Nl|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=Bt(e))&&(n=Tu(e,t))),1===n)throw n=Bl,xu(e,0),bu(e,t),gu(e,qa()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Nu(e),gu(e,qa()),null}function wu(e,t){var n=Nl;Nl|=1;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wa())}}function ku(e,t){var n=Nl;Nl&=-2,Nl|=8;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wa())}}function Eu(e,t){da(Fl,Ml),Ml|=t,zl|=t}function Su(){Ml=Fl.current,ca(Fl)}function xu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Il)for(n=Il.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&ba();break;case 3:Do(),ca(ma),ca(pa),Ko();break;case 5:Fo(r);break;case 4:Do();break;case 13:case 19:ca(jo);break;case 10:ro(r);break;case 23:case 24:Su()}n=n.return}Pl=e,Il=Gu(e.current,null),Dl=Ml=zl=t,jl=0,Bl=null,ql=$l=Ul=0}function Cu(e,t){for(;;){var n=Il;try{if(no(),Xo.current=Ni,ri){for(var r=ei.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ri=!1}if(Jo=0,ni=ti=ei=null,ai=!1,Ol.current=null,null===n||null===n.return){jl=1,Bl=t,Il=null;break}e:{var o=e,i=n.return,l=n,u=t;if(t=Dl,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==u&&"object"==typeof u&&"function"==typeof u.then){var s=u;if(0==(2&l.mode)){var c=l.alternate;c?(l.updateQueue=c.updateQueue,l.memoizedState=c.memoizedState,l.lanes=c.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=0!=(1&jo.current),f=i;do{var p;if(p=13===f.tag){var m=f.memoizedState;if(null!==m)p=null!==m.dehydrated;else{var h=f.memoizedProps;p=void 0!==h.fallback&&(!0!==h.unstable_avoidThisFallback||!d)}}if(p){var g=f.updateQueue;if(null===g){var v=new Set;v.add(s),f.updateQueue=v}else g.add(s);if(0==(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var b=co(-1,1);b.tag=2,fo(l,b)}l.lanes|=1;break e}u=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,u=new Set,y.set(s,u)):void 0===(u=y.get(s))&&(u=new Set,y.set(s,u)),!u.has(l)){u.add(l);var w=Uu.bind(null,o,s,l);s.then(w,w)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);u=Error((V(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==jl&&(jl=2),u=sl(u,l),f=i;do{switch(f.tag){case 3:o=u,f.flags|=4096,t&=-t,f.lanes|=t,po(f,fl(0,o,t));break e;case 1:o=u;var k=f.type,E=f.stateNode;if(0==(64&f.flags)&&("function"==typeof k.getDerivedStateFromError||null!==E&&"function"==typeof E.componentDidCatch&&(null===Ql||!Ql.has(E)))){f.flags|=4096,t&=-t,f.lanes|=t,po(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ou(n)}catch(S){t=S,Il===n&&null!==n&&(Il=n=n.return);continue}break}}function _u(){var e=Rl.current;return Rl.current=Ni,null===e?Ni:e}function Tu(e,t){var n=Nl;Nl|=16;var r=_u();for(Pl===e&&Dl===t||xu(e,t);;)try{Au();break}catch(a){Cu(e,a)}if(no(),Nl=n,Rl.current=r,null!==Il)throw Error(i(261));return Pl=null,Dl=0,jl}function Au(){for(;null!==Il;)Ru(Il)}function Lu(){for(;null!==Il&&!Aa();)Ru(Il)}function Ru(e){var t=Wl(e.alternate,e,Ml);e.memoizedProps=e.pendingProps,null===t?Ou(e):Il=t,Ol.current=null}function Ou(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ll(n,t,Ml)))return void(Il=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ml)||0==(4&n.mode)){for(var r=0,a=n.child;null!==a;)r|=a.lanes|a.childLanes,a=a.sibling;n.childLanes=r}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=ul(t)))return n.flags&=2047,void(Il=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Il=t);Il=t=e}while(null!==t);0===jl&&(jl=5)}function Nu(e){var t=Za();return Ga(99,Pu.bind(null,e,t)),null}function Pu(e,t){do{Du()}while(null!==eu);if(0!=(48&Nl))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,a=r,o=e.pendingLanes&~a;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=a,e.mutableReadLanes&=a,e.entangledLanes&=a,a=e.entanglements;for(var l=e.eventTimes,u=e.expirationTimes;0<o;){var s=31-Zt(o),c=1<<s;a[s]=0,l[s]=-1,u[s]=-1,o&=~c}if(null!==au&&0==(24&r)&&au.has(e)&&au.delete(e),e===Pl&&(Il=Pl=null,Dl=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(a=Nl,Nl|=32,Ol.current=null,Ur=Yt,vr(l=gr())){if("selectionStart"in l)u={start:l.selectionStart,end:l.selectionEnd};else e:if(u=(u=l.ownerDocument)&&u.defaultView||window,(c=u.getSelection&&u.getSelection())&&0!==c.rangeCount){u=c.anchorNode,o=c.anchorOffset,s=c.focusNode,c=c.focusOffset;try{u.nodeType,s.nodeType}catch(_){u=null;break e}var d=0,f=-1,p=-1,m=0,h=0,g=l,v=null;t:for(;;){for(var b;g!==u||0!==o&&3!==g.nodeType||(f=d+o),g!==s||0!==c&&3!==g.nodeType||(p=d+c),3===g.nodeType&&(d+=g.nodeValue.length),null!==(b=g.firstChild);)v=g,g=b;for(;;){if(g===l)break t;if(v===u&&++m===o&&(f=d),v===s&&++h===c&&(p=d),null!==(b=g.nextSibling))break;v=(g=v).parentNode}g=b}u=-1===f||-1===p?null:{start:f,end:p}}else u=null;u=u||{start:0,end:0}}else u=null;$r={focusedElem:l,selectionRange:u},Yt=!1,cu=null,du=!1,Yl=r;do{try{Iu()}catch(_){if(null===Yl)throw Error(i(330));zu(Yl,_),Yl=Yl.nextEffect}}while(null!==Yl);cu=null,Yl=r;do{try{for(l=e;null!==Yl;){var y=Yl.flags;if(16&y&&be(Yl.stateNode,""),128&y){var w=Yl.alternate;if(null!==w){var k=w.ref;null!==k&&("function"==typeof k?k(null):k.current=null)}}switch(1038&y){case 2:El(Yl),Yl.flags&=-3;break;case 6:El(Yl),Yl.flags&=-3,_l(Yl.alternate,Yl);break;case 1024:Yl.flags&=-1025;break;case 1028:Yl.flags&=-1025,_l(Yl.alternate,Yl);break;case 4:_l(Yl.alternate,Yl);break;case 8:Cl(l,u=Yl);var E=u.alternate;wl(u),null!==E&&wl(E)}Yl=Yl.nextEffect}}catch(_){if(null===Yl)throw Error(i(330));zu(Yl,_),Yl=Yl.nextEffect}}while(null!==Yl);if(k=$r,w=gr(),y=k.focusedElem,l=k.selectionRange,w!==y&&y&&y.ownerDocument&&hr(y.ownerDocument.documentElement,y)){null!==l&&vr(y)&&(w=l.start,void 0===(k=l.end)&&(k=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(k,y.value.length)):(k=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(k=k.getSelection(),u=y.textContent.length,E=Math.min(l.start,u),l=void 0===l.end?E:Math.min(l.end,u),!k.extend&&E>l&&(u=l,l=E,E=u),u=mr(y,E),o=mr(y,l),u&&o&&(1!==k.rangeCount||k.anchorNode!==u.node||k.anchorOffset!==u.offset||k.focusNode!==o.node||k.focusOffset!==o.offset)&&((w=w.createRange()).setStart(u.node,u.offset),k.removeAllRanges(),E>l?(k.addRange(w),k.extend(o.node,o.offset)):(w.setEnd(o.node,o.offset),k.addRange(w))))),w=[];for(k=y;k=k.parentNode;)1===k.nodeType&&w.push({element:k,left:k.scrollLeft,top:k.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(k=w[y]).element.scrollLeft=k.left,k.element.scrollTop=k.top}Yt=!!Ur,$r=Ur=null,e.current=n,Yl=r;do{try{for(y=e;null!==Yl;){var S=Yl.flags;if(36&S&&vl(y,Yl.alternate,Yl),128&S){w=void 0;var x=Yl.ref;if(null!==x){var C=Yl.stateNode;Yl.tag,w=C,"function"==typeof x?x(w):x.current=w}}Yl=Yl.nextEffect}}catch(_){if(null===Yl)throw Error(i(330));zu(Yl,_),Yl=Yl.nextEffect}}while(null!==Yl);Yl=null,ja(),Nl=a}else e.current=n;if(Jl)Jl=!1,eu=e,tu=t;else for(Yl=r;null!==Yl;)t=Yl.nextEffect,Yl.nextEffect=null,8&Yl.flags&&((S=Yl).sibling=null,S.stateNode=null),Yl=t;if(0===(r=e.pendingLanes)&&(Ql=null),1===r?e===iu?ou++:(ou=0,iu=e):ou=0,n=n.stateNode,xa&&"function"==typeof xa.onCommitFiberRoot)try{xa.onCommitFiberRoot(Sa,n,void 0,64==(64&n.current.flags))}catch(_){}if(gu(e,qa()),Kl)throw Kl=!1,e=Xl,Xl=null,e;return 0!=(8&Nl)||Wa(),null}function Iu(){for(;null!==Yl;){var e=Yl.alternate;du||null===cu||(0!=(8&Yl.flags)?et(Yl,cu)&&(du=!0):13===Yl.tag&&Al(e,Yl)&&et(Yl,cu)&&(du=!0));var t=Yl.flags;0!=(256&t)&&gl(e,Yl),0==(512&t)||Jl||(Jl=!0,Va(97,(function(){return Du(),null}))),Yl=Yl.nextEffect}}function Du(){if(90!==tu){var e=97<tu?97:tu;return tu=90,Ga(e,ju)}return!1}function Mu(e,t){nu.push(t,e),Jl||(Jl=!0,Va(97,(function(){return Du(),null})))}function Fu(e,t){ru.push(t,e),Jl||(Jl=!0,Va(97,(function(){return Du(),null})))}function ju(){if(null===eu)return!1;var e=eu;if(eu=null,0!=(48&Nl))throw Error(i(331));var t=Nl;Nl|=32;var n=ru;ru=[];for(var r=0;r<n.length;r+=2){var a=n[r],o=n[r+1],l=a.destroy;if(a.destroy=void 0,"function"==typeof l)try{l()}catch(s){if(null===o)throw Error(i(330));zu(o,s)}}for(n=nu,nu=[],r=0;r<n.length;r+=2){a=n[r],o=n[r+1];try{var u=a.create;a.destroy=u()}catch(s){if(null===o)throw Error(i(330));zu(o,s)}}for(u=e.current.firstEffect;null!==u;)e=u.nextEffect,u.nextEffect=null,8&u.flags&&(u.sibling=null,u.stateNode=null),u=e;return Nl=t,Wa(),!0}function Bu(e,t,n){fo(e,t=fl(0,t=sl(n,t),1)),t=fu(),null!==(e=hu(e,1))&&(qt(e,1,t),gu(e,t))}function zu(e,t){if(3===e.tag)Bu(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Bu(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ql||!Ql.has(r))){var a=pl(n,e=sl(t,e),1);if(fo(n,a),a=fu(),null!==(n=hu(n,1)))qt(n,1,a),gu(n,a);else if("function"==typeof r.componentDidCatch&&(null===Ql||!Ql.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Uu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=fu(),e.pingedLanes|=e.suspendedLanes&n,Pl===e&&(Dl&n)===n&&(4===jl||3===jl&&(62914560&Dl)===Dl&&500>qa()-Hl?xu(e,0):ql|=n),gu(e,t)}function $u(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Za()?1:2:(0===uu&&(uu=zl),0===(t=Ut(62914560&~uu))&&(t=4194304))),n=fu(),null!==(e=hu(e,t))&&(qt(e,t,n),gu(e,n))}function qu(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Zu(e,t,n,r){return new qu(e,t,n,r)}function Hu(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Gu(e,t){var n=e.alternate;return null===n?((n=Zu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Vu(e,t,n,r,a,o){var l=2;if(r=e,"function"==typeof e)Hu(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case x:return Wu(n.children,a,o,t);case M:l=8,a|=16;break;case C:l=8,a|=1;break;case _:return(e=Zu(12,n,t,8|a)).elementType=_,e.type=_,e.lanes=o,e;case R:return(e=Zu(13,n,t,a)).type=R,e.elementType=R,e.lanes=o,e;case O:return(e=Zu(19,n,t,a)).elementType=O,e.lanes=o,e;case F:return Yu(n,a,o,t);case j:return(e=Zu(24,n,t,a)).elementType=j,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:l=10;break e;case A:l=9;break e;case L:l=11;break e;case N:l=14;break e;case P:l=16,r=null;break e;case I:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Zu(l,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function Wu(e,t,n,r){return(e=Zu(7,e,r,t)).lanes=n,e}function Yu(e,t,n,r){return(e=Zu(23,e,r,t)).elementType=F,e.lanes=n,e}function Ku(e,t,n){return(e=Zu(6,e,null,t)).lanes=n,e}function Xu(e,t,n){return(t=Zu(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qu(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=$t(0),this.expirationTimes=$t(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=$t(0),this.mutableSourceEagerHydrationData=null}function Ju(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}function es(e,t,n,r){var a=t.current,o=fu(),l=pu(a);e:if(n){t:{if(Ke(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var u=n;do{switch(u.tag){case 3:u=u.stateNode.context;break t;case 1:if(va(u.type)){u=u.stateNode.__reactInternalMemoizedMergedChildContext;break t}}u=u.return}while(null!==u);throw Error(i(171))}if(1===n.tag){var s=n.type;if(va(s)){n=wa(n,s,u);break e}}n=u}else n=fa;return null===t.context?t.context=n:t.pendingContext=n,(t=co(o,l)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),fo(a,t),mu(a,l,o),l}function ts(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function ns(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function rs(e,t){ns(e,t),(e=e.alternate)&&ns(e,t)}function as(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Qu(e,t,null!=n&&!0===n.hydrate),t=Zu(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,uo(t),e[ea]=n.current,Nr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var a=(t=r[e])._getVersion;a=a(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,a]:n.mutableSourceEagerHydrationData.push(t,a)}this._internalRoot=n}function os(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function is(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof a){var l=a;a=function(){var e=ts(i);l.call(e)}}es(t,i,e,a)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new as(e,0,t?{hydrate:!0}:void 0)}(n,r),i=o._internalRoot,"function"==typeof a){var u=a;a=function(){var e=ts(i);u.call(e)}}ku((function(){es(t,i,e,a)}))}return ts(i)}function ls(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!os(t))throw Error(i(200));return Ju(e,t,null,n)}Wl=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||ma.current)Fi=!0;else{if(0==(n&r)){switch(Fi=!1,t.tag){case 3:Vi(t),Wo();break;case 5:Mo(t);break;case 1:va(t.type)&&ka(t);break;case 4:Io(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var a=t.type._context;da(Qa,a._currentValue),a._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qi(e,t,n):(da(jo,1&jo.current),null!==(t=ol(e,t,n))?t.sibling:null);da(jo,1&jo.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return al(e,t,n);t.flags|=64}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),da(jo,jo.current),r)break;return null;case 23:case 24:return t.lanes=0,$i(e,t,n)}return ol(e,t,n)}Fi=0!=(16384&e.flags)}else Fi=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=ga(t,pa.current),oo(t,n),a=li(null,t,r,e,a,n),t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,va(r)){var o=!0;ka(t)}else o=!1;t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,uo(t);var l=r.getDerivedStateFromProps;"function"==typeof l&&vo(t,r,l,e),a.updater=bo,t.stateNode=a,a._reactInternals=t,Eo(t,r,e,n),t=Gi(null,t,r,!0,o,n)}else t.tag=0,ji(null,t,a,n),t=t.child;return t;case 16:a=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=(o=a._init)(a._payload),t.type=a,o=t.tag=function(e){if("function"==typeof e)return Hu(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===N)return 14}return 2}(a),e=Xa(a,e),o){case 0:t=Zi(null,t,a,e,n);break e;case 1:t=Hi(null,t,a,e,n);break e;case 11:t=Bi(null,t,a,e,n);break e;case 14:t=zi(null,t,a,Xa(a.type,e),r,n);break e}throw Error(i(306,a,""))}return t;case 0:return r=t.type,a=t.pendingProps,Zi(e,t,r,a=t.elementType===r?a:Xa(r,a),n);case 1:return r=t.type,a=t.pendingProps,Hi(e,t,r,a=t.elementType===r?a:Xa(r,a),n);case 3:if(Vi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,a=null!==(a=t.memoizedState)?a.element:null,so(e,t),mo(t,r,null,n),(r=t.memoizedState.element)===a)Wo(),t=ol(e,t,n);else{if((o=(a=t.stateNode).hydrate)&&(Uo=Wr(t.stateNode.containerInfo.firstChild),zo=t,o=$o=!0),o){if(null!=(e=a.mutableSourceEagerHydrationData))for(a=0;a<e.length;a+=2)(o=e[a])._workInProgressVersionPrimary=e[a+1],Yo.push(o);for(n=Ao(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else ji(e,t,r,n),Wo();t=t.child}return t;case 5:return Mo(t),null===e&&Ho(t),r=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,l=a.children,Zr(r,a)?l=null:null!==o&&Zr(r,o)&&(t.flags|=16),qi(e,t),ji(e,t,l,n),t.child;case 6:return null===e&&Ho(t),null;case 13:return Qi(e,t,n);case 4:return Io(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=To(t,null,r,n):ji(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,Bi(e,t,r,a=t.elementType===r?a:Xa(r,a),n);case 7:return ji(e,t,t.pendingProps,n),t.child;case 8:case 12:return ji(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,a=t.pendingProps,l=t.memoizedProps,o=a.value;var u=t.type._context;if(da(Qa,u._currentValue),u._currentValue=o,null!==l)if(u=l.value,0===(o=cr(u,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(u,o):1073741823))){if(l.children===a.children&&!ma.current){t=ol(e,t,n);break e}}else for(null!==(u=t.child)&&(u.return=t);null!==u;){var s=u.dependencies;if(null!==s){l=u.child;for(var c=s.firstContext;null!==c;){if(c.context===r&&0!=(c.observedBits&o)){1===u.tag&&((c=co(-1,n&-n)).tag=2,fo(u,c)),u.lanes|=n,null!==(c=u.alternate)&&(c.lanes|=n),ao(u.return,n),s.lanes|=n;break}c=c.next}}else l=10===u.tag&&u.type===t.type?null:u.child;if(null!==l)l.return=u;else for(l=u;null!==l;){if(l===t){l=null;break}if(null!==(u=l.sibling)){u.return=l.return,l=u;break}l=l.return}u=l}ji(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=(o=t.pendingProps).children,oo(t,n),r=r(a=io(a,o.unstable_observedBits)),t.flags|=1,ji(e,t,r,n),t.child;case 14:return o=Xa(a=t.type,t.pendingProps),zi(e,t,a,o=Xa(a.type,o),r,n);case 15:return Ui(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:Xa(r,a),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,va(r)?(e=!0,ka(t)):e=!1,oo(t,n),wo(t,r,a),Eo(t,r,a,n),Gi(null,t,r,!0,e,n);case 19:return al(e,t,n);case 23:case 24:return $i(e,t,n)}throw Error(i(156,t.tag))},as.prototype.render=function(e){es(e,this._internalRoot,null,null)},as.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;es(null,e,null,(function(){t[ea]=null}))},tt=function(e){13===e.tag&&(mu(e,4,fu()),rs(e,4))},nt=function(e){13===e.tag&&(mu(e,67108864,fu()),rs(e,67108864))},rt=function(e){if(13===e.tag){var t=fu(),n=pu(e);mu(e,n,t),rs(e,n)}},at=function(e,t){return t()},Te=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=oa(r);if(!a)throw Error(i(90));X(r),ne(r,a)}}}break;case"textarea":se(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Pe=wu,Ie=function(e,t,n,r,a){var o=Nl;Nl|=4;try{return Ga(98,e.bind(null,t,n,r,a))}finally{0===(Nl=o)&&(Vl(),Wa())}},De=function(){0==(49&Nl)&&(function(){if(null!==au){var e=au;au=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,gu(e,qa())}))}Wa()}(),Du())},Me=function(e,t){var n=Nl;Nl|=2;try{return e(t)}finally{0===(Nl=n)&&(Vl(),Wa())}};var us={Events:[ra,aa,oa,Oe,Ne,Du,{current:!1}]},ss={findFiberByHostInstance:na,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},cs={bundleType:ss.bundleType,version:ss.version,rendererPackageName:ss.rendererPackageName,rendererConfig:ss.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:k.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Je(e))?null:e.stateNode},findFiberByHostInstance:ss.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ds=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ds.isDisabled&&ds.supportsFiber)try{Sa=ds.inject(cs),xa=ds}catch(ge){}}t.hydrate=function(e,t,n){if(!os(t))throw Error(i(200));return is(null,e,t,!0,n)}},3935:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4448)},9590:function(e){var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,u,s,c;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(u=l;0!=u--;)if(!o(e[u],i[u]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(c=e.entries();!(u=c.next()).done;)if(!i.has(u.value[0]))return!1;for(c=e.entries();!(u=c.next()).done;)if(!o(u.value[1],i.get(u.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(c=e.entries();!(u=c.next()).done;)if(!i.has(u.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(u=l;0!=u--;)if(e[u]!==i[u])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===i.toString();if((l=(s=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(u=l;0!=u--;)if(!Object.prototype.hasOwnProperty.call(i,s[u]))return!1;if(t&&e instanceof Element)return!1;for(u=l;0!=u--;)if(("_owner"!==s[u]&&"__v"!==s[u]&&"__o"!==s[u]||!e.$$typeof)&&!o(e[s[u]],i[s[u]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},405:function(e,t,n){"use strict";n.d(t,{B6:function(){return H},ql:function(){return J}});var r=n(7294),a=n(5697),o=n.n(a),i=n(9590),l=n.n(i),u=n(1143),s=n.n(u),c=n(6774),d=n.n(c);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},v={rel:["amphtml","canonical","alternate"]},b={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},E=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},C=function(e){return S(e,"onChangeClientState")||function(){}},_=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},A=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],u=l.toLowerCase();-1===t.indexOf(u)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===u&&"stylesheet"===e[u].toLowerCase()||(n=u),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var s=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][s]&&(a[n][s]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],u=f({},r[l],a[l]);r[l]=u}return e}),[]).reverse()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},R=function(e){return Array.isArray(e)?e.join(""):e},O=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},P=[g.NOSCRIPT,g.SCRIPT,g.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},M=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},F=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},j=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=M(n,a),[r.createElement(g.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=D(n),o=R(t);return a?"<"+e+' data-rh="true" '+a+">"+I(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return M(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},B=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,u=void 0===l?"":l,s=e.titleAttributes,c=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=O(e.metaTags,y),o=O(t,v),i=O(n,b);return{priorityMethods:{toComponent:function(){return[].concat(F(g.META,a.priority),F(g.LINK,o.priority),F(g.SCRIPT,i.priority))},toString:function(){return j(g.META,a.priority,r)+" "+j(g.LINK,o.priority,r)+" "+j(g.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=m.priorityMethods,c=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:j(g.BASE,t,r),bodyAttributes:j("bodyAttributes",n,r),htmlAttributes:j("htmlAttributes",a,r),link:j(g.LINK,c,r),meta:j(g.META,d,r),noscript:j(g.NOSCRIPT,o,r),script:j(g.SCRIPT,f,r),style:j(g.STYLE,i,r),title:j(g.TITLE,{title:u,titleAttributes:s},r)}},z=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=B({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),q=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),Z="undefined"!=typeof document,H=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);H.canUseDOM=Z,H.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},H.defaultProps={context:{}},H.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},V=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var u=i[l],s=t[u]||"";n.getAttribute(u)!==s&&n.setAttribute(u,s),-1===a.indexOf(u)&&a.push(u);var c=o.indexOf(u);-1!==c&&o.splice(c,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,u=e.scriptTags,s=e.styleTags,c=e.title,d=e.titleAttributes;V(g.BODY,e.bodyAttributes),V(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=R(e)),V(g.TITLE,t)}(c,d);var f={baseTag:G(g.BASE,n),linkTags:G(g.LINK,a),metaTags:G(g.META,o),noscriptTags:G(g.NOSCRIPT,i),scriptTags:G(g.SCRIPT,u),styleTags:G(g.STYLE,s)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),l(e,p,m)},Y=null,K=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:_("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:_("htmlAttributes",e),linkTags:A(g.LINK,["rel","href"],e),metaTags:A(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:C(e),scriptTags:A(g.SCRIPT,["src","innerHTML"],e),styleTags:A(g.STYLE,["cssText"],e),title:x(e),titleAttributes:_("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});H.canUseDOM?(t=o,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){W(t,(function(){Y=null}))})):(W(t),Y=null)):B&&(a=B(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);K.propTypes={context:q.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case g.BODY:return f({},a,{bodyAttributes:f({},o)});case g.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return s()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),s()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=h(r,X),l=Object.keys(i).reduce((function(e,t){return e[E[t]||t]=i[t],e}),{}),u=e.type;switch("symbol"==typeof u?u=u.toString():n.warnOnInvalidChildren(e,o),u){case g.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,Q),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?r.createElement(K,f({},a,{context:o.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(K,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9921:function(e,t){"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,u=n?Symbol.for("react.provider"):60109,s=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,v=n?Symbol.for("react.block"):60121,b=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case s:case f:case g:case h:case u:return e;default:return t}}case a:return t}}}function E(e){return k(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=s,t.ContextProvider=u,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=g,t.Memo=h,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return E(e)||k(e)===c},t.isConcurrentMode=E,t.isContextConsumer=function(e){return k(e)===s},t.isContextProvider=function(e){return k(e)===u},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===f},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===g},t.isMemo=function(e){return k(e)===h},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===u||e.$$typeof===s||e.$$typeof===f||e.$$typeof===b||e.$$typeof===y||e.$$typeof===w||e.$$typeof===v)},t.typeOf=k},9864:function(e,t,n){"use strict";e.exports=n(9921)},8356:function(e,t,n){"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}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;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var l=n(7294),u=n(5697),s=[],c=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return s.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextTypes",{loadable:u.shape({report:u.func.isRequired})}),f}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function v(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return v(e)}))}o(g,"propTypes",{report:u.func.isRequired}),o(g,"childContextTypes",{loadable:u.shape({report:u.func.isRequired}).isRequired}),h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){v(s).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){v(c).then(e,e)}))},e.exports=h},8790:function(e,t,n){"use strict";n.d(t,{H:function(){return l},f:function(){return i}});var r=n(6775),a=n(7462),o=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.rs,n,e.map((function(e,n){return o.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.Z)({},n,t,{route:e}))}})}))):null}},3727:function(e,t,n){"use strict";n.d(t,{OL:function(){return y},VK:function(){return c},rU:function(){return g}});var r=n(6775),a=n(4578),o=n(7294),i=n(9318),l=n(7462),u=n(3366),s=n(2177),c=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},m=o.forwardRef;void 0===m&&(m=p);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,u.Z)(e,["innerRef","navigate","onClick"]),s=i.target,c=(0,l.Z)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||s&&"_self"!==s||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return c.ref=p!==m&&t||n,o.createElement("a",c)}));var g=m((function(e,t){var n=e.component,a=void 0===n?h:n,c=e.replace,g=e.to,v=e.innerRef,b=(0,u.Z)(e,["component","replace","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,s.Z)(!1);var n=e.history,r=f(d(g,e.location),e.location),u=r?n.createHref(r):"",h=(0,l.Z)({},b,{href:u,navigate:function(){var t=d(g,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(c||r?n.replace:n.push)(t)}});return p!==m?h.ref=t||v:h.innerRef=v,o.createElement(a,h)}))})),v=function(e){return e},b=o.forwardRef;void 0===b&&(b=v);var y=b((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,c=void 0===i?"active":i,p=e.activeStyle,m=e.className,h=e.exact,y=e.isActive,w=e.location,k=e.sensitive,E=e.strict,S=e.style,x=e.to,C=e.innerRef,_=(0,u.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,s.Z)(!1);var n=w||e.location,i=f(d(x,n),n),u=i.pathname,T=u&&u.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=T?(0,r.LX)(n.pathname,{path:T,exact:h,sensitive:k,strict:E}):null,L=!!(y?y(A,n):A),R="function"==typeof m?m(L):m,O="function"==typeof S?S(L):S;L&&(R=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(R,c),O=(0,l.Z)({},O,p));var N=(0,l.Z)({"aria-current":L&&a||null,className:R,style:O,to:i},_);return v!==b?N.ref=t||C:N.innerRef=C,o.createElement(g,N)}))}))},6775:function(e,t,n){"use strict";n.d(t,{AW:function(){return C},F0:function(){return k},rs:function(){return O},s6:function(){return w},LX:function(){return x},k6:function(){return P},TH:function(){return I}});var r=n(4578),a=n(7294),o=n(9318),i=n(5697),l=n.n(i),u=1073741823,s="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};function c(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,r){e=n,t.forEach((function(t){return t(e,r)}))}}}var d=a.createContext||function(e,t){var n,o,i="__create-react-context-"+function(){var e="__global_unique_id__";return s[e]=(s[e]||0)+1}()+"__",d=function(e){function n(){var t;return(t=e.apply(this,arguments)||this).emitter=c(t.props.value),t}(0,r.Z)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[i]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):u,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);d.childContextTypes=((n={})[i]=l().object.isRequired,n);var f=function(t){function n(){var e;return(e=t.apply(this,arguments)||this).state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.Z)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?u:t},a.componentDidMount=function(){this.context[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?u:e},a.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},a.getValue=function(){return this.context[i]?this.context[i].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return f.contextTypes=((o={})[i]=l().object,o),{Provider:d,Consumer:f}},f=d,p=n(2177),m=n(7462),h=n(9658),g=n.n(h),v=(n(9864),n(3366)),b=(n(8679),function(e){var t=f();return t.displayName=e,t}),y=b("Router-History"),w=b("Router"),k=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(w.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(y.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.Component;var E={},S=0;function x(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,u=n.sensitive,s=void 0!==u&&u;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=E[n]||(E[n]={});if(r[e])return r[e];var a=[],o={regexp:g()(e,a,t),keys:a};return S<1e4&&(r[e]=o,S++),o}(n,{end:o,strict:l,sensitive:s}),a=r.regexp,i=r.keys,u=a.exec(e);if(!u)return null;var c=u[0],d=u.slice(1),f=e===c;return o&&!f?null:{path:n,url:"/"===n&&""===c?"/":c,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=d[n],e}),{})}}),null)}var C=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(w.Consumer,null,(function(t){t||(0,p.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?x(n.pathname,e.props):t.match,o=(0,m.Z)({},t,{location:n,match:r}),i=e.props,l=i.children,u=i.component,s=i.render;return Array.isArray(l)&&function(e){return 0===a.Children.count(e)}(l)&&(l=null),a.createElement(w.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?a.createElement(u,o):s?s(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function _(e){return"/"===e.charAt(0)?e:"/"+e}function T(e,t){if(!e)return t;var n=_(e);return 0!==t.pathname.indexOf(n)?t:(0,m.Z)({},t,{pathname:t.pathname.substr(n.length)})}function A(e){return"string"==typeof e?e:(0,o.Ep)(e)}function L(e){return function(){(0,p.Z)(!1)}}function R(){}a.Component;var O=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(w.Consumer,null,(function(t){t||(0,p.Z)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?x(o.pathname,(0,m.Z)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var N=a.useContext;function P(){return N(y)}function I(){return N(w).location}},9658:function(e,t,n){var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],v=n[4],b=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,E="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,C=v||b;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:S,repeat:E,partial:k,asterisk:!!w,pattern:C?s(C):w?".*":"[^"+u(x)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},u=(a||{}).pretty?i:encodeURIComponent,s=0;s<e.length;s++){var c=e[s];if("string"!=typeof c){var d,f=l[c.name];if(null==f){if(c.optional){c.partial&&(o+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(r(f)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=u(f[p]),!n[s].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?c.prefix:c.delimiter)+d}}else{if(d=c.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):u(f),!n[s].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');o+=c.prefix+d}}else o+=c}return o}}function u(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function s(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function c(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var s=e[l];if("string"==typeof s)i+=u(s);else{var f=u(s.prefix),p="(?:"+s.pattern+")";t.push(s),s.repeat&&(p+="(?:"+f+p+")*"),i+=p=s.optional?s.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=u(n.delimiter||"/"),h=i.slice(-m.length)===m;return a||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&h?"":"(?="+m+"|$)",c(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return c(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return c(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},2408:function(e,t,n){"use strict";var r=n(7418),a=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,u=60112;t.Suspense=60113;var s=60115,c=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;a=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),u=d("react.forward_ref"),t.Suspense=d("react.suspense"),s=d("react.memo"),c=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h={};function g(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}function v(){}function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||m}g.prototype.isReactComponent={},g.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},g.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=g.prototype;var y=b.prototype=new v;y.constructor=b,r(y,g.prototype),y.isPureReactComponent=!0;var w={current:null},k=Object.prototype.hasOwnProperty,E={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var r,o={},i=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,r)&&!E.hasOwnProperty(r)&&(o[r]=t[r]);var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){for(var s=Array(u),c=0;c<u;c++)s[c]=arguments[c+2];o.children=s}if(e&&e.defaultProps)for(r in u=e.defaultProps)void 0===o[r]&&(o[r]=u[r]);return{$$typeof:a,type:e,key:i,ref:l,props:o,_owner:w.current}}function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}var C=/\/+/g;function _(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function T(e,t,n,r,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var u=!1;if(null===e)u=!0;else switch(l){case"string":case"number":u=!0;break;case"object":switch(e.$$typeof){case a:case o:u=!0}}if(u)return i=i(u=e),e=""===r?"."+_(u,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(C,"$&/")+"/"),T(i,t,n,"",(function(e){return e}))):null!=i&&(x(i)&&(i=function(e,t){return{$$typeof:a,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||u&&u.key===i.key?"":(""+i.key).replace(C,"$&/")+"/")+e)),t.push(i)),1;if(u=0,r=""===r?".":r+":",Array.isArray(e))for(var s=0;s<e.length;s++){var c=r+_(l=e[s],s);u+=T(l,t,n,c,i)}else if(c=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof c)for(e=c.call(e),s=0;!(l=e.next()).done;)u+=T(l=l.value,t,n,c=r+_(l,s++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return u}function A(e,t,n){if(null==e)return e;var r=[],a=0;return T(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var R={current:null};function O(){var e=R.current;if(null===e)throw Error(p(321));return e}var N={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!x(e))throw Error(p(143));return e}},t.Component=g,t.PureComponent=b,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=N,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=r({},e.props),i=e.key,l=e.ref,u=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,u=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)k.call(t,c)&&!E.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==s?s[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=n;else if(1<c){s=Array(c);for(var d=0;d<c;d++)s[d]=arguments[d+2];o.children=s}return{$$typeof:a,type:e.type,key:i,ref:l,props:o,_owner:u}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=S,t.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=x,t.lazy=function(e){return{$$typeof:c,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:s,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return O().useCallback(e,t)},t.useContext=function(e,t){return O().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return O().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return O().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return O().useLayoutEffect(e,t)},t.useMemo=function(e,t){return O().useMemo(e,t)},t.useReducer=function(e,t,n){return O().useReducer(e,t,n)},t.useRef=function(e){return O().useRef(e)},t.useState=function(e){return O().useState(e)},t.version="17.0.2"},7294:function(e,t,n){"use strict";e.exports=n(2408)},53:function(e,t){"use strict";var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,u=l.now();t.unstable_now=function(){return l.now()-u}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var s=null,c=null,d=function(){if(null!==s)try{var e=t.unstable_now();s(!0,e),s=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==s?setTimeout(n,0,e):(s=e,setTimeout(d,0))},r=function(e,t){c=setTimeout(e,t)},a=function(){clearTimeout(c)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var h=!1,g=null,v=-1,b=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):b=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,k=w.port2;w.port1.onmessage=function(){if(null!==g){var e=t.unstable_now();y=e+b;try{g(!0,e)?k.postMessage(null):(h=!1,g=null)}catch(n){throw k.postMessage(null),n}}else h=!1},n=function(e){g=e,h||(h=!0,k.postMessage(null))},r=function(e,n){v=f((function(){e(t.unstable_now())}),n)},a=function(){p(v),v=-1}}function E(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,a=e[r];if(!(void 0!==a&&0<C(a,t)))break e;e[r]=t,e[n]=a,n=r}}function S(e){return void 0===(e=e[0])?null:e}function x(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length;r<a;){var o=2*(r+1)-1,i=e[o],l=o+1,u=e[l];if(void 0!==i&&0>C(i,n))void 0!==u&&0>C(u,i)?(e[r]=u,e[l]=n,r=l):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==u&&0>C(u,n)))break e;e[r]=u,e[l]=n,r=l}}}return t}return null}function C(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var _=[],T=[],A=1,L=null,R=3,O=!1,N=!1,P=!1;function I(e){for(var t=S(T);null!==t;){if(null===t.callback)x(T);else{if(!(t.startTime<=e))break;x(T),t.sortIndex=t.expirationTime,E(_,t)}t=S(T)}}function D(e){if(P=!1,I(e),!N)if(null!==S(_))N=!0,n(M);else{var t=S(T);null!==t&&r(D,t.startTime-e)}}function M(e,n){N=!1,P&&(P=!1,a()),O=!0;var o=R;try{for(I(n),L=S(_);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,R=L.priorityLevel;var l=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?L.callback=l:L===S(_)&&x(_),I(n)}else x(_);L=S(_)}if(null!==L)var u=!0;else{var s=S(T);null!==s&&r(D,s.startTime-n),u=!1}return u}finally{L=null,R=o,O=!1}}var F=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){N||O||(N=!0,n(M))},t.unstable_getCurrentPriorityLevel=function(){return R},t.unstable_getFirstCallbackNode=function(){return S(_)},t.unstable_next=function(e){switch(R){case 1:case 2:case 3:var t=3;break;default:t=R}var n=R;R=t;try{return e()}finally{R=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=F,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=R;R=e;try{return t()}finally{R=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,e){case 1:var u=-1;break;case 2:u=250;break;case 5:u=1073741823;break;case 4:u=1e4;break;default:u=5e3}return e={id:A++,callback:o,priorityLevel:e,startTime:i,expirationTime:u=i+u,sortIndex:-1},i>l?(e.sortIndex=i,E(T,e),null===S(_)&&e===S(T)&&(P?a():P=!0,r(D,i-l))):(e.sortIndex=u,E(_,e),N||O||(N=!0,n(M))),e},t.unstable_wrapCallback=function(e){var t=R;return function(){var n=R;R=t;try{return e.apply(this,arguments)}finally{R=n}}}},3840:function(e,t,n){"use strict";e.exports=n(53)},6774:function(e){e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),u=0;u<o.length;u++){var s=o[u];if(!l(s))return!1;var c=e[s],d=t[s];if(!1===(a=n?n.call(r,c,d,s):void 0)||void 0===a&&c!==d)return!1}return!0}},2177:function(e,t,n){"use strict";n.d(t,{Z:function(){return a}});var r="Invariant failed";function a(e,t){if(!e)throw new Error(r)}},6809:function(e,t){"use strict";t.Z={title:"Raccoon",tagline:"Raccoon is a high-throughput, low-latency service to collect events in real-time from your web, mobile apps, and services using multiple network protocols.",url:"https://raystack.github.io/",baseUrl:"/raccoon/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"favicon.ico",organizationName:"Raystack",projectName:"raccoon",presets:[["@docusaurus/preset-classic",{gtag:{trackingID:"G-XXX"},docs:{routeBasePath:"/",sidebarPath:"/home/runner/work/raccoon/raccoon/docs/sidebars.js",editUrl:"https://github.com/raystack/raccoon/edit/master/docs/",sidebarCollapsed:!1,breadcrumbs:!1},blog:!1,theme:{customCss:["/home/runner/work/raccoon/raccoon/docs/src/css/theme.css","/home/runner/work/raccoon/raccoon/docs/src/css/icons.css"]}}]],themeConfig:{colorMode:{defaultMode:"light",respectPrefersColorScheme:!0,disableSwitch:!1},navbar:{title:"Raccoon",logo:{src:"/logo.svg"},hideOnScroll:!0,items:[{type:"doc",docId:"introduction",position:"right",label:"Documentation"},{to:"/support",label:"Support",position:"right"},{href:"https://bit.ly/2RzPbtn",position:"right",className:"header-slack-link"},{href:"https://github.com/raystack/raccoon",className:"navbar-item-github",position:"right"}]},footer:{style:"light",links:[]},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:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},announcementBar:{id:"star-repo",content:'\u2b50\ufe0f If you like Raccoon, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://github.com/raystack/raccoon">GitHub</a>! \u2b50',backgroundColor:"#222",textColor:"#eee",isCloseable:!0},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",path:"i18n",locales:["en"],localeConfigs:{}},onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},7462:function(e,t,n){"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{Z:function(){return r}})},4578:function(e,t,n){"use strict";n.d(t,{Z:function(){return a}});var r=n(9611);function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,(0,r.Z)(e,t)}},3366:function(e,t,n){"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{Z:function(){return r}})},9611:function(e,t,n){"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}n.d(t,{Z:function(){return r}})},6528:function(e,t,n){"use strict";function r(e){return r="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},r(e)}n.d(t,{Z:function(){return i}});var a=n(9611);function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&(0,a.Z)(e,t)}function i(){i=function(e,t){return new n(e,void 0,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,r,o){var i=new RegExp(e,r);return t.set(i,o||t.get(e)),(0,a.Z)(i,n.prototype)}function l(e,n){var r=t.get(n);return Object.keys(r).reduce((function(t,n){return t[n]=e[r[n]],t}),Object.create(null))}return o(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);return n&&(n.groups=l(n,this)),n},n.prototype[Symbol.replace]=function(n,a){if("string"==typeof a){var o=t.get(this);return e[Symbol.replace].call(this,n,a.replace(/\$<([^>]+)>/g,(function(e,t){return"$"+o[t]})))}if("function"==typeof a){var i=this;return e[Symbol.replace].call(this,n,(function(){var e=arguments;return"object"!=r(e[e.length-1])&&(e=[].slice.call(e)).push(l(e,i)),a.apply(this,e)}))}return e[Symbol.replace].call(this,n,a)},i.apply(this,arguments)}},7529:function(e){"use strict";e.exports={}},6887:function(e){"use strict";e.exports=JSON.parse('{"/raccoon/-7c4":{"__comp":"1be78505","__context":{"plugin":"3585ba8f"},"versionMetadata":"935f2afb"},"/raccoon/-550":{"__comp":"17896441","content":"a09c2993"},"/raccoon/concepts/architecture-4a8":{"__comp":"17896441","content":"8a1416ba"},"/raccoon/concepts/structure-b0f":{"__comp":"17896441","content":"fadecd94"},"/raccoon/contribute/contribution-2b1":{"__comp":"17896441","content":"f3275a05"},"/raccoon/contribute/development-38e":{"__comp":"17896441","content":"7ff2cdfe"},"/raccoon/contribute/release-a64":{"__comp":"17896441","content":"338d3fa8"},"/raccoon/guides/deployment-190":{"__comp":"17896441","content":"caaf7770"},"/raccoon/guides/monitoring-213":{"__comp":"17896441","content":"7de6ea50"},"/raccoon/guides/overview-fc4":{"__comp":"17896441","content":"c5e4a08a"},"/raccoon/guides/publishing-752":{"__comp":"17896441","content":"1425879c"},"/raccoon/guides/troubleshooting-bfe":{"__comp":"17896441","content":"03be7dae"},"/raccoon/quickstart-114":{"__comp":"17896441","content":"8070e160"},"/raccoon/reference/benchmarks-068":{"__comp":"17896441","content":"010df87a"},"/raccoon/reference/configurations-a76":{"__comp":"17896441","content":"58175526"},"/raccoon/reference/metrics-351":{"__comp":"17896441","content":"fc49bffc"},"/raccoon/roadmap-182":{"__comp":"17896441","content":"0dffb83e"},"/raccoon/support-a67":{"__comp":"17896441","content":"d9e16301"}}')}},function(e){e.O(0,[532],(function(){return t=9383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/runtime~main.585d3520.js b/assets/js/runtime~main.585d3520.js new file mode 100644 index 00000000..9c2c0291 --- /dev/null +++ b/assets/js/runtime~main.585d3520.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,r,t,a,o,f={},n={};function c(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={exports:{}};return f[e].call(t.exports,t,t.exports,c),t.exports}c.m=f,e=[],c.O=(r,t,a,o)=>{if(!t){var f=1/0;for(u=0;u<e.length;u++){t=e[u][0],a=e[u][1],o=e[u][2];for(var n=!0,d=0;d<t.length;d++)(!1&o||f>=o)&&Object.keys(c.O).every((e=>c.O[e](t[d])))?t.splice(d--,1):(n=!1,o<f&&(f=o));if(n){e.splice(u--,1);var i=a();void 0!==i&&(r=i)}}return r}o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[t,a,o]},c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var f={};r=r||[null,t({}),t([]),t(t)];for(var n=2&a&&e;"object"==typeof n&&!~r.indexOf(n);n=t(n))Object.getOwnPropertyNames(n).forEach((r=>f[r]=()=>e[r]));return f.default=()=>e,c.d(o,f),o},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((r,t)=>(c.f[t](e,r),r)),[])),c.u=e=>"assets/js/"+({24:"f3275a05",187:"3585ba8f",226:"7de6ea50",228:"1425879c",342:"7ff2cdfe",401:"17896441",416:"d9e16301",462:"fc49bffc",581:"935f2afb",612:"010df87a",669:"caaf7770",693:"338d3fa8",699:"8a1416ba",714:"1be78505",718:"58175526",758:"c5e4a08a",768:"03be7dae",771:"fadecd94",821:"0dffb83e",822:"8070e160",899:"a09c2993"}[e]||e)+"."+{24:"0ac1d642",187:"467414d2",226:"0ccc31f4",228:"4c1a0589",342:"11388b0e",401:"bb502102",416:"16abe1ad",462:"f6068783",553:"217c3e29",581:"01815371",612:"51dd0c94",669:"1f2988c7",693:"ec9de5f8",699:"19537c66",714:"888097e5",718:"7fd1ba94",758:"5a0c4a86",768:"333685c4",771:"e09f5515",774:"5bdaf5ba",821:"5a4e105c",822:"6c0f6636",899:"e261a802"}[e]+".js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a={},o="raccoon:",c.l=(e,r,t,f)=>{if(a[e])a[e].push(r);else{var n,d;if(void 0!==t)for(var i=document.getElementsByTagName("script"),u=0;u<i.length;u++){var b=i[u];if(b.getAttribute("src")==e||b.getAttribute("data-webpack")==o+t){n=b;break}}n||(d=!0,(n=document.createElement("script")).charset="utf-8",n.timeout=120,c.nc&&n.setAttribute("nonce",c.nc),n.setAttribute("data-webpack",o+t),n.src=e),a[e]=[r];var l=(r,t)=>{n.onerror=n.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],n.parentNode&&n.parentNode.removeChild(n),o&&o.forEach((e=>e(t))),r)return r(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:n}),12e4);n.onerror=l.bind(null,n.onerror),n.onload=l.bind(null,n.onload),d&&document.head.appendChild(n)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.p="/raccoon/",c.gca=function(e){return e={17896441:"401",58175526:"718",f3275a05:"24","3585ba8f":"187","7de6ea50":"226","1425879c":"228","7ff2cdfe":"342",d9e16301:"416",fc49bffc:"462","935f2afb":"581","010df87a":"612",caaf7770:"669","338d3fa8":"693","8a1416ba":"699","1be78505":"714",c5e4a08a:"758","03be7dae":"768",fadecd94:"771","0dffb83e":"821","8070e160":"822",a09c2993:"899"}[e]||e,c.p+c.u(e)},(()=>{var e={354:0,869:0};c.f.j=(r,t)=>{var a=c.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(354|869)$/.test(r))e[r]=0;else{var o=new Promise(((t,o)=>a=e[r]=[t,o]));t.push(a[2]=o);var f=c.p+c.u(r),n=new Error;c.l(f,(t=>{if(c.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),f=t&&t.target&&t.target.src;n.message="Loading chunk "+r+" failed.\n("+o+": "+f+")",n.name="ChunkLoadError",n.type=o,n.request=f,a[1](n)}}),"chunk-"+r,r)}},c.O.j=r=>0===e[r];var r=(r,t)=>{var a,o,f=t[0],n=t[1],d=t[2],i=0;if(f.some((r=>0!==e[r]))){for(a in n)c.o(n,a)&&(c.m[a]=n[a]);if(d)var u=d(c)}for(r&&r(t);i<f.length;i++)o=f[i],c.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return c.O(u)},t=self.webpackChunkraccoon=self.webpackChunkraccoon||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.e2e12cec.js b/assets/js/runtime~main.e2e12cec.js deleted file mode 100644 index 2d6a419b..00000000 --- a/assets/js/runtime~main.e2e12cec.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";var e,t,n,r,o,f={},a={};function u(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,u),n.loaded=!0,n.exports}u.m=f,u.c=a,e=[],u.O=function(t,n,r,o){if(!n){var f=1/0;for(d=0;d<e.length;d++){n=e[d][0],r=e[d][1],o=e[d][2];for(var a=!0,i=0;i<n.length;i++)(!1&o||f>=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[i])}))?n.splice(i--,1):(a=!1,o<f&&(f=o));if(a){e.splice(d--,1);var c=r();void 0!==c&&(t=c)}}return t}o=o||0;for(var d=e.length;d>0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var f={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){f[t]=function(){return e[t]}}));return f.default=function(){return e},u.d(o,f),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return"assets/js/"+({52:"010df87a",53:"935f2afb",75:"0dffb83e",119:"caaf7770",128:"a09c2993",144:"3585ba8f",217:"d9e16301",266:"c5e4a08a",285:"1425879c",338:"fadecd94",403:"f3275a05",409:"58175526",510:"7de6ea50",514:"1be78505",641:"7ff2cdfe",643:"fc49bffc",651:"8070e160",668:"338d3fa8",729:"03be7dae",886:"8a1416ba",918:"17896441"}[e]||e)+"."+{52:"2ea3a143",53:"8601da9a",75:"0b9a3148",119:"85207c38",128:"f32be3e9",144:"2a60ee12",217:"fae6ae96",266:"7f8ec798",285:"b1efae2f",338:"40fd13e7",403:"a35654d9",409:"77dae5db",510:"7dfb24c3",514:"82e067b7",641:"60ecf897",643:"fbdb3aa2",651:"f765828c",668:"055812d0",729:"20ba7227",886:"ac09958b",918:"0e6dd5ea",972:"7d6af76f"}[e]+".js"},u.miniCssF=function(e){},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="firehose:",u.l=function(e,t,n,f){if(r[e])r[e].push(t);else{var a,i;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var b=c[d];if(b.getAttribute("src")==e||b.getAttribute("data-webpack")==o+n){a=b;break}}a||(i=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,u.nc&&a.setAttribute("nonce",u.nc),a.setAttribute("data-webpack",o+n),a.src=e),r[e]=[t];var l=function(t,n){a.onerror=a.onload=null,clearTimeout(s);var o=r[e];if(delete r[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((function(e){return e(n)})),t)return t(n)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=l.bind(null,a.onerror),a.onload=l.bind(null,a.onload),i&&document.head.appendChild(a)}},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.p="/raccoon/",u.gca=function(e){return e={17896441:"918",58175526:"409","010df87a":"52","935f2afb":"53","0dffb83e":"75",caaf7770:"119",a09c2993:"128","3585ba8f":"144",d9e16301:"217",c5e4a08a:"266","1425879c":"285",fadecd94:"338",f3275a05:"403","7de6ea50":"510","1be78505":"514","7ff2cdfe":"641",fc49bffc:"643","8070e160":"651","338d3fa8":"668","03be7dae":"729","8a1416ba":"886"}[e]||e,u.p+u.u(e)},function(){var e={303:0,532:0};u.f.j=function(t,n){var r=u.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var o=new Promise((function(n,o){r=e[t]=[n,o]}));n.push(r[2]=o);var f=u.p+u.u(t),a=new Error;u.l(f,(function(n){if(u.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),f=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+f+")",a.name="ChunkLoadError",a.type=o,a.request=f,r[1](a)}}),"chunk-"+t,t)}},u.O.j=function(t){return 0===e[t]};var t=function(t,n){var r,o,f=n[0],a=n[1],i=n[2],c=0;if(f.some((function(t){return 0!==e[t]}))){for(r in a)u.o(a,r)&&(u.m[r]=a[r]);if(i)var d=i(u)}for(t&&t(n);c<f.length;c++)o=f[c],u.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return u.O(d)},n=self.webpackChunkfirehose=self.webpackChunkfirehose||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}()}(); \ No newline at end of file diff --git a/concepts/architecture/index.html b/concepts/architecture/index.html index ebb1319b..fa4f9bf9 100644 --- a/concepts/architecture/index.html +++ b/concepts/architecture/index.html @@ -7,14 +7,14 @@ <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXX"></script> -<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-XXX",{})</script><title data-rh="true">Architecture | Raccoon - - +Architecture | Raccoon + +
-

Architecture

Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to Kafka. Raccoon supports websockets, REST and gRPC protocols for clients to send events. With wesockets it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websockets and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch (array) of events in protobuf format. Refer here for data definitions format that Raccoon accepts.

Raccoon was built with a primary purpose to source or collect user behaviour data in near-real time. User behaviour data is a stream of events that occur when users traverse through a mobile app or website. Raccoon powers analytics systems, big data pipelines and other disparate consumers by providing high volume, high throughput ingestion APIs consuming real time data. Raccoon’s key architecture principle is a realization of an event agnostic backend (accepts events of any type without the type awareness). It is this capability that enables Raccoon to evolve into a strong player in the ingestion/collector ecosystem that has real time streaming/analytical needs.

System Design

HLD

At a high level, the following sequence details the architecture.

  • Raccoon accepts events through one of the supported protocols.
  • The events are deserialized using the correct deserializer and then forwarded to the buffered channel.
  • A pool of worker go routines works off the buffered channel
  • Each worker iterates over the events' batch, determines the topic based on the type and serializes the bytes to the Kafka producer synchronously.

Note: The internals of each of the components like channel size, buffer sizes, publisher properties etc., are configurable enabling Raccoon to be provisioned according to the system/event characteristics and load.

Connections

Websockets

Raccoon supports long-running persistent WebSocket connections with the client. Once a client makes an HTTP request with a WebSocket upgrade header, raccoon upgrades the HTTP request to a WebSocket connection end of which a persistent connection is established with the client.

The following sequence outlines the connection handling by Raccoon:

  • Clients make websocket connections to Raccoon by performing a http GET API call, with headers to upgrade to websocket.
  • Raccoon uses gorilla websocket handlers and for each websocket connection the handlers spawn a goroutine to handle incoming requests.
  • After the websocket connection has been established, clients can send the events.
  • Construct connection identifier from the request header. The identifier is constructed from the value of SERVER_WEBSOCKET_CONN_ID_HEADER header. For example, Raccoon is configured with SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID. Raccoon will check the value of X-User-ID header and make it an identifier. Raccoon then uses this identifier to check if there is already an existing connection with the same identifier. If the same connection already exists, Raccoon will disconnect the connection with an appropriate error message as a response proto.
    • Optionally, you can also configure SERVER_WEBSOCKET_CONN_GROUP_HEADER to support multi-tenancy. For example, you want to use an instance of Raccoon with multiple mobile clients. You can configure raccoon with SERVER_WEBSOCKET_CONN_GROUP_HEADER=X-Mobile-Client. Then, Raccoon will use the value of X-Mobile-Client along with X-User-ID as identifier. The uniqueness becomes the combination of X-User-ID value with X-Mobile-Client value. This way, Raccoon can maintain the same X-User-ID within different X-Mobile-Client.
  • Verify if the total connections have reached the configured limit based on SERVER_WEBSOCKET_MAX_CONN configuration. On reaching the max connections, Raccoon disconnects the connection with an appropriate error message as a response proto.
  • Upgrade the connection and persist the identifier.
  • Add ping/pong handlers on this connection, read timeout deadline. More about these handlers in the following sections
  • At this point, the connection is completely upgraded and Raccoon is ready to accept SendEventRequest. The handler handles each SendEventRequest by sending it to the events-channel. The events can be published by the publisher either synchronously or asynchronous based on the configuration.
  • When the connection is closed. Raccoon clean up the connection along with the identifier. The same identifier then can be reused on the upcoming connection.

REST

Client connects to the server with the same endpoint but with POST HTTP method. As it is a rest endpoint each request is uniquely handled.

  • Connection identifier is constructed from the values of SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER header here too.

gRPC

It is recommended to generate the gRPC client for Raccoon's EventService and use that client to do gRPC request. Currently only unary requests are supported.

  • Client's SendEvent method is called to send the event.
  • Connection identifier is constructed from the values of SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER in gRPC metadata.

Clients can send the request anytime as long as the websocket connection is alive whereas with REST and gRPC requests can be sent only once.

Event Delivery Gurantee (at-least-once for most time)

The server for the most times provide at-least-once event delivery gurantee.

Event data loss happens in the following scenarios:

  • When the server shutsdown, events in-flight in the kafka buffer or those stored in the internal channels are potentially lost. The server performs, on a best-effort basis, sending all the events to kafka within a configured shutdown time WORKER_BUFFER_FLUSH_TIMEOUT_MS. The default time is set to 5000 ms within which it is expected that all the events are sent by then.

  • When the upstream kafka cluster is facing a downtime

    Every event sent from the client is stored in-memory in the buffered channels (explained in the Acknowledging events section). The workers pull the events from this channel and publishes to kafka. The server does not maintain any event peristence. This is a conscious decision to enable a simpler, performant ingestion design for the server. The buffer/retries of failed events is relied upon Kafka's internal buffer/retries respectively. In future: Server can be augmented for zero-data loss or at-least-once guarantees through intermediate event persitence.

Acknowledging events

Event acknowledgements was designed to signify if the events batch is received and sent to Kafka successfully. This will enable the clients to retry on failed event delivery. Raccoon chooses when to send event acknowledgement based on the configuration parameter EVENT_ACK.

EVENT_ACK = 0

Raccoon sends the acknowledgments as soon as it receives and deserializes the events successfully using the proto SendEventRequest. This configuration is recommended when low latency takes precedence over end to end acknowledgement. The acks are sent even before it is produced to Kafka. The following picture depicts the sequence of the event ack.

Pros:

  • Performant as it does not wait for kafka/network round trip for each batch of events.

Cons:

  • Potential data-loss and the clients do not get a chance to retry/resend the events. The possiblity of data-loss occurs when the kafka borker cluster is facing a downtime.

EVENT_ACK = 1

Raccoon sends the acknowledgments after the events are acknowledged successfully from the Kafka brokers. This configuration is recommended when reliable end-to-end acknowledgements are required. Here the underlying publisher acknowledgement is leveraged.

Pros:

  • Minimal data loss, clients can retry/resend events in case of downtime/broker failures.

Cons:

  • Increased end to end latency as clients need to wait for the event to be published.

Considering that kafka is set up in a clustered, cross-region, cross-zone environment, the chances of it going down are mostly unlikely. In case if it does, the amount of events lost is negligible considering it is a streaming system and is expected to forward millions of events/sec.

When an SendEventRequest is sent to Raccoon over any connection be it Websocket/HTTP/gRPC a corresponding response is sent by the server inidcating whether the event was consumed successfully or not.

Supported Protocols and Data formats

ProtocolData FormatVersion
WebSocketProtobufsv0.1.0
WebSocketJSONv0.1.2
REST APIJSONv0.1.2
REST APIProtobufsv0.1.2
gRPCProtobufsv0.1.2

Request and Response Models

Protobufs

When an SendEventRequest proto below containing events are sent over the wire

message SendEventRequest {
//unique guid generated by the client for this request
string req_guid = 1;
// time probably when the client sent it
google.protobuf.Timestamp sent_time = 2;
// actual events
repeated Event events = 3;
}

a corresponding SendEventResponse is sent by the server.

message SendEventResponse {
Status status = 1;
Code code = 2;
/* time when the response is generated */
int64 sent_time = 3;
/* failure reasons if any */
string reason = 4;
/* Usually detailing the success/failures */
map<string, string> data = 5;
}

JSON

When a JSON event like the one metoined below is sent a corresponding JSON response is sent by the server.

Request

{
"req_guid": "1234abcd",
"sent_time": {
"seconds": 1638154927,
"nanos": 376499000
},
"events": [
{
"eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",
"type": "booking"
}
]
}

Response

{
"status": 1,
"code": 1,
"sent_time": 1638155915,
"data": {
"req_guid": "1234abcd"
}
}

Event Distribution

Event distribution works by finding the type for each event in the batch and sending them to appropriate kafka topic. The topic name is determined by the following code

topic := fmt.Sprintf(pr.topicFormat, event.Type)

where topicformat - is the configured pattern EVENT_DISTRIBUTION_PUBLISHER_PATTERN type - is the type set by the client when the event proto is generated

For eg. setting the

EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log

and a type such as type=viewed in the event format

and a type such as type=viewed in the event format

message Event {
/*
`eventBytes` is where you put bytes serialized event.
*/
bytes eventBytes = 1;
/*
`type` denotes an event type that the producer of this proto message may set.
It is currently used by raccoon to distribute events to respective Kafka topics. However the
users of this proto can use this type to set strings which can be processed in their
ingestion systems to distribute or perform other functions.
*/
string type = 2;
}

will have the event sent to a topic like

topic-viewed-log

The event distribution does not depend on any partition logic. So events can be randomnly distrbuted to any kafka partition.

Event Deserialization

The top level wrapper SendEventRequest is deserialized which provides a list of events of type Event proto. This event wrapper composes of serialized bytes, which is the actual event, set in the field bytes inside the Event proto. Raccoon does not open this underlying bytes. The deserialization is used to unwrap the event type and determine the topic that the eventBytes (an event) need to be sent to.

Channels

Buffered Channels are used to store the incoming events' batch. The channel sizes can be configured based on the load & capacity.

Keeping connections alive

The server ensures that the connections are recyclable. It adopts mechanisms to check connection time idleness. The handlers ping clients very 30 seconds (configurable). If the client does not respond within a stipulated time the connection is marked as corrupt. Every subsequent read/write message there after on this connection fails. Raccoon removes the connections post this. Clients can also ping the server while the server responds with pongs to these pings. Clients can programmtically reconnect on failed or corrupt server connections.

Components

Kafka producer

Raccoon uses confluent go kafka as the producer client to publish events. Publishing events are light weight and relies on kafka producer's retries. Confluent internally uses librdkafka which produces events asynchronously. Application writes messages using a functional based producer API

Produce(message, deliveryChannel) -- deliveryChannel is where the delivery reports or acknowledgements are received.

Raccoon internally checks for these delivery reports before pulling the next batch of events. On failed deliveries the appropriate metrics are updated. This mechanism makes the events delivery synchronous and a reliable events delivery.

Observability Stack

Raccoon internally uses statsd go module client to export metrics in StatsD line protocol format. A recommended choice for observability stack would be to host telegraf as the receiver of these measurements and expoert it to influx, influx to store the metrics, grafana to build dashboards using Influx as the source.

- - +

Architecture

Raccoon written in GO is a high throughput, low-latency service that provides an API to ingest streaming data from mobile apps, sites and publish it to message queues. Following message queues are currently supported:

  • Apache Kafka
  • Google Cloud PubSub
  • AWS Kinesis Data Streams

Raccoon supports websocket, REST and gRPC protocols for clients to send events. With websocket it provides long persistent connections, with no overhead of additional headers sizes as in http protocol. Racoon supports protocol buffers and JSON as serialization formats. Websocket and REST API support both whereas with gRPC only protocol buffers are supported. It provides an event type agnostic API that accepts a batch (array) of events in protobuf format. Refer here for data definitions format that Raccoon accepts.

Raccoon was built with the primary purpose to source or collect user behaviour data in near-real time. User behaviour data is a stream of events that occur when users traverse through a mobile app or website. Raccoon powers analytics systems, big data pipelines and other disparate consumers by providing high volume, high throughput ingestion APIs consuming real time data. Raccoon’s key architecture principle is a realization of an event agnostic backend (accepts events of any type without the type awareness). It is this capability that enables Raccoon to evolve into a strong player in the ingestion/collector ecosystem that has real time streaming/analytical needs.

System Design

HLD

At a high level, the following sequence details the architecture.

  • Raccoon accepts events through one of the supported protocols.
  • The events are deserialized using the correct deserializer and then forwarded to the buffered channel.
  • A pool of worker go routines works off the buffered channel
  • Each worker iterates over the events' batch, determines the topic based on the type and serializes the bytes to the Producer synchronously.

Note: The internals of each of the components like channel size, buffer sizes, publisher properties etc., are configurable enabling Raccoon to be provisioned according to the system/event characteristics and load.

Connections

Websockets

Raccoon supports long-running persistent WebSocket connections with the client. Once a client makes an HTTP request with a WebSocket upgrade header, raccoon upgrades the HTTP request to a WebSocket connection end of which a persistent connection is established with the client.

The following sequence outlines the connection handling by Raccoon:

  • Clients make websocket connections to Raccoon by performing a http GET API call, with headers to upgrade to websocket.
  • Raccoon uses gorilla websocket handlers and for each websocket connection the handlers spawn a goroutine to handle incoming requests.
  • After the websocket connection has been established, clients can send the events.
  • Construct connection identifier from the request header. The identifier is constructed from the value of SERVER_WEBSOCKET_CONN_ID_HEADER header. For example, Raccoon is configured with SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID. Raccoon will check the value of X-User-ID header and make it an identifier. Raccoon then uses this identifier to check if there is already an existing connection with the same identifier. If the same connection already exists, Raccoon will disconnect the connection with an appropriate error message as a response proto.
    • Optionally, you can also configure SERVER_WEBSOCKET_CONN_GROUP_HEADER to support multi-tenancy. For example, you want to use an instance of Raccoon with multiple mobile clients. You can configure raccoon with SERVER_WEBSOCKET_CONN_GROUP_HEADER=X-Mobile-Client. Then, Raccoon will use the value of X-Mobile-Client along with X-User-ID as identifier. The uniqueness becomes the combination of X-User-ID value with X-Mobile-Client value. This way, Raccoon can maintain the same X-User-ID within different X-Mobile-Client.
  • Verify if the total connections have reached the configured limit based on SERVER_WEBSOCKET_MAX_CONN configuration. On reaching the max connections, Raccoon disconnects the connection with an appropriate error message as a response proto.
  • Upgrade the connection and persist the identifier.
  • Add ping/pong handlers on this connection, read timeout deadline. More about these handlers in the following sections
  • At this point, the connection is completely upgraded and Raccoon is ready to accept SendEventRequest. The handler handles each SendEventRequest by sending it to the events-channel. The events can be published by the publisher either synchronously or asynchronous based on the configuration.
  • When the connection is closed. Raccoon clean up the connection along with the identifier. The same identifier then can be reused on the upcoming connection.

REST

Client connects to the server with the same endpoint but with POST HTTP method. As it is a rest endpoint each request is uniquely handled.

  • Connection identifier is constructed from the values of SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER header here too.

gRPC

It is recommended to generate the gRPC client for Raccoon's EventService and use that client to do gRPC request. Currently only unary requests are supported.

  • Client's SendEvent method is called to send the event.
  • Connection identifier is constructed from the values of SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER in gRPC metadata.

Clients can send the request anytime as long as the websocket connection is alive whereas with REST and gRPC requests can be sent only once.

Event Delivery Gurantee (at-least-once for most time)

The server for the most times provide at-least-once event delivery guarantee.

Event data loss happens in the following scenarios:

  • When the server shuts down, events in-flight in the buffer or those stored in the internal channels are potentially lost. The server performs, on a best-effort basis, to send all the events within a configured shutdown timeout WORKER_BUFFER_FLUSH_TIMEOUT_MS. The default time is set to 5000 ms within which it is expected that all the events are sent by then.

  • When the downstream message queue is facing a downtime

    Every event sent from the client is stored in-memory in the buffered channels (explained in the Acknowledging events section). The workers pull the events from this channel and send it to Producer for publishing. The server does not maintain any event persistence. This is a conscious decision to enable a simpler, performant ingestion design for the server. In future: Server can be augmented for zero-data loss or at-least-once guarantees through intermediate event persistence.

Acknowledging events

Event acknowledgements was designed to signify if the events batch is received and sent successfully. This will enable the clients to retry on failed event delivery. Raccoon chooses when to send event acknowledgement based on the configuration parameter EVENT_ACK.

EVENT_ACK = 0

Raccoon sends the acknowledgments as soon as it receives and deserializes the events successfully using the proto SendEventRequest. This configuration is recommended when low latency takes precedence over end to end acknowledgement. The acks are sent even before it is produced to downstream message queue. The following picture depicts the sequence of the event ack.

Pros:

  • Performant as it does not wait for producer/network round trip for each batch of events.

Cons:

  • Potential data-loss and the clients do not get a chance to retry/resend the events. The possibility of data-loss occurs when the downstream message queue is experiencing downtime.

EVENT_ACK = 1

Raccoon sends the acknowledgments after the events are acknowledged successfully from the downstream message queue. This configuration is recommended when reliable end-to-end acknowledgements are required. Here the underlying publisher acknowledgement is leveraged.

Pros:

  • Minimal data loss, clients can retry/resend events in case of downtime/broker failures.

Cons:

  • Increased end to end latency as clients need to wait for the event to be published.

Considering that kafka is set up in a clustered, cross-region, cross-zone environment, the chances of it going down are unlikely. In case if it does, the amount of events lost is negligible considering it is a streaming system and is expected to forward millions of events/sec.

PubSub and Kinesis offer strong SLAs (>=99.95% and >=99.9%) so they are least likey to be unavailable. However, you may hit rate limits for these services, so we advise that you provision your infrastructure sufficiently to avoid it. In case a rate-limit is hit, Raccoon will report the message as undelivered.

When an SendEventRequest is sent to Raccoon over any connection be it Websocket/HTTP/gRPC a corresponding response is sent by the server indicating whether the event was consumed successfully or not.

Supported Protocols and Data formats

ProtocolData FormatVersion
WebSocketProtobufsv0.1.0
WebSocketJSONv0.1.2
REST APIJSONv0.1.2
REST APIProtobufsv0.1.2
gRPCProtobufsv0.1.2

Request and Response Models

Protobufs

When an SendEventRequest proto below containing events are sent over the wire

message SendEventRequest {
//unique guid generated by the client for this request
string req_guid = 1;
// time probably when the client sent it
google.protobuf.Timestamp sent_time = 2;
// actual events
repeated Event events = 3;
}

a corresponding SendEventResponse is sent by the server.

message SendEventResponse {
Status status = 1;
Code code = 2;
/* time when the response is generated */
int64 sent_time = 3;
/* failure reasons if any */
string reason = 4;
/* Usually detailing the success/failures */
map<string, string> data = 5;
}

JSON

When a JSON event like the one mentioned below is sent a corresponding JSON response is sent by the server.

Request

{
"req_guid": "1234abcd",
"sent_time": {
"seconds": 1638154927,
"nanos": 376499000
},
"events": [
{
"eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",
"type": "booking"
}
]
}

Response

{
"status": 1,
"code": 1,
"sent_time": 1638155915,
"data": {
"req_guid": "1234abcd"
}
}

Event Distribution

Event distribution works by finding the type for each event in the batch and sending them to appropriate message queue topic. The topic name is determined by the following code

topic := strings.Replace(p.topicFormat, "%s", event.Type, 1)

where:

  • topicFormat - is the pattern configured via EVENT_DISTRIBUTION_PUBLISHER_PATTERN
  • type - is the type set by the client on the Event

For eg. setting the

EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log

and a type such as type=viewed in the event format

message Event {
/*
`eventBytes` is where you put bytes serialized event.
*/
bytes eventBytes = 1;
/*
`type` denotes an event type that the producer of this proto message may set.
It is currently used by raccoon to distribute events to respective message queue topics. However the
users of this proto can use this type to set strings which can be processed in their
ingestion systems to distribute or perform other functions.
*/
string type = 2;
}

will have the event sent to a topic like

topic-viewed-log

The event distribution does not depend on any partition logic. So events can be randomly distributed to any available partition.

Event Deserialization

The top level wrapper SendEventRequest is deserialized which provides a list of events of type Event proto. This event wrapper composes of serialized bytes, which is the actual event, set in the field bytes inside the Event proto. Raccoon does not open this underlying bytes. The deserialization is used to unwrap the event type and determine the topic that the eventBytes (an event) need to be sent to.

Channels

Buffered Channels are used to store the incoming events' batch. The channel sizes can be configured based on the load & capacity.

Keeping connections alive

The server ensures that the connections are recyclable. It adopts mechanisms to check connection time idleness. The handlers ping clients very 30 seconds (configurable). If the client does not respond within a stipulated time the connection is marked as corrupt. Every subsequent read/write message there after on this connection fails. Raccoon removes the connections post this. Clients can also ping the server while the server responds with pongs to these pings. Clients can programmatically reconnect on failed or corrupt server connections.

Components

Producer

Raccoon supports a number of destination event storage systems. Following is a list of currently supported systems, along with their status.

NameVersionStatus
Apache Kafkav0.1.0STABLE
Google Cloud PubSubv0.2.3ALPHA
AWS Kinesis Data Streamsv0.2.5ALPHA

Apache Kafka

Raccoon uses confluent go kafka as the producer client to publish events. Publishing events are light weight and relies on kafka producer's retries. Confluent internally uses librdkafka which produces events asynchronously. Application writes messages using a functional based producer API

Produce(message, deliveryChannel) -- deliveryChannel is where the delivery reports or acknowledgements are received.

Raccoon internally checks for these delivery reports before pulling the next batch of events. On failed deliveries the appropriate metrics are updated. This mechanism makes the events delivery synchronous and a reliable events delivery.

Google Cloud PubSub

Raccoon uses cloud.google.com/go/pubsub as the producer client for publishing events to Google Cloud PubSub.

The Google Cloud PubSub SDK internally buffers messages in batches before sending them downstream. You can control this buffering behaviour by tuning the following env variables:

The defaults for these settings are optimal for near-realtime uses cases.

AWS Kinesis Data Streams

Raccoon uses github.com/aws/aws-sdk-go-v2/service/kinesis as the producer client for publishing events to AWS Kinesis.

In particular, kinesis.PutRecord() is used for sending messages downstream. This means that the messages are sent immediately without any buffering at the SDK level. Each message is given a random partition key (using rand.Int31()) so that messages are evenly distributed amongst available shards.

In the future, Raccoon may support a more robust partition selection mechanism that has stronger distribution guarantees.

Observability Stack

Raccoon supports StatsD and Prometheus as telemetry systems.

StatD

A recommended choice for observability stack would be to host telegraf as the receiver of these measurements and export it to influx database for storage, grafana to build dashboards using Influx as the source.

Prometheus

Prometheus operates on a pull model and comes with it's own time-series database. You don't need any additional components apart from the prometheus to start collecting and storing metrics. Grafana can be used to build dashboards using Prometheus as a data source.

+ + \ No newline at end of file diff --git a/concepts/structure/index.html b/concepts/structure/index.html index 169392cb..6138f5f8 100644 --- a/concepts/structure/index.html +++ b/concepts/structure/index.html @@ -7,14 +7,15 @@ -Structure | Raccoon - - +Structure | Raccoon + +
-

Structure

This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon.

Highlevel View

The core structure of Raccoon is the server itself. After the server is started, data flows from websocket to worker to publisher. websocket manages websocket server, handle incoming connection, and incoming request. worker acts as a buffer and interface for various types of server and publisher down the roadmap. publisher contains logic to publish the events to the downstream pipeline. high-level All the components above are initialized on app. app package is the starting point of Raccoon.

Code Map

This section talks briefly about the content of various important packages. You can use this to guess the code location when you need to make changes.

http

Contains all the http related code including code related to websocket, rest and grpc. It also has code pertaining to the http server that serves both WebSocket and REST APIs.

http/websocket

Contains server-related code along with request/response handlers and connection management.

http/rest

Contains server-side code along with resquest/response handler for the REST endpoint.

http/gRPC

Contains server-side handlers for gRPC server.

worker

Buffer from when the events are processed and before events are published. This will also act as interface that connects server and publisher when in the future. Currently, worker is tightly coupled with websocket server and kafka publisher.

publisher

Does the actual publishing to the downstream pipeline. Currently, only support Kafka publisher.

app

The starting point of Raccoon. It initializes server, worker, publisher, and other components that require initialization like a metric reporter.

config

Load and store application configurations. Contains mapping of environment configuration with configuration on the code.

serialization

Contains the common serialization code for both JSON and Protobufs along with common interface.

deserialization

Contains the common deserialization code along with common interface.

identification

Contains the code for connection identification.

Code Generation

Request, Response, and Events Proto

Raccoon depends on Proton repository. Proton is a repository to store all Raystack Protobuf files. Code to serde the request and response are generated using Protobuf. You can check how the code is generated on Makefile.

- - +

Structure

This document describes high-level code structure of the project. You'll find this part useful when you want to get started to contribute to Raccoon.

High level View

The core structure of Raccoon is the server itself. After the server is started, data flows from websocket to worker to publisher. websocket manages websocket server, handle incoming connection, and incoming request. worker acts as a buffer and interface for various types of server and publisher down the roadmap. publisher contains logic to publish the events to the downstream pipeline. high-level All the components above are initialized on app. app package is the starting point of Raccoon.

Code Map

This section talks briefly about the content of various important packages. You can use this to guess the code location when you need to make changes.

service

Contains all backend related code including code related to websocket, rest and grpc. It also has code pertaining to the http server that serves both WebSocket and REST APIs.

service/rest

Contains server-side code along with request/response handler for the REST endpoint.

service/rest/websocket

Contains server-related code along with request/response handlers and connection management.

service/gRPC

Contains server-side handlers for gRPC server.

worker

Buffer from when the events are processed and before events are published. This will also act as interface that connects server and publisher.

publisher

Does the actual publishing to the downstream message queue. +Currently Supports:

  • Apache Kafka
  • Google Cloud Pub/Sub
  • Amazon Web Services Kinesis

app

The starting point of Raccoon. It initializes server, worker, publisher, and other components that require initialization like a metric reporter.

config

Load and store application configurations. Contains mapping of environment configuration with configuration on the code.

serialization

Contains the common serialization code for both JSON and protobuf along with common interface.

deserialization

Contains the common deserialization code along with common interface.

identification

Contains the code for connection identification.

Code Generation

Request, Response, and Events Proto

Raccoon depends on Proton repository. Proton is a repository to store all Raystack Protobuf files. Code to serde the request and response are generated using Protobuf. You can check how the code is generated on Makefile.

+ + \ No newline at end of file diff --git a/contribute/contribution/index.html b/contribute/contribution/index.html index e9f273b2..3205b9f9 100644 --- a/contribute/contribution/index.html +++ b/contribute/contribution/index.html @@ -7,14 +7,14 @@ -Contribution Process | Raccoon - - +Contribution Process | Raccoon + +
-

Contribution Process

The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:

  • Concepts section will explain you about Raccoon architecture,
  • Our roadmap is the 10k foot view of how we envision Raccoon to evolve
  • Github issues track the ongoing and reported issues.

How can I contribute?

We use RFCS and GitHub issues to communicate ideas.

  • You can report a bug or suggest a feature enhancement or can just ask questions. Reach out on Github discussions for this purpose.
  • You are also welcome to add new features, improve monitoring,logging and code quality.
  • You can help with documenting new features or improve existing documentation.
  • You can also review and accept other contributions if you are a maintainer.

Please submit a PR to the master branch of the Raccoon repository once you are ready to submit your contribution. Code submission to Raccoon, including submission from project maintainers, require review and approval from maintainers or code owners. PRs that are submitted by the general public need to pass the build. Once build is passed community members will help to review the pull request.

Becoming a maintainer

We are always interested in adding new maintainers. What we look for is a series of contributions, good taste, and an ongoing interest in the project.

  • maintainers will have write access to the Raccoon repositories.
  • There is no strict protocol for becoming a maintainer or PMC member. Candidates for new maintainers are typically people that are active contributors and community members.
  • Candidates for new maintainers can also be suggested by current maintainers or PMC members.
  • If you would like to become a maintainer, you should start contributing to Raccoon in any of the ways mentioned. You might also want to talk to other maintainers and ask for their advice and guidance.

Guidelines

Please follow these practices for you change to get merged fast and smoothly:

  • Contributions can only be accepted if they contain appropriate testing (Unit and Integration Tests.)
  • If you are introducing a completely new feature or making any major changes in an existing one, we recommend to start with an RFC and get consensus on the basic design first.
  • Make sure your local build is running with all the tests and golint checks passing.
  • Docs live in the code repo under docs so that changes to that can be done in the same PR as changes to the code.
- - +

Contribution Process

The following is a set of guidelines for contributing to Raccoon. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. Here are some important resources:

  • Concepts section will explain you about Raccoon architecture,
  • Our roadmap is the 10k foot view of how we envision Raccoon to evolve
  • Github issues track the ongoing and reported issues.

How can I contribute?

We use RFCS and GitHub issues to communicate ideas.

  • You can report a bug or suggest a feature enhancement or can just ask questions. Reach out on Github discussions for this purpose.
  • You are also welcome to add new features, improve monitoring,logging and code quality.
  • You can help with documenting new features or improve existing documentation.
  • You can also review and accept other contributions if you are a maintainer.

Please submit a PR to the master branch of the Raccoon repository once you are ready to submit your contribution. Code submission to Raccoon, including submission from project maintainers, require review and approval from maintainers or code owners. PRs that are submitted by the general public need to pass the build. Once build is passed community members will help to review the pull request.

Becoming a maintainer

We are always interested in adding new maintainers. What we look for is a series of contributions, good taste, and an ongoing interest in the project.

  • maintainers will have write access to the Raccoon repositories.
  • There is no strict protocol for becoming a maintainer or PMC member. Candidates for new maintainers are typically people that are active contributors and community members.
  • Candidates for new maintainers can also be suggested by current maintainers or PMC members.
  • If you would like to become a maintainer, you should start contributing to Raccoon in any of the ways mentioned. You might also want to talk to other maintainers and ask for their advice and guidance.

Guidelines

Please follow these practices for you change to get merged fast and smoothly:

  • Contributions can only be accepted if they contain appropriate testing (Unit and Integration Tests.)
  • If you are introducing a completely new feature or making any major changes in an existing one, we recommend to start with an RFC and get consensus on the basic design first.
  • Make sure your local build is running with all the tests and golint checks passing.
  • Docs live in the code repo under docs so that changes to that can be done in the same PR as changes to the code.
+ + \ No newline at end of file diff --git a/contribute/development/index.html b/contribute/development/index.html index c57bb1f6..73a68701 100644 --- a/contribute/development/index.html +++ b/contribute/development/index.html @@ -7,14 +7,14 @@ -Development Guide | Raccoon - - +Development Guide | Raccoon + +
-

Development Guide

This guide is targeted at developers looking to contribute to Raccoon.

Making a Pull Request

Incorporating upstream changes from main

Our preference is the use of git rebase instead of git merge : git pull -r

Signing commits

Commits have to be signed before they are allowed to be merged into the codebase:

# Include -s flag to signoff
git commit -s -m "My first commit"

Good practices to keep in mind

  • Follow conventional commits while composing our commit messages.
  • Add WIP: to PR name if more work needs to be done prior to review
  • Avoid force-pushing as it makes reviewing difficult

Managing CI-test failures

  • GitHub runner tests
    • Click checks tab to analyse failed tests
- - +

Development Guide

This guide is targeted at developers looking to contribute to Raccoon.

Making a Pull Request

Incorporating upstream changes from main

Our preference is the use of git rebase instead of git merge : git pull -r

Signing commits

Commits have to be signed before they are allowed to be merged into the codebase:

# Include -s flag to sign off
git commit -s -m "My first commit"

Good practices to keep in mind

  • Follow conventional commits while composing our commit messages.
  • Add WIP: to PR name if more work needs to be done prior to review
  • Avoid force-pushing as it makes reviewing difficult

Managing CI-test failures

  • GitHub runner tests
    • Click checks tab to analyse failed tests
+ + \ No newline at end of file diff --git a/contribute/release/index.html b/contribute/release/index.html index 9f282886..aeb075d3 100644 --- a/contribute/release/index.html +++ b/contribute/release/index.html @@ -7,14 +7,14 @@ -Release Process | Raccoon - - +Release Process | Raccoon + +
-

Release Process

For maintainers, please read the sections below as a guide to create a new release.

Create A New Release

Please follow these steps to create a new release:

  • Update version.txt file

  • Generate changelog from commits by using conventional-changelog-cli

    $ conventional-changelog -p conventionalcommits -o CHANGELOG.md
  • Commit version.txt and CHANGELOG.md together and mark the commit with the release tag. Make sure the release tag and version.txt are the same.

    $ git add version.txt CHANGELOG.md
    $ git commit -m "docs: update changelog and version for vM.m.p"
    $ git tag vM.m.p
  • Push the commit and the tag. Release action will trigger to publish docker image and create GitHub release.

Important Notes

  • Raccoon release tags follow SEMVER convention.

  • Github workflow is used to build and push the built docker image to Docker hub.

  • A release is triggered when a github tag of format vM.m.p is pushed. After the release job is succeeded, a docker image of

    format M.m.p is pushed to docker hub.

  • Release tags should only point to main branch

- - +

Release Process

For maintainers, please read the sections below as a guide to create a new release.

Create A New Release

Please follow these steps to create a new release:

  • create a new tag of the form vM.m.p, where:
    • M = Major version, indicates there are breaking changes from the last Major version.
    • m = Minor version, indicates there are backward-compatible changes.
    • p = Patch version, indicates there are backward-compatible bug-fixes.

For example:

$ git tag v1.2.0
  • push the tags to trigger a release.
$ git push --tags

Raccoon uses Goreleaser under the hood for release management. Each release pushes:

Additionally, the Github release will also contain with pre-built binaries for:

  • linux
  • darwin (macOS)
  • windows

Important Notes

  • Raccoon release tags follow SEMVER convention.
  • Github workflow is used to build and push the built docker image to Docker hub.
  • A release is triggered when a github tag of format vM.m.p is pushed.
  • Release tags should only point to main branch
+ + \ No newline at end of file diff --git a/guides/deployment/index.html b/guides/deployment/index.html index 9d22e25d..dc7c7a91 100644 --- a/guides/deployment/index.html +++ b/guides/deployment/index.html @@ -7,14 +7,15 @@ -Deployment | Raccoon - - +Deployment | Raccoon + +
-

Deployment

This section contains guides and suggestions related to Raccoon deployment.

Kubernetes

Using Raccoon docker image, you can deploy Raccoon on Kubernetes by specifying the image on the manifest. We also provide Helm chart to ease Kubernetes deployment. In this section we will cover simple deployment on Kubernetes using manifest and Helm.

Manifest

Prerequisite

  • Kubernetes cluster setup
  • Kubectl installed

Creating Kubernetes Resources You need at least 2 manifests for Raccoon. For deployment and for configmap. Prepare both manifest as YAML file. You can fill in the configuration as needed.

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: raccoon-config
namespace: default
labels:
application: raccoon
data:
METRIC_STATSD_ADDRESS: "host.docker.internal:8125"
PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "host.docker.internal:9093"
SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"
SERVER_WEBSOCKET_PORT: "8080"

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: raccoon
labels:
application: raccoon
spec:
replicas: 1
selector:
matchLabels:
application: raccoon
template:
metadata:
labels:
application: raccoon
spec:
containers:
- name: raccoon
image: "raystack/raccoon:latest"
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 200m
memory: 512Mi
requests:
cpu: 200m
memory: 512Mi
envFrom:
- configMapRef:
name: raccoon-config
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumes:

Suppose you save them as configmap.yaml and deployment.yaml. The next step is to apply the manifests to the Kubeenetes cluster using kubectl command.

$ kubectl apply -f configmap.yaml -f deployment.yaml

You'll find the resources are created. To see the status of the deployment, you can run following commands.

# Check deployment status
$ kubectl get deployment raccoon
# Check configmap status
$ kubectl get configmap raccoon-config

Configuration You can add or modify the configurations inside configmap.yaml above. However, when you change the configmap, you also need to restart the deployment.

Exposing Raccoon To make Raccoon accessible to the public, you need to setup the Kubernetes service and ingress. This setup may vary according to your need. There is plenty ingress controller you can choose. But first, you need to make sure that Websocket works with your choice of ingress controller.

Integrating With Telegraf There are 2 options to integrate with Telegraf. One is to have Telegraf as separate service another is to have Telegraf as a sidecar. To have telegraf as a sidecar, you only need to add another configmap and another Telegraf container on the deployment above. You can add the container under spec.template.spec.containers. Then, you can use default METRIC_STATSD_ADDRESS which is :8125. Following is an example of Telegraf manifests that push to Influxdb.

deployment.yaml


---
containers:
- image: telegraf:1.7.4-alpine
imagePullPolicy: IfNotPresent
name: telegrafd
resources:
limits:
cpu: 50m
memory: 64Mi
requests:
cpu: 50m
memory: 64Mi
volumeMounts:
- mountPath: /etc/telegraf
name: telegraf-conf
volumes:
- configMap:
defaultMode: 420
name: test-raccoon-telegraf-config
name: telegraf-conf

telegraf-conf.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: telegraf-conf
namespace: default
data:
telegraf.conf: |
[global_tags]
app = "test-raccoon"
[agent]
collection_jitter = "0s"
debug = false
flush_interval = "10s"
flush_jitter = "0s"
interval = "10s"
logfile = ""
metric_batch_size = 1000
metric_buffer_limit = 10000
omit_hostname = false
precision = ""
quiet = false
round_interval = true
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "test-db"
retention_policy = "autogen"
write_consistency = "any"
timeout = "5s"
[[inputs.statsd]]
allowed_pending_messages = 10000
delete_counters = true
delete_gauges = true
delete_sets = true
delete_timings = true
metric_separator = "."
parse_data_dog_tags = true
percentile_limit = 1000
percentiles = [
50,
95,
99
]
service_address = ":8125"

Helm

Prerequisite

  • Kubernetes cluster setup
  • Helm installed

Raccoon has a Helm chart maintained on different repository. Refer to the repository for a complete deployment guide.

Production Checklist

Before going to production, we recommend the following setup tips.

Key Configurations

Followings are main configurations closely related to deployment that you need to pay attention:

  • SERVER_WEBSOCKET_PORT

  • EVENT_DISTRIBUTION_PUBLISHER_PATTERN

  • PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS

  • METRIC_STATSD_ADDRESS

  • SERVER_WEBSOCKET_CONN_ID_HEADER

    TLS/HTTPS

    Raccoon doesn't provide HTTPS on the application level. To enable HTTPS, you can maintain API gateway which terminates SSL connection. From API gateway onward, the connection is considered to be safe. For example, if you are deploying on Kubernetes, you can have an ingress setup and have SSL termination.

    Authentication

    Raccoon doesn't provide authentication on its own. However, you can still enable authentication by having it as a separate service. Then, you can use an API gateway to validate the authentication using a token.

    Test The Setup

    To make sure the deployment can handle the load, you need to test it with the same number of connections and request you are expecting. You can find a guide on how to publish events here. You can also check example client here. If there is something wrong with Raccon, you can check the troubleshooting section.

- - +

Deployment

This section contains guides and suggestions related to Raccoon deployment.

Kubernetes

Using Raccoon docker image, you can deploy Raccoon on Kubernetes by specifying the image on the manifest. We also provide Helm chart to ease Kubernetes deployment. In this section we will cover simple deployment on Kubernetes using manifest and Helm.

Manifest

Prerequisite

  • Kubernetes cluster setup
  • Kubectl installed

Creating Kubernetes Resources You need at least 2 manifests for Raccoon. For deployment and for configmap. Prepare both manifest as YAML file. You can fill in the configuration as needed.

configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: raccoon-config
namespace: default
labels:
application: raccoon
data:
PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "host.docker.internal:9093"
SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"
SERVER_WEBSOCKET_PORT: "8080"

# depending on what monitoring stack you wish to use
# you can remove the statsd or prometheus config below
METRIC_STATSD_ENABLED: true
METRIC_STATSD_ADDRESS: "host.docker.internal:8125"
METRIC_PROMETHEUS_ENABLED: true
METRIC_PROMETHEUS_PORT: "9090"

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: raccoon
labels:
application: raccoon
spec:
replicas: 1
selector:
matchLabels:
application: raccoon
template:
metadata:
labels:
application: raccoon
annotations:
# these are only necessary if you plan to use prometheus
# to collect metrics from raccoon. See "Setting up monitoring" below
# for more information.
prometheus.io/scrape: 'true'
prometheus.io/path: 'metrics'
prometheus.io/port: '9090'
spec:
containers:
- name: raccoon
image: "raystack/raccoon:latest"
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 200m
memory: 512Mi
requests:
cpu: 200m
memory: 512Mi
envFrom:
- configMapRef:
name: raccoon-config
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName

Suppose you save them as configmap.yaml and deployment.yaml. The next step is to apply the manifests to the Kubernetes cluster using kubectl command.

$ kubectl apply -f configmap.yaml -f deployment.yaml

You'll find the resources are created. To see the status of the deployment, you can run following commands.

# Check deployment status
$ kubectl get deployment raccoon
# Check configmap status
$ kubectl get configmap raccoon-config

Configuration You can add or modify the configurations inside configmap.yaml above. However, when you change the configmap, you also need to restart the deployment.

Exposing Raccoon To make Raccoon accessible to the public, you need to setup the Kubernetes service and ingress. This setup may vary according to your need. There is plenty ingress controller you can choose. But first, you need to make sure that Websocket works with your choice of ingress controller.

Setting up monitoring

Raccoon supports statsd and prometheus as monitoring backends. The following section will guide on how to setup each of these.

The recommended way of interfacing with statsd is to use telegraf. +telegraf is the open source server agent to help you collect metrics from your applications and push them to different data sources.

There are 2 options to integrate with Telegraf. One is to have Telegraf as a separate service and another is to have Telegraf as a sidecar. To have telegraf as a sidecar, you only need to add another configmap and another Telegraf container on the deployment above. You can add the container under spec.template.spec.containers. Then, you can use default METRIC_STATSD_ADDRESS which is :8125. Following is an example of Telegraf manifests that push to Influxdb.

deployment.yaml

---
containers:
- image: telegraf:1.7.4-alpine
imagePullPolicy: IfNotPresent
name: telegrafd
resources:
limits:
cpu: 50m
memory: 64Mi
requests:
cpu: 50m
memory: 64Mi
volumeMounts:
- mountPath: /etc/telegraf
name: telegraf-conf
volumes:
- configMap:
defaultMode: 420
name: test-raccoon-telegraf-config
name: telegraf-conf
telegraf-conf.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: telegraf-conf
namespace: default
data:
telegraf.conf: |
[global_tags]
app = "test-raccoon"
[agent]
collection_jitter = "0s"
debug = false
flush_interval = "10s"
flush_jitter = "0s"
interval = "10s"
logfile = ""
metric_batch_size = 1000
metric_buffer_limit = 10000
omit_hostname = false
precision = ""
quiet = false
round_interval = true
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "test-db"
retention_policy = "autogen"
write_consistency = "any"
timeout = "5s"
[[inputs.statsd]]
allowed_pending_messages = 10000
delete_counters = true
delete_gauges = true
delete_sets = true
delete_timings = true
metric_separator = "."
parse_data_dog_tags = true
percentile_limit = 1000
percentiles = [
50,
95,
99
]
service_address = ":8125"

Helm

Prerequisite

  • Kubernetes cluster setup
  • Helm installed

Raccoon has a Helm chart maintained on different repository. Refer to the repository for a complete deployment guide.

Production Checklist

Before going to production, we recommend the following setup tips.

Key Configurations

Followings are main configurations closely related to deployment that you need to pay attention:

  • SERVER_WEBSOCKET_PORT

  • EVENT_DISTRIBUTION_PUBLISHER_PATTERN

  • PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS

  • METRIC_STATSD_ADDRESS

  • SERVER_WEBSOCKET_CONN_ID_HEADER

    TLS/HTTPS

    Raccoon doesn't provide HTTPS on the application level. To enable HTTPS, you can maintain API gateway which terminates SSL connection. From API gateway onward, the connection is considered to be safe. For example, if you are deploying on Kubernetes, you can have an ingress setup and have SSL termination.

    Authentication

    Raccoon doesn't provide authentication on its own. However, you can still enable authentication by having it as a separate service. Then, you can use an API gateway to validate the authentication using a token.

    Test The Setup

    To make sure the deployment can handle the load, you need to test it with the same number of connections and request you are expecting. You can find a guide on how to publish events here. You can also check client example here. If there is something wrong with Raccoon, you can check the troubleshooting section.

+ + \ No newline at end of file diff --git a/guides/monitoring/index.html b/guides/monitoring/index.html index ff3f7493..ee40f5cb 100644 --- a/guides/monitoring/index.html +++ b/guides/monitoring/index.html @@ -7,14 +7,15 @@ -Monitoring | Raccoon - - +Monitoring | Raccoon + +
-

Monitoring

Raccoon provides monitoring for server connection, Kafka publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd protocol.

How To Setup

TL;DR
- Run Statsd supported metric collector
- Configure `METRIC_STATSD_ADDRESS` on Raccoon to send to the metric collector
- Visualize and create alerting from the collected metrics

Generally, you can follow the steps above and use any metric collector that supports statsd like Telegraf or Datadog.

This section will cover a setup example using Telegraf, Influx, Kapacitor, and Grafana stack based on the steps above.

Run Statsd Supported Metric Collector To enable statsd on Telegraf you need to enable statsd input on telegraf.conf file. Following are default configurations that you can add based on statsd input readme.

[[inputs.statsd]]
protocol = "udp"
max_tcp_connections = 250
tcp_keep_alive = false
service_address = ":8125"

delete_gauges = true
delete_counters = true
delete_sets = true
delete_timings = true

percentiles = [50.0, 90.0, 99.0, 99.9, 99.95, 100.0]

metric_separator = "_"

parse_data_dog_tags = false
datadog_extensions = false
datadog_distributions = false

allowed_pending_messages = 10000
percentile_limit = 1000

[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"]
database = "raccoon"
retention_policy = "autogen"
write_consistency = "any"
timeout = "5s"

Configure Raccoon To Send To The Metric Collector After you have the collector with the port configured, you need to set METRIC_STATSD_ADDRESS to match the metric collector address. Suppose you deploy the telegraf using the default configuration above as sidecar or in localhost, you need to set the value to :8125.

Visualize And Create Alerting From The Collected Metrics Now that you have Raccoon and Telegraf as metric collector set, next is to use the metrics reported. You may notice that the Telegraf config above contains outputs.influxdb. That config will send the metric received to Influxdb. Make sure you have influx service accessible from the configured URL. You can visualize the metrics using Grafana. To do that, you need to add influx datasource to make the data available on Grafana. After that, you can use the data to You can visualize the metrics using Grafana. To do that, you need to add influx datasource to make the data available on Grafana. After that, you can use the data to make dashboard.

Metrics Usages

Following are key monitoring statistics that you can infer from Raccoon metrics. Refer to this section to understand how to build alerting, dashboard, or analyze the metrics.

Data Loss

To infer data loss, you can count kafka_messages_delivered_total with tag success=false. You can also infer the loss rate by calculating the following.

count(kafka_messages_delivered_total success=false)/count(kafka_messages_delivered_total)

Latency

Raccoon provides fine-grained metrics that denote latency. That gives clues as to where to look in case something goes wrong. In summary, these are key metrics for latency:

- - +

Monitoring

Raccoon provides monitoring for server connection, publisher, resource usage, and event delivery. Reference for available metrics is available here. The metrics are reported using Statsd and Prometheus

How To Setup

TL;DR
- Run Statsd supported metric collector
- Configure `METRIC_STATSD_ADDRESS` on Raccoon to send to the metric collector
- Visualize and create alerting from the collected metrics

Generally, you can follow the steps above and use any metric collector that supports statsd like Telegraf or Datadog.

This section will cover a setup example using Telegraf, Influx, Kapacitor, and Grafana stack based on the steps above.

Run Statsd Supported Metric Collector To enable statsd on Telegraf you need to enable statsd input on telegraf.conf file. Following are default configurations that you can add based on statsd input readme.

[[inputs.statsd]]
protocol = "udp"
max_tcp_connections = 250
tcp_keep_alive = false
service_address = ":8125"

delete_gauges = true
delete_counters = true
delete_sets = true
delete_timings = true

percentiles = [50.0, 90.0, 99.0, 99.9, 99.95, 100.0]

metric_separator = "_"

parse_data_dog_tags = false
datadog_extensions = false
datadog_distributions = false

allowed_pending_messages = 10000
percentile_limit = 1000

[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"]
database = "raccoon"
retention_policy = "autogen"
write_consistency = "any"
timeout = "5s"

Configure Raccoon To Send To The Metric Collector After you have the collector with the port configured, you need to set METRIC_STATSD_ADDRESS to match the metric collector address. Suppose you deploy the telegraf using the default configuration above as sidecar or in localhost, you need to set the value to :8125.

Visualize And Create Alerting From The Collected Metrics Now that you have Raccoon and Telegraf as metric collector set, next is to use the metrics reported. You may notice that the Telegraf config above contains outputs.influxdb. That config will send the metric received to Influxdb. Make sure you have influx service accessible from the configured URL. You can visualize the metrics using Grafana. To do that, you need to add influx datasource to make the data available on Grafana. After that, you can use the data to You can visualize the metrics using Grafana.

Metrics Usages

Following are key monitoring statistics that you can infer from Raccoon metrics. Refer to this section to understand how to build alerting, dashboard, or analyze the metrics.

Data Loss

To infer data loss, you can count kafka_messages_delivered_total with tag success=false. You can also infer the loss rate by calculating the following.

count(kafka_messages_delivered_total success=false)/count(kafka_messages_delivered_total)

For other publishers, just replace kafka in the metric name with the name of the publisher. For instance, analogs of kafka_messages_delivered_total for PubSub and Kinesis would be:

Latency

Raccoon provides fine-grained metrics that denote latency. That gives clues as to where to look in case something goes wrong. In summary, these are key metrics for latency:

+ + \ No newline at end of file diff --git a/guides/overview/index.html b/guides/overview/index.html index 68fcab36..e47e8d32 100644 --- a/guides/overview/index.html +++ b/guides/overview/index.html @@ -7,14 +7,14 @@ -Overview | Raccoon - - +Overview | Raccoon + +
-

Overview

The following topics will describe how to manage Raccoon throughout its lifecycle.

Publishing Events

Raccoon is designed to handle any type of event. This section contains step by step guide on how to publish events to Raccoon through the API interface.

{% page-ref page="publishing.md" %}

Deploying Raccoon

Raccoon can run inside VMs or containers in a fully managed runtime environment like Kubernetes. This section contains guides, best practices, and advice related to deploying Raccoon in production.

{% page-ref page="deployment.md" %}

Monitoring Raccoon with exposed metrics

Always know what’s going on with your deployment with built-in monitoring of throughput, response times, errors and more. This section contains guides, best practices, and advice related to managing Raccoon in production.

{% page-ref page="monitoring.md" %}

Troubleshooting Raccoon

Raccoon scales in an instant, both vertically and horizontally for high-performance event ingestion. This section contains guides, best practices, and advice related to troubleshooting issues with Raccoon in production.

{% page-ref page="troubleshooting.md" %}

- - +

Overview

The following topics will describe how to manage Raccoon throughout its lifecycle.

Publishing Events

Raccoon is designed to handle any type of event. This section contains step by step guide on how to publish events to Raccoon through the API interface.

Deploying Raccoon

Raccoon can run inside VMs or containers in a fully managed runtime environment like Kubernetes. This section contains guides, best practices, and advice related to deploying Raccoon in production.

Monitoring Raccoon with exposed metrics

Always know what’s going on with your deployment with built-in monitoring of throughput, response times, errors and more. This section contains guides, best practices, and advice related to managing Raccoon in production.

Troubleshooting Raccoon

Raccoon scales in an instant, both vertically and horizontally for high-performance event ingestion. This section contains guides, best practices, and advice related to troubleshooting issues with Raccoon in production.

+ + \ No newline at end of file diff --git a/guides/publishing/index.html b/guides/publishing/index.html index 9f731742..4a951fde 100644 --- a/guides/publishing/index.html +++ b/guides/publishing/index.html @@ -7,14 +7,14 @@ -Publishing Events | Raccoon - - +Publishing Events | Raccoon + +
-

Publishing Events

EndPoints

Raccoon can be hosted behind a proxy/API GW, a sample of blocks as below.

The HTTP API path which accepts events is:

/api/v1/events

This path can be used for sending events by either connecting via websocket connection or as a normal REST API Request.

HTTP methods used for Endpoints are:

  • Websocket - GET
  • REST - POST

Authorization/Authentication

Raccoon does not provide features to perform any authorization or authentication of the user/client initiating the connection. It accepts connections as trusted (and assumes any such auth is already performed)

HTTP backend

SSL termination is outside the scope of Raccoon, and the service API accepts HTTP connections assuming that the SSL is terminated at a proxy or ELB before reaching Raccoon.

gRPC backend

Similar to HTTP SSL termination is outside the scope of Raccoon, and the service API accepts connections assuming SSL is terminated at a proxy or ELB before reaching Raccoon.

Data Formatters

Raccoon supports Protos and JSON as the primary data formatters. Protobufs can be used to send event via websockets, REST or gRPC whereas JSON is supported only for websocket and REST endpoint.

With a websocket connection the content type is identified based on the mesage type. If the message type is binary it is assumed that the formatting is protobufs and if the message type is text then formatting is assumed to be JSON.

Protos

Raccoon accepts an SendEventRequest proto that wraps multiple Event proto. This enables clients to send an event in real-time or multiple events in batches.

Refer to raccoon.proto for how you can build the request.

message SendEventRequest {
string req_guid = 1;
google.protobuf.Timestamp sent_time = 2;
repeated Event events = 3;
}

Where req_guid - A globally unique ID generated by the client denoting this request as unique sent_time - This is when the event is sent over the WebSocket in protobuf timestamp format. This time is used to calculate latencies in Raccoon. events - are events of type Event proto which is of the format

Refer to the Event.proto for how the event could be composed of.

message Event {
// Data/byteArray of the serialised product proto.
bytes eventBytes = 1;
/* This is the protoMessageName which the protoc provides with each compiled proto. This type is used by raccoon to distribute events to respective Kafka topics.
*/
string type = 2;
}

Where eventBytes - is a byte array serialized by the event proto (eg. ViewedEvent.proto) serializer client type - event type which Raccoon uses to distribute the events to Kafka topics. More details in the following sections.

Clients build the event array and compose the SendEventRequest proto, send them through the WebSocket client.

Raccoon also wires response every time a message is read and processed.

Refer to the raccoon.proto that Raccoon sends for every event.

message SendEventResponse {
Status status = 1;
Code code = 2;
/* time when the response is generated */
int64 sent_time = 3;
/* failure reasons if any */
string reason = 4;
/* Usually detailing the success/failures */
map<string, string> data = 5;
}

enum Status {
UNKNOWN_STATUS = 0;
/* signifies request success */
SUCCESS = 1;
/* server request failures */
ERROR = 2;
}

enum Code {
UNKNOWN_CODE = 0;
/* successfully read and deserialized */
OK = 1;
/* usually deserialization failures */
BAD_REQUEST = 2;
/* server runtime errors */
INTERNAL_ERROR = 3;
/* signifies max connection reached at the server */
MAX_CONNECTION_LIMIT_REACHED = 4;
/* signifies a user reached max connections allowed.Defaults to 1 */
MAX_USER_LIMIT_REACHED = 5;
}

The above response model is self-explanatory. Clients can choose to retry for error codes such as Code=[3|4]

JSON

Sample JSON SendEventRequest

{
"req_guid": "1234abcd",
"sent_time": {
"seconds": 1638154927,
"nanos": 376499000
},
"events": [
{
"eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",
"type": "booking"
}
]
}
ParameterData TypeDescription
req_guidstringA globally unique Identifier generated by the client.
sent_timeObjectUnix time in seconds+nanoseconds when the event is sent to Raccoon
eventsArray(Object)Array of event objects
events.eventBytesstringbase64 string of bytes generated by json serializion of EventProto
events.typestringEvent type which Raccoon uses to distribute the events to Kafka topics

Sample JSON SendEventResponse

{
"status": 1,
"code": 1,
"sent_time": 1638155915,
"data": {
"req_guid": "1234abcd"
}
}
ParameterData TypeDescription
statusintstatus of the send event request
codeintresponse code
sent_timeintsent time in seconds
dataintdata map sent by the server, currently contains just the req_guid
reasonstringreason for any failure if any

Values of status and codes is same as defined in Protos.

Headers

Raccoon service accepts headers to identify a user connection uniquely. The header name is made configurable as it enables clients to specify a header name that works for them. For, e.g. for a mobile app having a request header as X-User-ID which identifies the user (client) connecting to Raccoon, can configure Raccoon service with the config set as below SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID. Optionally, SERVER_WEBSOCKET_CONN_GROUP_HEADER can also be configured to support multitenancy such as multiple apps connecting to a single Raccoon instance.

Raccoon uses the config to fetch the header name and uses the value passed in the request header with this name, as the connection id. This header name uniquely identifies a client. A client, in this case, can be the user in the app.

The following header is a sample providing a user id: 654785432. Once the client initiates a WebSocket upgrade request over Raccoon, assuming the request is upgraded, and the client connection is established, Racoon accepts the header and extracts the user id to build a connection map. This map helps deduplicate connections for a user within the same raccoon instance.

{
"X-User-ID": "654785432"
}

Content-Type header is mandatory for sending event using REST API.

Following are the supported Content-Type headers for various data formats:

  • Protobufs - application/proto
  • JSON - application/json

gRPC

Events can be sent to Raccoon using gRPC too.

Refer to EventService.proto for the definition of EventService which exposes one RPC call SendEvent. It is recommended to generate the language specific gRPC client using the proto definition.

Input to the RPC call is SendEventRequest and the output is raccoon.proto.

To support multi-tenacy while using gRPC, SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER values can be used. The key along with their values if set in grpc metadata while sending the request. Golang client example -

md := metadata.New(map[string]string{"X-User-ID": "1234"})
ctx := metadata.NewOutgoingContext(context.Background(), md)
r, err := client.SendEvent(ctx, req)

Topics

Raccoon distributes events to a topic based on the event type. The protobufs section above clarifies how the type should be set in the event. The type is a string literal. For example, ViewedEvent - which signifies that the user viewed something on the app or the site can have its event type set as below type = viewedevent

When raccoon API consumes a batch array of events (events in SendEventRequest proto), it deserializes them and fetches the individual events (using the SendEventRequest proto), and constructs the topic to send each event to based on the type field set in each of the events.

The following code determines the topic name.

topic := fmt.Sprintf(pr.topicFormat, event.Type)

where topicformat - is the configured pattern EVENT_DISTRIBUTION_PUBLISHER_PATTERN type - is the type set by the client when the event proto is generated

For e.g. setting the

EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log

and a type such as type=viewedevent in the event

will have the topic name as topic-viewedevent-log

- - +

Publishing Events

EndPoints

Raccoon can be hosted behind a proxy/API GW, a sample of blocks as below.

The HTTP API path which accepts events is:

/api/v1/events

This path can be used for sending events by either connecting via websocket connection or as a normal REST API Request.

HTTP methods used for Endpoints are:

  • Websocket - GET
  • REST - POST

Authorization/Authentication

Raccoon does not provide features to perform any authorization or authentication of the user/client initiating the connection. It accepts connections as trusted (and assumes any such auth is already performed)

HTTP backend

SSL termination is outside the scope of Raccoon, and the service API accepts HTTP connections assuming that the SSL is terminated at a proxy or ELB before reaching Raccoon.

gRPC backend

Similar to HTTP SSL termination is outside the scope of Raccoon, and the service API accepts connections assuming SSL is terminated at a proxy or ELB before reaching Raccoon.

Data Formatters

Raccoon supports Protobuf and JSON as the primary data formatters. Protobuf can be used to send event via websocket, REST or gRPC whereas JSON is supported only for websocket and REST endpoint.

With a websocket connection the content type is identified based on the message type. If the message type is binary it is assumed that the formatting is protobuf and if the message type is text then formatting is assumed to be JSON.

Protobuf

Raccoon accepts a SendEventRequest proto that wraps multiple Event proto. This enables clients to send an event in real-time or multiple events in batches.

Refer to raccoon.proto to learn how you can build the request.

message SendEventRequest {
string req_guid = 1;
google.protobuf.Timestamp sent_time = 2;
repeated Event events = 3;
}

Where :

  • req_guid - A globally unique ID generated by the client denoting this request as unique
  • sent_time - This is when the event is sent over the WebSocket in protobuf timestamp format. This time is used to calculate latencies in Raccoon.
  • events - events of type Event proto. Refer to the raccoon.proto to learn more.
message Event {

// Data/byteArray of the serialised product proto.
bytes eventBytes = 1;

/* This is the protoMessageName which the protoc provides
* with each compiled proto. This type is used by raccoon
* to distribute events to respective topics.
*/
string type = 2;
}

Where:

  • eventBytes - is a byte array serialized by the event proto (eg. ViewedEvent.proto) serializer client
  • type - event type which Raccoon uses to distribute the events to topics. More details in the following sections.

Clients build the event array and compose the SendEventRequest proto, then send them through the WebSocket client.

Raccoon also wires a response every time a message is read and processed.

Refer to the raccoon.proto that Raccoon sends for every event.

message SendEventResponse {
Status status = 1;
Code code = 2;
int64 sent_time = 3; /* time when the response is generated */
string reason = 4; /* failure reasons if any */
map<string, string> data = 5; /* Usually detailing the success/failures */
}

enum Status {
UNKNOWN_STATUS = 0;
SUCCESS = 1; /* signifies request success */
ERROR = 2; /* server request failures */
}

enum Code {
UNKNOWN_CODE = 0;
OK = 1; /* successfully read and deserialized */
BAD_REQUEST = 2; /* usually deserialization failures */
INTERNAL_ERROR = 3; /* server runtime errors */
MAX_CONNECTION_LIMIT_REACHED = 4; /* max connection reached at the server */
MAX_USER_LIMIT_REACHED = 5; /* user reached max connections allowed. Defaults to 1 */
}

The above response model is self-explanatory. Clients can choose to retry for error codes such as Code=[3|4]

JSON

Sample JSON SendEventRequest

{
"req_guid": "1234abcd",
"sent_time": {
"seconds": 1638154927,
"nanos": 376499000
},
"events": [
{
"eventBytes": "Cg4KCHNlcnZpY2UxEgJBMRACIAEyiQEKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5ZiISCcix9QzhsChAEekGEi1cMlNAKgwKAmlkEgJpZBjazUsyFwoDaU9zEgQxMi4zGgVBcHBsZSIDaTEwOiYKJDczZTU3ZDlhLTAzMjQtNDI3Yy1hYTc5LWE4MzJjMWZkY2U5Zg==",
"type": "booking"
}
]
}
ParameterData TypeDescription
req_guidstringA globally unique Identifier generated by the client.
sent_timeObjectUnix time in seconds+nanoseconds when the event is sent to Raccoon
eventsArray(Object)Array of event objects
events.eventBytesstringbase64 string of bytes generated by json serializion of EventProto
events.typestringEvent type which Raccoon uses to distribute the events to topics

Sample JSON SendEventResponse

{
"status": 1,
"code": 1,
"sent_time": 1638155915,
"data": {
"req_guid": "1234abcd"
}
}
ParameterData TypeDescription
statusintstatus of the send event request
codeintresponse code
sent_timeintsent time in seconds
dataintdata map sent by the server, currently contains just the req_guid
reasonstringreason for any failure if any

Values of status and codes is same as defined in Proto.

Headers

Raccoon service accepts headers to identify a user connection uniquely. The header name is made configurable as it enables clients to specify a header name that works for them. For, e.g. for a mobile app having a request header as X-User-ID which identifies the user (client) connecting to Raccoon, can configure Raccoon service with the config set as below SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID. Optionally, SERVER_WEBSOCKET_CONN_GROUP_HEADER can also be configured to support multi-tenancy such as multiple apps connecting to a single Raccoon instance.

Raccoon uses the config to fetch the header name and uses the value passed in the request header with this name, as the connection id. This header name uniquely identifies a client. A client, in this case, can be the user in the app.

The following header is a sample providing a user id: 654785432. Once the client initiates a WebSocket upgrade request over Raccoon, assuming the request is upgraded, and the client connection is established, Racoon accepts the header and extracts the user id to build a connection map. This map helps deduplicate connections for a user within the same raccoon instance.

{
"X-User-ID": "654785432"
}

Content-Type header is mandatory for sending event using REST API.

Following are the supported Content-Type headers for various data formats:

  • Protobuf - application/proto
  • JSON - application/json

gRPC

Events can be sent to Raccoon using gRPC too.

Refer to EventService for the definition of EventService which exposes one RPC call SendEvent. It is recommended to generate the language specific gRPC client using the proto definition.

Input to the RPC call is SendEventRequest and the output is SendEventResponse.

To support multi-tenancy while using gRPC, SERVER_WEBSOCKET_CONN_ID_HEADER and SERVER_WEBSOCKET_CONN_GROUP_HEADER values can be used. The key along with their values should be set in the grpc metadata while sending the request. Golang client example -

md := metadata.New(map[string]string{"X-User-ID": "1234"})
ctx := metadata.NewOutgoingContext(context.Background(), md)
r, err := client.SendEvent(ctx, req)

Topics

Raccoon distributes events to a topic based on the event type. The protobuf section above clarifies how the type should be set in the event. The type is a string literal. For example, ViewedEvent - which signifies that the user viewed something on the app or the site can have its event type set as below type = viewedevent

When raccoon API consumes a batch array of events (events in SendEventRequest proto), it deserializes them and fetches the individual events (using the SendEventRequest proto), and constructs the topic to send each event to based on the type field set in each of the events.

The following code determines the topic name.

topic := strings.Replace(p.topicFormat, "%s", event.Type, 1)

where topicformat - is the configured pattern EVENT_DISTRIBUTION_PUBLISHER_PATTERN type - is the type set by the client when the event proto is generated

For e.g. setting the

EVENT_DISTRIBUTION_PUBLISHER_PATTERN=topic-%s-log

and a type such as type=viewedevent in the event

will have the topic name as topic-viewedevent-log

+ + \ No newline at end of file diff --git a/guides/troubleshooting/index.html b/guides/troubleshooting/index.html index a5a0cdc9..5116c7a3 100644 --- a/guides/troubleshooting/index.html +++ b/guides/troubleshooting/index.html @@ -7,14 +7,14 @@ -Troubleshooting | Raccoon - - +Troubleshooting | Raccoon + +
-

Troubleshooting

Scale Up Racoon

Internally, Raccoon has 3 main components that affect the capacity. The server, worker, and publisher. Each component has configurations that can be tune if necessary. Since those 3 components are forming a pipe, you need to make sure none of the components become a bottleneck.

To know the right configuration, you need to simulate with similar throughput as production. You can tune the configuration accordingly.

Following are details of what you can tune.

Server

Raccoon is using WebSocket as a communication protocol from client to server. Websocket requires maintaining long-running connections. Each connection costs the OS an open file descriptor. When you reach the limit of the configured open file descriptor, the server won't be able to accept a new connection. By default, OS limit the number of the open file descriptor. You can look up how to increase the max open file descriptor. On Unix, you can do ulimit -n to check max open file descriptor and ulimit -n <number> to set a new limit.

Apart from OS configuration, there are configurations you can tune on Raccoon:

  • SERVER_WEBSOCKET_MAX_CONN To limit Raccoon resource utilization, we enforce a limit on WebSocket connection. The default value is 30000; adjust it if necessary.

Worker

After the request is deserialized, the server puts the events on the buffer channel. The worker process events from the channel and publish them to Kafka. You can think of the worker and the channel as a buffer in case the publisher slows down temporarily.

  • WORKER_BUFFER_CHANNEL_SIZE Buffer before the events get processed. The more the size, the longer it can tolerate a temporary spike or slow down.
  • WORKER_POOL_SIZE The worker will call the publisher client and wait synchronously. Increase this according to the throughput.

Publisher

Currently, Raccoon is using Librd Kafka client Go wrapper as publisher client. There is plenty of guides out there to tune Kafka producer. Here are some configurations you can tune.

Backpressure

You might see the event_processing_duration_milliseconds keeps on increasing and batch_idle_in_channel_milliseconds is in constant high value. In that case, Raccoon might get backpressure from the publisher. If that happens, you can check the publisher, or you need to tune the publisher configuration on Raccoon.

- - +

Troubleshooting

Scale Up Racoon

Internally, Raccoon has 3 main components that affect the capacity. The server, worker, and publisher. Each component has configurations that can be tune if necessary. Since those 3 components are forming a pipe, you need to make sure none of the components become a bottleneck.

To know the right configuration, you need to simulate with similar throughput as production. You can tune the configuration accordingly.

Following are details of what you can tune.

Server

Raccoon is using WebSocket as a communication protocol from client to server. Websocket requires maintaining long-running connections. Each connection costs the OS an open file descriptor. When you reach the limit of the configured open file descriptor, the server won't be able to accept a new connection. By default, OS limit the number of the open file descriptor. You can look up how to increase the max open file descriptor. On Unix, you can do ulimit -n to check max open file descriptor and ulimit -n <number> to set a new limit.

Apart from OS configuration, there are configurations you can tune on Raccoon:

  • SERVER_WEBSOCKET_MAX_CONN To limit Raccoon resource utilization, we enforce a limit on WebSocket connection. The default value is 30000; adjust it if necessary.

Worker

After the request is deserialized, the server puts the events on the buffer channel. The worker process events from the channel and publishes them downstream. You can think of the worker and the channel as a buffer in case the publisher slows down temporarily.

  • WORKER_BUFFER_CHANNEL_SIZE Buffer before the events get processed. The more the size, the longer it can tolerate a temporary spike or slow down.
  • WORKER_POOL_SIZE The worker will call the publisher client and wait synchronously. Increase this according to the throughput.

Publisher

Raccoon has support for kafka, pubsub and kinesis publishers.

Kafka

Currently, Raccoon is using Librd Kafka client Go wrapper as publisher client. There is plenty of guides out there to tune Kafka producer. Here are some configurations you can tune.

PubSub

Raccoon uses cloud.google.com/go/pubsub as the producer client for publishing events to Google Cloud PubSub.

The default quota limits for writes are:

  • 4GiB/second for large regions
  • 800MiB/second for medium regions
  • 200MiB/second for small regions

A single message (event) must not be bigger 10MiB. Although this limit can be increased by submitting a quota increase request.

Since PubSub is a managed service, you generally only need to worry about hitting quotas or rate limits. Refer to PubSub documentation for more information.

Kinesis

Raccoon uses github.com/aws/aws-sdk-go-v2/service/kinesis as the producer client for publishing events to AWS Kinesis.

AWS Kinesis Data Stream come into two modes:

  • Provisioned
  • On-Demand

With Provisioned mode, your throughput is computed using the formlua:

Throughput/Second = Number of Shards * 1MiB
Records/Second = Number of Shards * 1000

Shards are the basic unit of capacity in Kinesis. Make sure to create enough shards to accomodate your expected throughtput.

With On-Demand mode, the capcity of your stream updates dynamically depending on demand. The lower bound for writes is 4 MiB/second with an upper bound of 200MiB/second. You can request an increase of this quota up to 2 GiB/second by submitting a support request.

A single message (event) must not exceed 1MiB in size. This is a hard limit and you cannot request an increase.

see AWS Kinesis documentation for more information.

Backpressure

You might see the event_processing_duration_milliseconds keeps on increasing and batch_idle_in_channel_milliseconds is in constant high value. In that case, Raccoon might get back-pressure from the publisher. If that happens, you can check the publisher, or you need to tune the publisher configuration on Raccoon.

+ + \ No newline at end of file diff --git a/index.html b/index.html index 5b0625db..cf8ea683 100644 --- a/index.html +++ b/index.html @@ -7,14 +7,14 @@ -Introduction | Raccoon - - +Introduction | Raccoon + +
-

Introduction

Raccoon is high throughput, low-latency service that provides an API to ingest clickstream data from mobile apps; and sites and publish it to Kafka. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch (array) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.

Overiew

Key Features

  • Event Agnostic - Raccoon API is event agnostic. This allows you to push any event with any schema.
  • Event Distribution - Events are distributed to Kafka topics based on the event meta-data
  • High performance - Long-running persistent, peer-to-peer connection reduce connection set up overheads. Websocket provides reduced battery consumption for mobile apps (based on usage statistics)
  • Guaranteed Event Delivery - Server acknowledgments based on delivery. Currently, it acknowledges failures/successes. Additionally, users can augment the server for zero-data loss or at-least-once guarantees.
  • Reduced payload sizes - Protobuf based
  • Metrics: - Built-in monitoring includes latency and active connections.

Use Cases

Raccoon can be used as an event collector, event distributor, and forwarder of events generated from mobile/web/IoT front-ends as it provides a high volume, high throughput, low latency event-agnostic APIs. In addition, it can serve the needs of data ingestion in near-real-time. Some domains where Raccoon could be used are listed below.

  • Adtech streams: Where users can ingest digital marketing data from external sources into the organization backends
  • Clickstream: Where apps can stream user behavior data in real-time
  • Edge systems: Where devices (say in the IoT world) need to send data to the cloud.
  • Event Sourcing: Such as Stock updates dashboards, autonomous/self-drive use cases

Usage

Explore the following resources to get started with Raccoon:

  • Guides provide information on deployment and client samples.
  • Concepts describe all important Raccoon concepts.
  • Reference contains details about configurations, metrics, and other aspects of Raccoon.
  • Contribute contains resources for anyone who wants to contribute to Raccoon.
- - +

Introduction

Raccoon is a high-throughput, low-latency service that provides an API to ingest clickstream data from mobile apps and sites and publish it to a message queue for stream processing. Raccoon uses the WebSocket protocol for peer-to-peer communication and protobuf as the serialization format. It provides an event-type agnostic API that accepts a batch (array) of events in protobuf format. Refer here for the protobuf definition format that Raccoon accepts.

Overiew

Key Features

  • Event Agnostic - Raccoon API is event agnostic. This allows you to push any event with any schema.
  • Event Distribution - Events are distributed to message queue topics based on the event meta-data.
  • High performance - Long-running persistent, peer-to-peer connection reduce connection set up overheads. Websocket provides reduced battery consumption for mobile apps (based on usage statistics)
  • Guaranteed Event Delivery - Server acknowledgments based on delivery. Currently, it acknowledges failures/successes. Additionally, users can augment the server for zero-data loss or at-least-once guarantees.
  • Reduced payload sizes - Protobuf based
  • Metrics: - Built-in monitoring includes latency and active connections.

Use Cases

Raccoon can be used as an event collector, event distributor, and forwarder of events generated from mobile/web/IoT front-ends as it provides a high volume, high throughput, low latency event-agnostic APIs. In addition, it can serve the needs of data ingestion in near-real-time. Some domains where Raccoon could be used are listed below.

  • Adtech streams: Where users can ingest digital marketing data from external sources into the organization's backends
  • Clickstream: Where apps can stream user behavior data in real-time
  • Edge systems: Where devices (say in the IoT world) need to send data to the cloud.
  • Event Sourcing: Such as stock update dashboards, autonomous/self-drive use cases

Usage

Explore the following resources to get started with Raccoon:

  • Guides provide information on deployment and client samples.
  • Concepts describe all important Raccoon concepts.
  • Reference contains details about configurations, metrics, and other aspects of Raccoon.
  • Contribute contains resources for anyone who wants to contribute to Raccoon.
+ + \ No newline at end of file diff --git a/quickstart/index.html b/quickstart/index.html index d9ddca23..d89d829e 100644 --- a/quickstart/index.html +++ b/quickstart/index.html @@ -7,14 +7,14 @@ -Quickstart | Raccoon - - +Quickstart | Raccoon + +
-

Quickstart

This document will guide you to get Raccoon along with Kafka setup running locally. This document assumes that you have installed Docker and Kafka with host.docker.internal advertised on your machine.

Run Raccoon With Docker

Run the following command. Make sure to set PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS according to your local Kafka setup.

$ docker run -p 8080:8080 \
-e SERVER_WEBSOCKET_CONN_ID_HEADER=X-User-ID \
-e PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS=host.docker.internal:9092 \
-e EVENT_DISTRIBUTION_PUBLISHER_PATTERN=clickstream-log \
raystack/raccoon:latest

To test whether the service is running or not, you can try to ping the server.

$ curl http://localhost:8080/ping

Publishing Your First Event

Currently, Raccoon doesn't come with a library client. To start publishing events to Raccoon, we provide you an example of a go client that you can refer to. You can also run the example right away if you have Go installed on your machine.

# `cd` on the client example directory and run the following
$ go run main.go sample.pb.go

To verify the event published by Raccoon. First, you need to start a Kafka listener.

$ kafka-console-consumer --bootstrap-server localhost:9092 --topic clickstream-log

Where To Go Next

For more detail about publishing events to Raccoon, you can read the detailed document under the guides section. To understand more about how Raccoon work, you can go to the architecture document.

- - +

Quickstart

This document will guide you on how to get Raccoon + Kafka setup running locally. This document assumes that you have Docker (with Docker Compose) and Kafka installed on your system.

Run Raccoon with Docker Compose

Here's a minimal setup that runs a single node kafka-cluster along with raccoon:

docker-compose.yml
networks:
raccoon-network:

services:
zookeeper:
image: confluentinc/cp-zookeeper:5.1.2
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
networks:
- raccoon-network

kafka:
image: confluentinc/cp-kafka:5.1.2
hostname: kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- "9094:9094"
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://localhost:9094
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_SOCKET_REQUEST_MAX_BYTES: 1000000000
CONFLUENT_METRICS_ENABLE: 'false'
links:
- zookeeper
networks:
- raccoon-network
raccoon:
image: raystack/raccoon
hostname: raccoon
container_name: raccoon
stdin_open: true
tty: true
depends_on:
- kafka
environment:
SERVER_WEBSOCKET_PORT: "8080"
SERVER_WEBSOCKET_CHECK_ORIGIN: "true"
SERVER_CORS_ENABLED: "true"
SERVER_CORS_ALLOWED_ORIGIN: "http://localhost:3000 http://localhost:8080"
SERVER_CORS_ALLOWED_METHODS: "GET HEAD POST OPTIONS"
SERVER_WEBSOCKET_CONN_ID_HEADER: "X-User-ID"
SERVER_WEBSOCKET_CONN_GROUP_HEADER: "X-User-Group"
SERVER_GRPC_PORT: 8081
EVENT_DISTRIBUTION_PUBLISHER_PATTERN: "event-log"
PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS: "kafka:9092"
ports:
- "8080:8080"
- "8081:8081"
networks:
- raccoon-network

This setup is configured to publish all events to event-log topic. You can also configure Raccoon to route events to different topics based on the event type.

Copy the file to your local system and run the following to start Raccoon.

$ docker compose up

To test whether Raccoon is running or not, you can try to ping the server.

$ curl http://localhost:8080/ping

To verify the event published by Raccoon. First, you need to start a Kafka listener. In a seperate terminal run:

$ kafka-console-consumer --bootstrap-server localhost:9094 --topic 'event-log'

Publishing Your First Event

Make sure that Go >= 1.16 is installed on your system. See installation instructions on Go's website for more info.

Create a directory called go-raccoon-example and initialize it as a go module

$ mkdir go-raccoon-example
$ cd go-raccoon-example
$ go mod init go-raccoon-example

Install the raccoon client

$ go get github.com/raystack/raccoon/clients/go

Create the main.go file

main.go
package mainimport (    "fmt"    "log"    raccoon "github.com/raystack/raccoon/clients/go"    "google.golang.org/protobuf/types/known/timestamppb"    "github.com/google/uuid"    "github.com/raystack/raccoon/clients/go/testdata"    "github.com/raystack/raccoon/clients/go/ws")func main() {    client, err := ws.New(        ws.WithUrl("ws://localhost:8080/api/v1/events"),        ws.WithHeader("x-user-id", "123"),        ws.WithHeader("x-user-type", "ACME"))    if err != nil {        log.Fatal(err)    }    defer client.Close()    _, err = client.Send([]*raccoon.Event{        {            Type: "page",            Data: &testdata.PageEvent{                EventGuid: uuid.NewString(),                EventName: "clicked",                SentTime:  timestamppb.Now(),            },        },    })    if err != nil {        log.Fatal(err)    }    <-client.EventAcks()}

Finally, run the program

$ go run main.go

Where To Go Next

For more detail about publishing events to Raccoon, you can read the detailed document under the guides section. To understand more about how Raccoon works, you can go to the architecture document.

+ + \ No newline at end of file diff --git a/reference/benchmarks/index.html b/reference/benchmarks/index.html index e15b022c..547ab3ff 100644 --- a/reference/benchmarks/index.html +++ b/reference/benchmarks/index.html @@ -7,15 +7,15 @@ -Benchmarks | Raccoon - - +Benchmarks | Raccoon + +

Benchmarks

This page contains performance benchmarks for raccoon.

Table of Contents

WebSocket

Setup

Raccoon benchmarking was done using a client which creates multiple parallel connections to Raccoon in one go and then sends batches of events every 10 seconds. -This whole setup was deployed on a Kubernetes cluster running on GCP with one or multiple raccoon pods.

Result

Folowing are the benchmarking results for various versions

Raccoon versionDurationNo. of ConnectionsNo. of Raccoon PodsNo. of events/10sServer Processing Latency(P95)Server Processing Latency(Upper)Workers Latency (mean p95)Workers Latency (max upper)Memory Used per podCPU Cores Used per pod
v0.1.01 hour1000011500000~ 6 - 22 ms~ 3 - 913 ms~ 1.7 - 7 ms~ 2 - 140 ms~ 711 - 870 MB~ 2.2
v0.1.01 hour50000325000~ 20 - 30 ms~ 3 s~ 35 - 50 ms~ 35 - 45 ms~ 1.0- 1.5 GB~ 0.3 - 0.6
v0.1.01 hour500003100000~ 3 - 5 ms~ 2.5 s~ 20- 30 ms~ 20 - 30 ms400 - 500 MB~ 0.7
v0.1.01 hour1000005100000~ 3 - 9 ms~ 2.5 s~ 20- 30 ms~ 20 - 30 ms~ 1.7 - 2GB~ 1
v0.1.230 min1000011500000~ 1 - 7.13k ms~ 1 - 7.13k ms~ 0.8 - 9.25 ms~ 2 - 224 ms~ 960MB -1.2GB~ ~ 2.57
- - +This whole setup was deployed on a Kubernetes cluster running on GCP with one or multiple raccoon pods.

Result

Following are the benchmarking results for various versions

Raccoon versionDurationNo. of ConnectionsNo. of Raccoon PodsNo. of events/10sServer Processing Latency(P95)Server Processing Latency(Upper)Workers Latency (mean p95)Workers Latency (max upper)Memory Used per podCPU Cores Used per pod
v0.1.01 hour1000011500000~ 6 - 22 ms~ 3 - 913 ms~ 1.7 - 7 ms~ 2 - 140 ms~ 711 - 870 MB~ 2.2
v0.1.01 hour50000325000~ 20 - 30 ms~ 3 s~ 35 - 50 ms~ 35 - 45 ms~ 1.0- 1.5 GB~ 0.3 - 0.6
v0.1.01 hour500003100000~ 3 - 5 ms~ 2.5 s~ 20- 30 ms~ 20 - 30 ms400 - 500 MB~ 0.7
v0.1.01 hour1000005100000~ 3 - 9 ms~ 2.5 s~ 20- 30 ms~ 20 - 30 ms~ 1.7 - 2GB~ 1
v0.1.230 min1000011500000~ 1 - 7.13k ms~ 1 - 7.13k ms~ 0.8 - 9.25 ms~ 2 - 224 ms~ 960MB -1.2GB~ ~ 2.57
+ + \ No newline at end of file diff --git a/reference/configurations/index.html b/reference/configurations/index.html index d646e6af..eb0e036a 100644 --- a/reference/configurations/index.html +++ b/reference/configurations/index.html @@ -7,15 +7,15 @@ -Configurations | Raccoon - - +Configurations | Raccoon + +
-

Configurations

This page contains reference for all the application configurations for Raccoon.

Table of Contents

Server

SERVER_WEBSOCKET_PORT

Port for the service to listen.

  • Type: Optional
  • Default value: 8080

SERVER_WEBSOCKET_MAX_CONN

Maximum connection that can be handled by the server instance. You want to set it according to your resource utilization. You also need to check the limit of open file descriptor allowed by the OS.

  • Type: Optional
  • Default value: 30000

SERVER_WEBSOCKET_READ_BUFFER_SIZE

Specify I/O buffer sizes in bytes: Refer gorilla websocket API

  • Type: Optional
  • Default value: 10240

SERVER_WEBSOCKET_WRITE_BUFFER_SIZE

Specify I/O buffer sizes in bytes: Refer gorilla websocket API

  • Type: Optional
  • Default value: 10240

SERVER_WEBSOCKET_CONN_ID_HEADER

Unique identifier for the server to maintain the connection. A single uniq id can only connect once in a session. If, there is a subsequence connection with the same uniq id the connection will be rejected.

  • Example value: X-User-ID
  • Type: Required

SERVER_WEBSOCKET_CONN_GROUP_HEADER

Additional identifier for the server to maintain the connection. Value of the conn group header combined with user id will act as unique identifier instead of only user id. You can use this if you want to differentiate between user groups or clients e.g(mobile, web). The group names is used as conn_group tag in some of the metrics.

  • Example value: X-User-Group
  • Type: Optional

SERVER_WEBSOCKET_CONN_GROUP_DEFAULT

Default connection group name. The default is fallback when SERVER_WEBSOCKET_CONN_GROUP_HEADER is not set or when the value of group header is empty. In case the connection group default is clashing with your actual group name, override this config.

  • Default value: --default--
  • Type: Optional

SERVER_WEBSOCKET_PING_INTERVAL_MS

Interval of each ping to client. The interval is in seconds.

  • Type: Optional
  • Default value: 30

SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS

Wait time for client to send Pong message back after server sends Ping. When the time exceeded the connection will be dropped.

  • Type Optional
  • Default value: 60

SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS

Timeout Deadline set on the writes. On timeout the websocket state is corrupt and all future writes will return error: Refer gorilla websocket API

  • Type Optional
  • Default value: 5

SERVER_WEBSOCKET_PINGER_SIZE

Number of goroutine spawn to Ping clients.

  • Type Optional
  • Default value: 1

SERVER_WEBSOCKET_CHECK_ORIGIN

Toggle CORS check function. Set true to check each request origin. Set false to disable check origin and allow every request. Check origin function check against Origin header.

  • Type: Optional
  • Default value: true

SERVER_CORS_ENABLED

The config decides whether to enable the cors middleware and thus allow CORS requests. This config only enables CORS for rest services. For websocket, refer SERVER_WEBSOCKET_CHECK_ORIGIN

  • Type Optional
  • Default value: false

SERVER_CORS_ALLOWED_ORIGIN

The server decides which origin to allow. The configuration is expected to space separated. Multiple values are supported. The value requies SERVER_CORS_ENABLED to be true to take effect. If you want to allow all host headers. You can pass * as the value.

  • Type Optional
  • Default Value ``

SERVER_CORS_ALLOWED_METHODS

The http methods allowed when it's a cross origin request. The http methods are expected to be space separated.

  • Type Optional
  • Default Value GET HEAD POST OPTIONS

SERVER_CORS_ALLOWED_HEADERS

The http request headers which are allowed when request is cross origin. The input expects to add any additional headers which is going to be sent by the client ex: Authorization. Headers which are essential for the functioning of Raccoon like Content-Type, Connection-Id & Group headers are added by default and need not be passed as configuration.

  • Type Optional
  • Default Value ``

SERVER_CORS_ALLOW_CREDENTIALS

AllowCredentials can be used to specify that the user agent may pass authentication details along with the request.

  • Type Optional
  • Default Value false

SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS

Replies with a header for clients on how long to cache the response of the preflight request. It's not enforceable. The max value is 600s

  • Type Optional
  • Default Value 0

SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED

The server decides whether or not to handle duplicate batches for the active connection. If a batch is sent with a duplicate ReqGUID, the server uses best attempts to discard the duplicate batches. Set true to enable the setting.

  • Type Optional
  • Default value: false

Worker

WORKER_BUFFER_CHANNEL_SIZE

Maximum batch that service can handle when workers are busy. When the number of batch is exceeded, the worker will backpressure causing websocket to stop reading new request.

  • Type Optional
  • Default value: 100

WORKER_BUFFER_FLUSH_TIMEOUT_MS

Upon shutdown, the worker try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the worker is forcefully closed.

  • Type Optional
  • Default value: 5000

WORKER_POOL_SIZE

No of workers that processes the events concurrently.

  • Type Optional
  • Default value: 5

WORKER_KAFKA_DELIVERY_CHANNEL_SIZE

Delivery channel is implementation detail where the kafka client asks for channel in the produce API. The publisher uses the channel to wait for the events to be delivered. The channel contains the status delivery of the events. Normally you won't need to touch this.

  • Type Optional
  • Default value: 10

Event Distribution

EVENT_DISTRIBUTION_PUBLISHER_PATTERN

Routes events based on given pattern and type. The pattern is following go string format with event type as second argument. The result of the string format will be the kafka topic target of the event.

For example, you pass %s-event as EVENT_DISTRIBUTION_PUBLISHER_PATTERN. If you send event with click type, your event will be forwareded to click-event kafka topic on the configured broker. If you send event with buy type, your event will be forwarded to buy-event.

You can also route the events to single topic irrespective of the type. To do that you can drop %s in the value. For example, provided mobile-events as value. All incoming events will be routed to mobile-events kafka topic.

  • Type Required
  • Default value: clickstream-%s-log

Publisher

PUBLISHER_TYPE

The publisher to use for transmitting events.

Publisher specific configuration follows the pattern PUBLISHER_${TYPE}_* where ${TYPE} is the publisher type in upper case.

  • Type Optional
  • Default value: kafka
  • Possible values: kafka, pubsub, kinesis

PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS

Kafka brokers IP address where the events are published.

  • Example value: localhost:9092
  • Type Required

PUBLISHER_KAFKA_CLIENT_ACKS

Number of replica acknowledgement before it send ack back to service.

  • Type Optional
  • Default value: -1

PUBLISHER_KAFKA_CLIENT_RETRIES

Number of retries in case of failure.

  • Type Optional
  • Default value: 2147483647

PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS

Backoff time on retry.

  • Type Optional
  • Default value: 100

PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS

librdkafka statistics emit interval. The application also needs to register a stats callback using rd_kafka_conf_set_stats_cb(). The granularity is 1000ms. A value of 0 disables statistics.

  • Type Optional
  • Default value: 0

PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES

Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions.

  • Type Optional
  • Default value: 100000

PUBLISHER_KAFKA_CLIENT_*

Kafka client config is dynamically configured. You can see for other configuration here

  • Type Optional
  • Default value: see the reference

PUBLISHER_KAFKA_FLUSH_INTERVAL_MS

Upon shutdown, the publisher will try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the publisher is forcefully closed.

  • Type Optional
  • Default value: 1000

PUBLISHER_PUBSUB_CREDENTIALS

Path to the file containing service account credentials. Defaults to the value of GOOGLE_APPLICATION_CREDENTIALS environment variable. This is used to authenticate with Google Cloud Platform.

  • Type Required (if PUBLISHER_TYPE=pubsub, otherwise ignored)

PUBLISHER_PUBSUB_PROJECT_ID

Destination Google Cloud Project ID. Messages will be transmitted to the PubSub topics under this project.

  • Type Required (if PUBLISHER_TYPE=pubsub, otherwise ignored)

PUBLISHER_PUBSUB_TOPIC_AUTOCREATE

Whether Raccoon should create a topic if it doesn't exist.

  • Type Optional
  • Default value false

PUBLISHER_PUBSUB_TOPIC_RETENTION_MS

How long PubSub should retain messages in a topic (in milliseconds). Valid values must be between 10 minutes and 31 days.

see pubsub docs for more information.

  • Type Optional
  • Default value 0

PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS

Maximum time to wait for before publishing a batch of messages.

  • Type Optional
  • Default value 10

PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD

Maximum number of message to accumulate before transmission.

  • Type Optional
  • Default value 100

PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD

Maximum buffer size (in bytes)

  • Type Optional
  • Default value 1000000 (~1MB)

PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS

How long to wait before aborting a publish operation.

  • Type Optional
  • Default value 60000 (1 Minute)

PUBLISHER_KINESIS_AWS_REGION

AWS Region of the target kinesis stream. The value of AWS_REGION is used as fallback if this variable is not set.

  • Type Required

PUBLISHER_KINESIS_CREDENTIALS

Path to AWS Credentials file.

You can also specify the credentials using AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.

  • Type Optional
  • Default value $HOME/.aws/credentials

PUBLISHER_KINESIS_STREAM_AUTOCREATE

Whether Raccon should create a stream if it doesn't exist.

NOTE: We recommend that you create all streams that you need to publish to ahead of time.

  • Type Optional
  • Default value false

PUBLISHER_KINESIS_STREAM_MODE

This configuration variable controls the StreamMode of the -streams created by Raccon.

  • Type Optional
  • Default value ON_DEMAND
  • Possible values: ON_DEMAND, PROVISIONED

PUBLISHER_KINESIS_STREAM_SHARDS

This controls the number of shards configured for a stream created by Raccoon.

  • Type Optional
  • Default value 4

PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS

This specifies the time delay between stream status checks.

  • Type Optional
  • Default value 1000

PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS

How long to wait for before aborting a publish operation.

  • Type Optional
  • Default value 60000

Metric

METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS

The time interval between recording runtime stats of the application in the insturmentation. It's recommended to keep this value equivalent to flush interval when using statsd and your collector's scrape interval when using prometheus as your instrumentation.

  • Type Optional
  • Default Value: 10000

METRIC_STATSD_ENABLED

Flag to enable export of statsd metric

  • Type Optional
  • Default value: false

METRIC_STATSD_ADDRESS

Address to reports the service metrics.

  • Type Optional
  • Default value: :8125

METRIC_STATSD_FLUSH_PERIOD_MS

Interval for the service to push metrics.

  • Type Optional
  • Default value: 10000

METRIC_PROMETHEUS_ENABLED

Flag to enable a prometheus http server to expose metrics.

  • Type Optional
  • Default value: false

METRIC_PROMETHEUS_PATH

The path at which prometheus server should serve metrics.

  • Type Optional
  • Default value: /metrics

METRIC_PROMETHEUS_PORT

The port number on which prometheus server will be listening for metric scraping requests.

  • Type Optional
  • Default value: 9090

Log

LOG_LEVEL

Level available are info panic fatal error warn info debug trace.

  • Type Optional
  • Default value: info

Event

EVENT_ACK

Based on this parameter the server decides when to send the acknowledgement to the client. Supported values are 0 and 1.

  • Type Optional
  • Default value: 0
- - +

Configurations

This page contains reference for all the application configurations for Raccoon.

Table of Contents

Server

SERVER_WEBSOCKET_PORT

Port for the service to listen.

  • Type: Optional
  • Default value: 8080

SERVER_WEBSOCKET_MAX_CONN

Maximum connection that can be handled by the server instance. You want to set it according to your resource utilization. You also need to check the limit of open file descriptor allowed by the OS.

  • Type: Optional
  • Default value: 30000

SERVER_WEBSOCKET_READ_BUFFER_SIZE

Specify I/O buffer sizes in bytes: Refer gorilla websocket API

  • Type: Optional
  • Default value: 10240

SERVER_WEBSOCKET_WRITE_BUFFER_SIZE

Specify I/O buffer sizes in bytes: Refer gorilla websocket API

  • Type: Optional
  • Default value: 10240

SERVER_WEBSOCKET_CONN_ID_HEADER

Unique identifier for the server to maintain the connection. A single uniq id can only connect once in a session. If, there is a subsequence connection with the same uniq id the connection will be rejected.

  • Example value: X-User-ID
  • Type: Required

SERVER_WEBSOCKET_CONN_GROUP_HEADER

Additional identifier for the server to maintain the connection. Value of the conn group header combined with user id will act as unique identifier instead of only user id. You can use this if you want to differentiate between user groups or clients e.g(mobile, web). The group names is used as conn_group tag in some of the metrics.

  • Example value: X-User-Group
  • Type: Optional

SERVER_WEBSOCKET_CONN_GROUP_DEFAULT

Default connection group name. The default is fallback when SERVER_WEBSOCKET_CONN_GROUP_HEADER is not set or when the value of group header is empty. In case the connection group default is clashing with your actual group name, override this config.

  • Default value: --default--
  • Type: Optional

SERVER_WEBSOCKET_PING_INTERVAL_MS

Interval of each ping to client. The interval is in seconds.

  • Type: Optional
  • Default value: 30

SERVER_WEBSOCKET_PONG_WAIT_INTERVAL_MS

Wait time for client to send Pong message back after server sends Ping. When the time exceeded the connection will be dropped.

  • Type Optional
  • Default value: 60

SERVER_WEBSOCKET_WRITE_WAIT_INTERVAL_MS

Timeout Deadline set on the writes. On timeout the websocket state is corrupt and all future writes will return error: Refer gorilla websocket API

  • Type Optional
  • Default value: 5

SERVER_WEBSOCKET_PINGER_SIZE

Number of goroutine spawn to Ping clients.

  • Type Optional
  • Default value: 1

SERVER_WEBSOCKET_CHECK_ORIGIN

Toggle CORS check function. Set true to check each request origin. Set false to disable check origin and allow every request. Check origin function check against Origin header.

  • Type: Optional
  • Default value: true

SERVER_CORS_ENABLED

The config decides whether to enable the cors middleware and thus allow CORS requests. This config only enables CORS for rest services. For websocket, refer SERVER_WEBSOCKET_CHECK_ORIGIN

  • Type Optional
  • Default value: false

SERVER_CORS_ALLOWED_ORIGIN

The server decides which origin to allow. The configuration is expected to space separated. Multiple values are supported. The value requires SERVER_CORS_ENABLED to be true to take effect. If you want to allow all host headers. You can pass * as the value.

  • Type Optional
  • Default Value ``

SERVER_CORS_ALLOWED_METHODS

The http methods allowed when it's a cross origin request. The http methods are expected to be space separated.

  • Type Optional
  • Default Value GET HEAD POST OPTIONS

SERVER_CORS_ALLOWED_HEADERS

The http request headers which are allowed when request is cross origin. The input expects to add any additional headers which is going to be sent by the client ex: Authorization. Headers which are essential for the functioning of Raccoon like Content-Type, Connection-Id & Group headers are added by default and need not be passed as configuration.

  • Type Optional
  • Default Value ``

SERVER_CORS_ALLOW_CREDENTIALS

AllowCredentials can be used to specify that the user agent may pass authentication details along with the request.

  • Type Optional
  • Default Value false

SERVER_CORS_PREFLIGHT_MAX_AGE_SECONDS

Replies with a header for clients on how long to cache the response of the preflight request. It's not enforceable. The max value is 600s

  • Type Optional
  • Default Value 0

SERVER_BATCH_DEDUP_IN_CONNECTION_ENABLED

The server decides whether or not to handle duplicate batches for the active connection. If a batch is sent with a duplicate ReqGUID, the server uses best attempts to discard the duplicate batches. Set true to enable the setting.

  • Type Optional
  • Default value: false

Worker

WORKER_BUFFER_CHANNEL_SIZE

Maximum batch that service can handle when workers are busy. When the number of batch is exceeded, the worker will back-pressure causing websocket to stop reading new request.

  • Type Optional
  • Default value: 100

WORKER_BUFFER_FLUSH_TIMEOUT_MS

Upon shutdown, the worker try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the worker is forcefully closed.

  • Type Optional
  • Default value: 5000

WORKER_POOL_SIZE

No of workers that processes the events concurrently.

  • Type Optional
  • Default value: 5

WORKER_KAFKA_DELIVERY_CHANNEL_SIZE

Delivery channel is implementation detail where the kafka client asks for channel in the produce API. The publisher uses the channel to wait for the events to be delivered. The channel contains the status delivery of the events. Normally you won't need to touch this.

  • Type Optional
  • Default value: 10

Event Distribution

EVENT_DISTRIBUTION_PUBLISHER_PATTERN

Routes events based on given pattern and type. The pattern is following go string format with event type as second argument. The result of the string format will be the kafka topic target of the event.

For example, you pass %s-event as EVENT_DISTRIBUTION_PUBLISHER_PATTERN. If you send event with click type, your event will be forwarded to click-event kafka topic on the configured broker. If you send event with buy type, your event will be forwarded to buy-event.

You can also route the events to single topic irrespective of the type. To do that you can drop %s in the value. For example, provided mobile-events as value. All incoming events will be routed to mobile-events kafka topic.

  • Type Required
  • Default value: clickstream-%s-log

Publishers

Common

PUBLISHER_TYPE

The publisher to use for transmitting events.

Publisher specific configuration follows the pattern PUBLISHER_${TYPE}_* where ${TYPE} is the publisher type in upper case.

  • Type Optional
  • Default value: kafka
  • Possible values: kafka, pubsub, kinesis

Kafka

PUBLISHER_KAFKA_CLIENT_BOOTSTRAP_SERVERS

Kafka brokers IP address where the events are published.

  • Example value: localhost:9092
  • Type Required

PUBLISHER_KAFKA_CLIENT_ACKS

Number of replica acknowledgement before it send ack back to service.

  • Type Optional
  • Default value: -1

PUBLISHER_KAFKA_CLIENT_RETRIES

Number of retries in case of failure.

  • Type Optional
  • Default value: 2147483647

PUBLISHER_KAFKA_CLIENT_RETRY_BACKOFF_MS

Backoff time on retry.

  • Type Optional
  • Default value: 100

PUBLISHER_KAFKA_CLIENT_STATISTICS_INTERVAL_MS

librdkafka statistics emit interval. The application also needs to register a stats callback using rd_kafka_conf_set_stats_cb(). The granularity is 1000ms. A value of 0 disables statistics.

  • Type Optional
  • Default value: 0

PUBLISHER_KAFKA_CLIENT_QUEUE_BUFFERING_MAX_MESSAGES

Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions.

  • Type Optional
  • Default value: 100000

PUBLISHER_KAFKA_CLIENT_*

Kafka client config is dynamically configured. You can see other configurations here.

The configs are mapped to librdkafka configs by removing the PUBLISHER_KAFKA_CLIENT_ prefix and replacing underscore with a period.

Internally, this is how it looks

config/publisher.go
var dynamicKafkaClientConfigPrefix = "PUBLISHER_KAFKA_CLIENT_"

type publisherKafka struct { /* ... */ }

func (k publisherKafka) ToKafkaConfigMap() *confluent.ConfigMap {
configMap := &confluent.ConfigMap{}
for key, value := range viper.AllSettings() {
if strings.HasPrefix(strings.ToUpper(key), dynamicKafkaClientConfigPrefix) {
clientConfig := key[len(dynamicKafkaClientConfigPrefix):]
configMap.SetKey(strings.Join(strings.Split(clientConfig, "_"), "."), value)
}
}
return configMap
}
  • Type Optional
  • Default value: see the reference

PUBLISHER_KAFKA_FLUSH_INTERVAL_MS

Upon shutdown, the publisher will try to finish processing events in buffer before the timeout exceeded. When the timeout exceeded, the publisher is forcefully closed.

  • Type Optional
  • Default value: 1000

PubSub

PUBLISHER_PUBSUB_CREDENTIALS

Path to the file containing service account credentials. Defaults to the value of GOOGLE_APPLICATION_CREDENTIALS environment variable. This is used to authenticate with Google Cloud Platform.

  • Type Required (if PUBLISHER_TYPE=pubsub, otherwise ignored)

PUBLISHER_PUBSUB_PROJECT_ID

Destination Google Cloud Project ID. Messages will be transmitted to the PubSub topics under this project.

  • Type Required (if PUBLISHER_TYPE=pubsub, otherwise ignored)

PUBLISHER_PUBSUB_TOPIC_AUTOCREATE

Whether Raccoon should create a topic if it doesn't exist.

  • Type Optional
  • Default value false

PUBLISHER_PUBSUB_TOPIC_RETENTION_MS

How long PubSub should retain messages in a topic (in milliseconds). Valid values must be between 10 minutes and 31 days.

see pubsub docs for more information.

  • Type Optional
  • Default value 0

PUBLISHER_PUBSUB_PUBLISH_DELAY_THRESHOLD_MS

Maximum time to wait for before publishing a batch of messages.

  • Type Optional
  • Default value 10

PUBLISHER_PUBSUB_PUBLISH_COUNT_THRESHOLD

Maximum number of message to accumulate before transmission.

  • Type Optional
  • Default value 100

PUBLISHER_PUBSUB_PUBLISH_BYTE_THRESHOLD

Maximum buffer size (in bytes)

  • Type Optional
  • Default value 1000000 (~1MB)

PUBLISHER_PUBSUB_PUBLISH_TIMEOUT_MS

How long to wait before aborting a publish operation.

  • Type Optional
  • Default value 60000 (1 Minute)

Kinesis

PUBLISHER_KINESIS_AWS_REGION

AWS Region of the target kinesis stream. The value of AWS_REGION is used as fallback if this variable is not set.

  • Type Required

PUBLISHER_KINESIS_CREDENTIALS

Path to AWS Credentials file.

You can also specify the credentials using AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables.

  • Type Optional
  • Default value $HOME/.aws/credentials

PUBLISHER_KINESIS_STREAM_AUTOCREATE

Whether Raccoon should create a stream if it doesn't exist.

NOTE: We recommend that you create all streams that you need to publish to ahead of time.

  • Type Optional
  • Default value false

PUBLISHER_KINESIS_STREAM_MODE

This configuration variable controls the StreamMode of the +streams created by Raccoon.

  • Type Optional
  • Default value ON_DEMAND
  • Possible values: ON_DEMAND, PROVISIONED

PUBLISHER_KINESIS_STREAM_SHARDS

This controls the number of shards configured for a stream created by Raccoon.

  • Type Optional
  • Default value 4

PUBLISHER_KINESIS_STREAM_PROBE_INTERVAL_MS

This specifies the time delay between stream status checks.

  • Type Optional
  • Default value 1000

PUBLISHER_KINESIS_PUBLISH_TIMEOUT_MS

How long to wait for before aborting a publish operation.

  • Type Optional
  • Default value 60000

Metric

METRIC_RUNTIME_STATS_RECORD_INTERVAL_MS

The time interval between recording runtime stats of the application in the instrumentation. It's recommended to keep this value equivalent to flush interval when using statsd and your collector's scrape interval when using prometheus as your instrumentation.

  • Type Optional
  • Default Value: 10000

METRIC_STATSD_ENABLED

Flag to enable export of statsd metric

  • Type Optional
  • Default value: false

METRIC_STATSD_ADDRESS

Address to reports the service metrics.

  • Type Optional
  • Default value: :8125

METRIC_STATSD_FLUSH_PERIOD_MS

Interval for the service to push metrics.

  • Type Optional
  • Default value: 10000

METRIC_PROMETHEUS_ENABLED

Flag to enable a prometheus http server to expose metrics.

  • Type Optional
  • Default value: false

METRIC_PROMETHEUS_PATH

The path at which prometheus server should serve metrics.

  • Type Optional
  • Default value: /metrics

METRIC_PROMETHEUS_PORT

The port number on which prometheus server will be listening for metric scraping requests.

  • Type Optional
  • Default value: 9090

Log

LOG_LEVEL

Level available are info panic fatal error warn info debug trace.

  • Type Optional
  • Default value: info

Event

EVENT_ACK

Based on this parameter the server decides when to send the acknowledgement to the client. Supported values are 0 and 1.

  • Type Optional
  • Default value: 0
+ + \ No newline at end of file diff --git a/reference/metrics/index.html b/reference/metrics/index.html index 6706f07d..c0397552 100644 --- a/reference/metrics/index.html +++ b/reference/metrics/index.html @@ -7,14 +7,14 @@ -Metrics | Raccoon - - +Metrics | Raccoon + +
-

Metrics

Raccoon uses Statsd protocol as way to report metrics. You can capture the metrics using any supported statsd collector like Telegraf. This page contains reference for all the metrics for Raccoon.

Table of Contents

Server Connection

server_ping_failure_total

Total ping that server fails to send

  • Type: Counting
  • Tags: conn_group=*

server_pong_failure_total

Total pong that server fails to send

  • Type: Counting
  • Tags: conn_group=*

connections_count_current

Number of alive connections

  • Type: Gauge
  • Tags: conn_group=*

user_connection_success_total

Number of successful connections established to the server

  • Type: Count
  • Tags: conn_group=*

user_connection_failure_total

Number of fail connections established to the server

  • Type: Count
  • Tags: reason=ugfailure reason=exists reason=serverlimit conn_group=*

user_session_duration_milliseconds

Duration of alive connection per session per connection

  • Type: Timing
  • Tags: conn_group=*

conn_close_err_count

Number of connection close errors encountered

  • Type: Count
  • Tags: NA

Kafka Publisher

kafka_messages_delivered_total

Number of delivered events to Kafka. The metric also contains false increments. To find the true value, one should use the difference between this and kafka_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kafka_messages_undelivered_total

The count of false increments done by kafka_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kafka_unknown_topic_failure_total

Number of delivery failure caused by topic does not exist in kafka.

  • Type: Count
  • Tags: topic=topicname event_type=*

kafka_tx_messages_total

Total number of messages transmitted (produced) to Kafka brokers.

  • Type: Gauge

kafka_tx_messages_bytes_total

Total number of message bytes (including framing, such as per-Message framing and MessageSet/batch framing) transmitted to Kafka brokers

  • Type: Gauge

kafka_brokers_tx_total

Total number of requests sent to Kafka brokers

  • Type: Gauge
  • Tags: broker=broker_nodes

kafka_brokers_tx_bytes_total

Total number of bytes transmitted to Kafka brokers

  • Type: Gauge
  • Tags: broker=broker_nodes

kafka_brokers_rtt_average_milliseconds

Broker latency / round-trip time in microseconds

  • Type: Gauge
  • Tags: broker=broker_nodes

ack_event_rtt_ms

Time taken from ack function called by kafka producer to processed by the ack handler.

  • Type: Timing
  • Tags: NA

event_rtt_ms

Time taken from event is consumed from the queue to be acked by the ack handler.

  • Type: Timing
  • Tags: NA

kafka_producebulk_tt_ms

Response time of produce batch method of the kafka producer

  • Type Timing
  • Tags: NA

PubSub Publisher

pubsub_messages_delivered_total

Number of delivered events to PubSub. The metric also contains false increments. To find the true value, one should use the difference between this and pubsub_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

pubsub_messages_undelivered_total

The count of false increments done by pubsub_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

pubsub_unknown_topic_failure_total

Number of delivery failure caused by topic does not exist in PubSub.

  • Type: Count
  • Tags: topic=topicname event_type=* conn_group=*

Kinesis Publisher

kinesis_messages_delivered_total

Number of delivered events to Kinesis. The metric also contains false increments. To find the true value, one should use the difference between this and kinesis_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kinesis_messages_undelivered_total

The count of false increments done by kinesis_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kinesis_unknown_stream_failure_total

Number of delivery failure caused by stream does not exist in Kinesis.

  • Type: Count
  • Tags: stream=streamname event_type=* conn_group=*

Resource Usage

server_mem_gc_triggered_current

The time the last garbage collection finished in Unix timestamp

  • Type: Gauge

server_mem_gc_pauseNs_current

Circular buffer of recent GC stop-the-world in Unix timestamp

  • Type: Gauge

server_mem_gc_count_current

The number of completed GC cycle

  • Type: Gauge

server_mem_gc_pauseTotalNs_current

The cumulative nanoseconds in GC stop-the-world pauses since the program started

  • Type: Gauge

server_mem_heap_alloc_bytes_current

Bytes of allocated heap objects

  • Type: Gauge

server_mem_heap_inuse_bytes_current

HeapInuse is bytes in in-use spans

  • Type: Gauge

server_mem_heap_objects_total_current

Number of allocated heap objects

  • Type: Gauge

server_go_routines_count_current

Number of goroutine spawn in a single flush

  • Type: Gauge

server_mem_stack_inuse_bytes_current

Bytes in stack spans

  • Type: Gauge

Event Delivery

Following metrics are event delivery reports. Each metrics reported at a different point in time. See the diagram below for to understand when each metrics are reported.

Diagram

events_rx_bytes_total

Total byte receieved in requests

  • Type: Count
  • Tags: conn_group=* event_type=*

events_rx_total

Number of events received in requests

  • Type: Count
  • Tags: conn_group=* event_type=*

events_duplicate_total

Number of duplicate events

  • Type: Count
  • Tags: conn_group=* reason=*

batches_read_total

Request count

  • Type: Count
  • Tags: status=failed status=success reason=* conn_group=*

batch_idle_in_channel_milliseconds

Duration from when the request is received to when the request is processed. High value of this metric indicates the publisher is slow.

  • Type: Timing
  • Tags: worker=worker-name

event_processing_duration_milliseconds

Duration from the time request is sent to the time events are published. This metric is calculated per event by following formula (PublishedTime - SentTime)/CountEvents

  • Type: Timing
  • Tags: conn_group=*

server_processing_latency_milliseconds

Duration from the time request is receieved to the time events are published. This metric is calculated per event by following formula(PublishedTime - ReceievedTime)/CountEvents

  • Type: Timing
  • Tags: conn_group=*

worker_processing_duration_milliseconds

Duration from the time request is processed to the time events are published. This metric is calculated per event by following formula(PublishedTime - ProcessedTime)/CountEvents

  • Type: Timing
- - +

Metrics

Raccoon supports statsd and prometheus as two ways to report metrics. For statsd, we recommend using Telegraf as a collection agent.

This page contains the reference for all the metrics exposed by Raccoon.

Table of Contents

Server Connection

server_ping_failure_total

Total ping that server fails to send

  • Type: Counting
  • Tags: conn_group=*

server_pong_failure_total

Total pong that server fails to send

  • Type: Counting
  • Tags: conn_group=*

connections_count_current

Number of alive connections

  • Type: Gauge
  • Tags: conn_group=*

user_connection_success_total

Number of successful connections established to the server

  • Type: Count
  • Tags: conn_group=*

user_connection_failure_total

Number of fail connections established to the server

  • Type: Count
  • Tags: reason=ugfailure reason=exists reason=serverlimit conn_group=*

user_session_duration_milliseconds

Duration of alive connection per session per connection

  • Type: Timing
  • Tags: conn_group=*

conn_close_err_count

Number of connection close errors encountered

  • Type: Count
  • Tags: NA

Publisher

Kafka

kafka_messages_delivered_total

Number of delivered events to Kafka. The metric also contains false increments. To find the true value, one should use the difference between this and kafka_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kafka_messages_undelivered_total

The count of false increments done by kafka_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kafka_unknown_topic_failure_total

Number of delivery failure caused by topic does not exist in kafka.

  • Type: Count
  • Tags: topic=topicname event_type=*

kafka_tx_messages_total

Total number of messages transmitted (produced) to Kafka brokers.

  • Type: Gauge

kafka_tx_messages_bytes_total

Total number of message bytes (including framing, such as per-Message framing and MessageSet/batch framing) transmitted to Kafka brokers

  • Type: Gauge

kafka_brokers_tx_total

Total number of requests sent to Kafka brokers

  • Type: Gauge
  • Tags: broker=broker_nodes

kafka_brokers_tx_bytes_total

Total number of bytes transmitted to Kafka brokers

  • Type: Gauge
  • Tags: broker=broker_nodes

kafka_brokers_rtt_average_milliseconds

Broker latency / round-trip time in microseconds

  • Type: Gauge
  • Tags: broker=broker_nodes

ack_event_rtt_ms

Time taken from ack function called by kafka producer to processed by the ack handler.

  • Type: Timing
  • Tags: NA

event_rtt_ms

Time taken from event is consumed from the queue to be acked by the ack handler.

  • Type: Timing
  • Tags: NA

kafka_producebulk_tt_ms

Response time of produce batch method of the kafka producer

  • Type Timing
  • Tags: NA

PubSub

pubsub_messages_delivered_total

Number of delivered events to PubSub. The metric also contains false increments. To find the true value, one should use the difference between this and pubsub_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

pubsub_messages_undelivered_total

The count of false increments done by pubsub_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

pubsub_unknown_topic_failure_total

Number of delivery failure caused by topic does not exist in PubSub.

  • Type: Count
  • Tags: topic=topicname event_type=* conn_group=*

Kinesis

kinesis_messages_delivered_total

Number of delivered events to Kinesis. The metric also contains false increments. To find the true value, one should use the difference between this and kinesis_messages_undelivered_total metric for the same tag/labels.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kinesis_messages_undelivered_total

The count of false increments done by kinesis_messages_delivered_total. To be used in conjunction with the former for accurate metrics.

  • Type: Count
  • Tags: success=false success=true conn_group=* event_type=*

kinesis_unknown_stream_failure_total

Number of delivery failure caused by stream does not exist in Kinesis.

  • Type: Count
  • Tags: stream=streamname event_type=* conn_group=*

Resource Usage

server_mem_gc_triggered_current

The time the last garbage collection finished in Unix timestamp

  • Type: Gauge

server_mem_gc_pauseNs_current

Circular buffer of recent GC stop-the-world in Unix timestamp

  • Type: Gauge

server_mem_gc_count_current

The number of completed GC cycle

  • Type: Gauge

server_mem_gc_pauseTotalNs_current

The cumulative nanoseconds in GC stop-the-world pauses since the program started

  • Type: Gauge

server_mem_heap_alloc_bytes_current

Bytes of allocated heap objects

  • Type: Gauge

server_mem_heap_inuse_bytes_current

HeapInuse is bytes in in-use spans

  • Type: Gauge

server_mem_heap_objects_total_current

Number of allocated heap objects

  • Type: Gauge

server_go_routines_count_current

Number of goroutine spawn in a single flush

  • Type: Gauge

server_mem_stack_inuse_bytes_current

Bytes in stack spans

  • Type: Gauge

Event Delivery

Following metrics are event delivery reports. Each metrics reported at a different point in time. See the diagram below for to understand when each metrics are reported.

Diagram

events_rx_bytes_total

Total byte received in requests

  • Type: Count
  • Tags: conn_group=* event_type=*

events_rx_total

Number of events received in requests

  • Type: Count
  • Tags: conn_group=* event_type=*

events_duplicate_total

Number of duplicate events

  • Type: Count
  • Tags: conn_group=* reason=*

batches_read_total

Request count

  • Type: Count
  • Tags: status=failed status=success reason=* conn_group=*

batch_idle_in_channel_milliseconds

Duration from when the request is received to when the request is processed. High value of this metric indicates the publisher is slow.

  • Type: Timing
  • Tags: worker=worker-name

event_processing_duration_milliseconds

Duration from the time request is sent to the time events are published. This metric is calculated per event by following formula (PublishedTime - SentTime)/CountEvents

  • Type: Timing
  • Tags: conn_group=*

server_processing_latency_milliseconds

Duration from the time request is received to the time events are published. This metric is calculated per event by following formula(PublishedTime - ReceivedTime)/CountEvents

  • Type: Timing
  • Tags: conn_group=*

worker_processing_duration_milliseconds

Duration from the time request is processed to the time events are published. This metric is calculated per event by following formula(PublishedTime - ProcessedTime)/CountEvents

  • Type: Timing
+ + \ No newline at end of file diff --git a/roadmap/index.html b/roadmap/index.html index d8a2bf97..ee96211b 100644 --- a/roadmap/index.html +++ b/roadmap/index.html @@ -7,14 +7,14 @@ -Roadmap | Raccoon - - +Roadmap | Raccoon + +
-

Roadmap

In the following section, you can learn what features we're working on, what stage they're in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the discussions on the Raccoon Github forum.

We’re planning to iterate on the format of the roadmap itself, and we see the potential to engage more in discussions about the future of Raccoon features. If you have feedback about this roadmap section itself, such as how the issues are presented, let us know through discussions.

Vision

We want to enable Raccoon as the preferred event collector, event distributor that provides high volume, high throughput, low latency protocol-agnostic, event-agnostic APIs for data ingestion in near-real-time. With this vision, Raccoon can serve the needs of Adtech streams - Where digital marketing data from external sources can be ingested into the organization backends Clickstream - Where user behavior data can be streamed in real-time Edge networks - Where devices (say in the IoT world) need to send data to the cloud. Event Sourcing systems - Such as Stock updates dashboards, autonomous/self-drive use cases

Raccoon 1.x

  • Support for HTTP, gRPC
  • Support for json, protobuf formats
  • Extendable event distribution
  • Extendable event filtering capability
  • Enable Raccoon to replay lost events with zero-data-loss capability
  • Adopt Raccoon to publish to different transport systems
  • Enables Raccoon to provide extendable data formatters. eg. JSON to proto
- - +

Roadmap

In the following section, you can learn what features we're working on, what stage they're in, and when we expect to bring them to you. Have any questions or comments about items on the roadmap? Join the discussions on the Raccoon Github forum.

We’re planning to iterate on the format of the roadmap itself, and we see the potential to engage more in discussions about the future of Raccoon features. If you have feedback about this roadmap section itself, such as how the issues are presented, let us know through discussions.

Vision

We want to enable Raccoon as the preferred event collector and event distributor that provides high volume, high throughput, low latency protocol-agnostic, and event-agnostic APIs for data ingestion in near-real-time. With this vision, Raccoon can serve the needs of

  • Adtech streams - Where digital marketing data from external sources can be ingested into the organization backends
  • Clickstream - Where user behavior data can be streamed in real-time
  • Edge networks - Where devices (say in the IoT world) need to send data to the cloud. Event Sourcing systems - Such as Stock updates dashboards, autonomous/self-drive use cases

Raccoon 1.x

  • Support for HTTP, gRPC
  • Support for json, protobuf formats
  • Extendable event distribution
  • Extendable event filtering capability
  • Enable Raccoon to replay lost events with zero-data-loss capability.
  • Adopt Raccoon to publish to different transport systems
  • Enables Raccoon to provide extendable data formatters. eg. JSON to proto
+ + \ No newline at end of file diff --git a/support/index.html b/support/index.html index 9476768f..bbfd0d6e 100644 --- a/support/index.html +++ b/support/index.html @@ -7,17 +7,17 @@ -Need help? | Raccoon - - +Need help? | Raccoon + +

Need help?

Need a bit of help? We're here for you. Check out our current issues, GitHub discussions, or get support through Slack.

Slack

The Raccoon team has an open source slack workspace to discuss development and support. Most of the Raccoon discussions happen in #contribution channel. -Join us on Slack

Issues

Have a general issue or bug that you've found? We'd love to hear about it in our GitHub issues. This can be feature requests too! +Join us on Slack

Issues

Have a general issue or bug that you've found? We'd love to hear about it in our GitHub issues. Feature requests are welcome too! Go to issues

Discussions

For help and questions about best practices, join our GitHub discussions. Browse and ask questions. Go to discussions

- - + + \ No newline at end of file