diff --git a/site/.nojekyll b/site/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/site/404.html b/site/404.html new file mode 100644 index 00000000..de3731a6 --- /dev/null +++ b/site/404.html @@ -0,0 +1,14 @@ + + + + + +Page Not Found | drand + + + + + +
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/site/assets/css/styles.7acb8680.css b/site/assets/css/styles.7acb8680.css new file mode 100644 index 00000000..79fe22d1 --- /dev/null +++ b/site/assets/css/styles.7acb8680.css @@ -0,0 +1 @@ +.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}pre,table{overflow:auto}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)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.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:#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-footer-logo-max-width:min(30rem,90vw);--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:#008caa;--ifm-color-primary-dark:#006392;--ifm-color-primary-darker:#003b6f;--ifm-color-primary-darkest:#0f1643;--ifm-color-primary-light:#00b5b5;--ifm-color-primary-lighter:#4cddb7;--ifm-color-primary-lightest:#c8fcea;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--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;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.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{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);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}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)}.list_eTzJ article:last-child,.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 #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{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{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}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)}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_Gvgb,.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{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:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].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{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(-1px);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)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.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:var(--ifm-footer-logo-max-width)}.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_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p: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,.title_f1Hy{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)}.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{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.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)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);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}.announcementBarContent_xLdY,.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:1rem;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);transform:translate3d(-100%,0,0);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;right:0;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,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);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,.sidebarItemTitle_pO2u,.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}#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}[data-theme=dark]{--ifm-color-primary-darkest:#c8fcea;--ifm-color-primary-darker:#4cddb7;--ifm-color-primary-dark:#00b5b5;--ifm-color-primary:#008caa;--ifm-color-primary-light:#006392;--ifm-color-primary-lighter:#003b6f;--ifm-color-primary-lightest:#0f1643;--docusaurus-highlighted-code-line-bg:#0000004d}.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}.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}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.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,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[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}.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}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.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)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.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}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.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:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.authorListItem_n3yI{list-style-type:none;margin-bottom:2rem}.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 var(--ifm-transition-fast) 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;overflow-wrap:normal;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{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;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}.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:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.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}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.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}.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}.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}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG: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%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;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_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{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_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!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,.sidebar_re4s,.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}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@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}.title_f1Hy{font-size:2rem}}@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 (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/site/assets/images/Go-Logo_Blue-6a3cd1884425f3b03c7dfc819b3abac8.png b/site/assets/images/Go-Logo_Blue-6a3cd1884425f3b03c7dfc819b3abac8.png new file mode 100644 index 00000000..d6d98c3b Binary files /dev/null and b/site/assets/images/Go-Logo_Blue-6a3cd1884425f3b03c7dfc819b3abac8.png differ diff --git a/site/assets/images/JavaScriptBadge-130c0ecd57833da6f75c6e5acfc50b09.png b/site/assets/images/JavaScriptBadge-130c0ecd57833da6f75c6e5acfc50b09.png new file mode 100644 index 00000000..aca0a0ba Binary files /dev/null and b/site/assets/images/JavaScriptBadge-130c0ecd57833da6f75c6e5acfc50b09.png differ diff --git a/site/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg b/site/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg new file mode 100644 index 00000000..11bda092 Binary files /dev/null and b/site/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg differ diff --git a/site/assets/images/league-members-fd5562d01d57b04331fa2e75a9954cc6.avif b/site/assets/images/league-members-fd5562d01d57b04331fa2e75a9954cc6.avif new file mode 100644 index 00000000..228e6ca3 Binary files /dev/null and b/site/assets/images/league-members-fd5562d01d57b04331fa2e75a9954cc6.avif differ diff --git a/site/assets/images/league-of-entropy-c53918ec1c15ce148a65857a820b1014.avif b/site/assets/images/league-of-entropy-c53918ec1c15ce148a65857a820b1014.avif new file mode 100644 index 00000000..b3081bdb Binary files /dev/null and b/site/assets/images/league-of-entropy-c53918ec1c15ce148a65857a820b1014.avif differ diff --git a/site/assets/js/01a85c17.b1c4f5a5.js b/site/assets/js/01a85c17.b1c4f5a5.js new file mode 100644 index 00000000..ebb5b3af --- /dev/null +++ b/site/assets/js/01a85c17.b1c4f5a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8209],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>d,J_:()=>f,Gx:()=>y});var s=a(6540),n=a(9532),i=a(6803),r=a(4848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(o.Provider,{value:i,children:t})}function d(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var m=a(6025),u=a(4586);const g=e=>new Date(e).toISOString();function h(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,m.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,d=s.image??n.image,m=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...h(i.authors),...p(d,a,l),...m?{keywords:m}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=d(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,m.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...h(a.authors),...p(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var N=a(6347),v=a(8774),C=a(1682),k=a(9169);function y(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function P(e){let{items:t,ulClassName:a,liClassName:s,linkClassName:n,linkActiveClassName:i}=e;return(0,r.jsx)("ul",{className:a,children:t.map((e=>(0,r.jsx)("li",{className:s,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:n,activeClassName:i,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>O});var s=a(6540),n=a(4164),i=a(781),r=a(4581),l=a(1312),o=a(4096),c=a(6342),d=a(1107),m=a(4848);function u(e){let{year:t,yearGroupHeadingClassName:a,children:s}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(d.A,{as:"h3",className:a,children:t}),s]})}function g(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:s}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,n]=e;return(0,m.jsx)(u,{year:t,yearGroupHeadingClassName:a,children:(0,m.jsx)(s,{items:n})},t)}))})}return(0,m.jsx)(s,{items:t})}const h=(0,s.memo)(g),p="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:t.title}),(0,m.jsx)(h,{items:a,ListComponent:C,yearGroupHeadingClassName:v})]})})}const y=(0,s.memo)(k);var A=a(5600);const P={yearGroupHeading:"yearGroupHeading_QT03"},_=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function w(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)(h,{items:a,ListComponent:_,yearGroupHeadingClassName:P.yearGroupHeading})}function B(e){return(0,m.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function H(e){let{sidebar:t}=e;const a=(0,r.l)();return t?.items.length?"mobile"===a?(0,m.jsx)(G,{sidebar:t}):(0,m.jsx)(y,{sidebar:t}):null}function O(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,m.jsx)(i.A,{...r,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(H,{sidebar:t}),(0,m.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,m.jsx)("div",{className:"col col--2",children:a})]})})})}},9158:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var s=a(4164),n=a(1312);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(1213),l=a(7559),o=a(8027),c=a(6133),d=a(1107);const m={tag:"tag_Nnez"};var u=a(4848);function g(e){let{letterEntry:t}=e;return(0,u.jsxs)("article",{children:[(0,u.jsx)(d.A,{as:"h2",id:t.letter,children:t.letter}),(0,u.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,u.jsx)("li",{className:m.tag,children:(0,u.jsx)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h(e){let{tags:t}=e;const a=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[s]=t;return a.localeCompare(s)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}(t);return(0,u.jsx)("section",{className:"margin-vert--lg",children:a.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var p=a(1463);function b(e){let{tags:t,sidebar:a}=e;const n=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:n}),(0,u.jsx)(p.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:a,children:[(0,u.jsx)(d.A,{as:"h1",children:n}),(0,u.jsx)(h,{tags:t})]})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(8774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(4848);function l(e){let{permalink:t,label:a,count:l,description:o}=e;return(0,r.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(i.tag,l?i.tagWithCount:i.tagRegular),children:[a,l&&(0,r.jsx)("span",{children:l})]})}}}]); \ No newline at end of file diff --git a/site/assets/js/0a40e68b.3ed906ab.js b/site/assets/js/0a40e68b.3ed906ab.js new file mode 100644 index 00000000..09a9c184 --- /dev/null +++ b/site/assets/js/0a40e68b.3ed906ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9517],{8008:(A,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var d=n(4848),r=n(8453);const t="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAABaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAsaWxvYwAAAABEAAACAAEAAAABAAAMAQAACj0AAgAAAAEAAAGIAAAKeQAAADhpaW5mAAAAAAACAAAAFWluZmUCAAAAAAEAAGF2MDEAAAAAFWluZmUCAAAAAAIAAGF2MDEAAAAAGmlyZWYAAAAAAAAADmF1eGwAAgABAAEAAACvaXBycAAAAIppcGNvAAAAFGlzcGUAAAAAAAAAgAAAAIAAAAAMYXYxQ4E/AAAAAAAQcGl4aQAAAAADCAgIAAAADGF2MUOBHxwAAAAADnBpeGkAAAAAAQgAAAA4YXV4QwAAAAB1cm46bXBlZzptcGVnQjpjaWNwOnN5c3RlbXM6YXV4aWxpYXJ5OmFscGhhAAAAAB1pcG1hAAAAAAAAAAIAAQMBggMAAgQBhAYFAAAUvm1kYXQSAAoGH9m//y1QMuwUZGeNfyAQGAg4AAAAAAACCkEEQOIufVI+vHMXVQBBiRWKX+kmNGsOI3f7zROTD2HDfsrcXbXSvITcf71/mo9WiELZG4ysB0qeJ7f+Z0vYy1+Tly+cM3P93eM0pF7CzGwYO5ggJkx8/WCdw96ctVDtQsIhxoCYg2qnAuPYlmrM3zpij6/AC7+wGy+v3obVMMkqMxoIHBdmJVb1xUEwDPhEYFM0U8ao8GX+tL7ZlLHM2DrQfh5QwH3fTFroI8EpmOeRavBhKxtLxW6J2qdVxsAgLVkzshczowcmkU6tEVedSW3K2CfB1FZ/TOcH7EfwE/bpNgompnKZOt4vNY1iafSnnIWLOT5Q2NHAyJdPkj1cE32PMvO/P4Vhk3x6Me2Ro5UKHQxJbkE20KVAv0clLshDwa231ewQRrldXGHzhs786XzeLujg/rfbD5IBK1pX/KKf+JlstdgknFNp3AH24MVpRRgpWVK15VkhtgmL2LiULiQ0VwLuyOIAN2wdlzOM7pmquvUELouFAlu3pepnKlQx7u/zkvVBNZJTaMFlc+a40gFx4UAM9BKN9yL4MeqNtL+Mrww3beHAM4JV/A1N9pR8RI1wG6gVoLhb7PFqFWOqufJgjP8byr9xE0/XGFx86+WTvakfrSOr1qTr7lc/tDejwLibNWbYTdYnXjREh9I1qbmAFc9ROgvtB5akPui6+GPSwC6hkHSh19rhI+ptCZ8r6UB09iOFWX0TC/vXp7Mqqpm6sQXi5NZpaKH29bOvyUaS8fqHq6BIVZaL7PjsITRPRtxr4YVjg+VvNX/rglfdJNLSXBIYIx2zrLPHo+s9FLmkZv5KYAoxx7l2VguJnFxTqMk4BPGTwyZMQ+DhfUhGlAGZNvKlqQTTY+GRPFz1UGLZrVKF2dtIcHt0B1nAPBcyMDaA2qjUAShxtt9Faty//C012wI67+X93X9YqM9CXA5PwCfKear1tLqUzBzOF2AzX0kJIcFt+WMm5T6HoGcnbx/UuVOglTrTI54fD/+Jona3aPu/Gd4mkqLEcOQfr6N1TJifn8LoFjGfUobAMu3JJ6oEQxzR6/wzXNsuy0CO9JC4pIZTvF8W3GN1djN0Dv8TZlsXWyayHC0YoJHOsUxR7ZUYsLMbcpAAyy/JrIk829oh2fnl/K6IDpYPBRvRDiev/9sPlslwdyePi97wElwltgu6WVGDZuaksmPJm+NCoZTKKTPCy4ElBv0TwykLDyCSp+OwALTQob0I5JcuQh548HrUfbk76rFu4RNFQYPuAE5eEkso2EvloF/EFWwKh59WmYF0BjMgs2udycOVFN/xyPZT4fQaC8T4VClO3195k+PXyhnWLPNZ/qComSggQObSZf/rSO7G4Vtw0vzm+EOZKawffBdeEITN2oT/aDDvke5KsvYpPZv6cK4Xpphmf3D02HynGvXn2e/DjWjYusmAwXhymJS5NQuR4R+Vkk7+E/tvzvde9jhuFg5hJ9w2wKPPWBoYEC+y2f72MIlw9Cfs4lmy9F+QjAYTGHCnraNPPrR66QRUb8FiysUJqd1LmEFr+cd+t5vgRHY0G3HPahGclaySzebXeZjCeaI+CwaSwUDDf+AmdxJ7owsG+0eM1iZp48KMOskRrHYI2sbcdhLH+ysp27U9TWyYFQVcjXHN8WQdK/6RiULdmHz0Ap8ZxouH3I5kr6EYsOOJ7hXkm+JC6MDJX3M0O46o61GXOB9UFmItu2GEk6ZTdwnD2q05bq6aCDG8m7SSkKXqRtyIasnOOgAFP9cjaZ/NxejBoxmehO4JeZhjR32DX0oQRyUqCuGc/dZE1shwza0IkhUCrgk/8oaPH+ghBb2uUXQxmOxxa8Cu0GCsQkanOvCcEZWipXAf6KkW/xr4SXKBDPMPbJ9bpWg0HzAetSS7gpLmiTCAeLVC8p47pNQaBXHtFg9ON4Y+oHOY0TZvcojwWYH3Xdv23O5IUnXIXaKMJ3R8fh5zZS1wMikKcQqzcddrkkzrJukW4ZE7k7bv93bQv6kHvxCxP/6K9Hbp2KRQkMXSHv7jOUmOhSZ2UJ0y+4gXVh14GtCMPjZLpQmLkhgBkN2yLdJ9gVJOcgbrACd6RroUdJBRIgIPJcddNqnDisyo+pSYS4oOY++hmUe2nuhyWyZrBhG0PQYiqvr+3g0al0ZLlrxEFncDc/lePxxqVKQpVkznEpfs/qNd3h2+fCroATcs8AL1cvjp0cW4YnO2bImaQu0ATiJzPTvrbLpqgfn1ZlqjeZd0LkGfiWdxehpP48S1u2SWwOio3srICtrU6HQlKePe+DMcw44z3si/iAKTOY574BZvNhIDbp15ocMMsAB0byASGmyeoebmKzTxHB41j4CQtSJQC96B8EwF0N6q+DEprD1+AYR/arcCFRWWu89nr2WiYU7UKI+jOw+/AbaHcp/5FO2dHSXyhq+R0TreMcdXAmUnSmnv/chiE8VkB2Enw0IqY6mDmz63y8MBSxD+3MkzUYaqNNHLhXGy36pP8XuNoLA/5dThnUOOpmIT8NGEK8qLxi4g9pyw81CpaaytqRBGDI+tfocmdrkZY6eQJetwMHgkvEDG4rJeMNoX33Hpy4T6kbeTl4urZp8UmuMc3spPxHZw/A3BM8qndBJYyCsxikzQvvKLK+SuFmW2g6+e8dAvlCLNwFeaLvUZ0vEUzzlJH5BfVZNiX2c6E19rWubRBlzRF40iI9oY95lssp/yVHsAjozNTwOPqfWwvHKyEXvdelx6rcbPDOpIt4ORkf6eixN8eH7xJLYl9wcd2gjJqZDdDXUIsvfs1KGsOd3yrgjRXVnSUCYSe/pRSoFiOm4gBDM14Ii1/YqFi/k/TG/P0HL8M8+DvlmBAQ2DMqZLIY6MNglm4VqzOnIG9QFyaZRMvxxvuHxqAqJr7AJcZPwPRGnGubS5p+ivM35PvmxCLmNjpbQ6ZTQMr7IF3s+XrNntfSjQyZN0y2hnkwnBgN1UeT2jl9B8O8t9Jtdbgihn0QC3Enf734xXDIqAGbO5AiQ5yvJEFD7JdXcVs8L5y0zHFpLv0FYpNhY8jKrvk4zqkpbdND3/fxGTE1r0ER1pwnNG1t0CaKkOZpazFj1OrLE9pdP9P9u5ZhwzSHQt71Yz7zPbAyuG2QzvddQCN+FqgtmgsIB92xsXNSaY9BaXpUj4eSqVpEe8qP6quz8IL0tgjzFq1YJbfVfFFj0i4b/j0lbc4UJqlC/y6I6d/3q1nZTDlV67U40anRYIMZJwY5OOZlFaQ/T3D6eyObPjgUmsbTTQE3YVJRQNziwQmKR2BfrA1i2/gGCYWw0BV33iqw+GfRQecmfpBLQNtdIX9kE/2xLeATq/c/5wo2YU+4UjNO05S+LOlzfG90Q0yQRGDX4IP63VptEjQeUQlWIVNtdzY8gm3Gt7H67Z8BMcG4w+LJ1d2kUgxCevjJ2cAerf63HAQvC40fpQjnJuJ6Rqd1w/sIIvSrPRuDQXDfwocxDQo7OQ7+mIj7AsL8H1qtmjUp8816uvFHIMSZWnj6L34vF/nBykO/VwxhOSZhAJv0VaTBf8hhIACgk/2b//LQENBtAyrRRkYovQycT/P7gIDAQiAAAAAAAAmyuiCCCKgPYKM0z00+Zp92OfpXtPhbHTWztLV9DKITPh9eOT8hFyNCizYDzeQxsM3QnNFK4xkq6MvLAhYyYQWpEAuOHvJhHlhI1tgjKOii2K4ysmYSzIai0WoN4g/iVwJSxs7hCci5RgpZ8Tio0T/GsQRWagQiu36Boi9cFEAGpNl6ae83ZA6+Ina5bSClPG5vYyw6WiBPgY9AQbuO94cdPCDpYpwd2OMcIk+p3nCpQTnS3q2ga7UiLRTBhqyABdGRzYg7E9P6mAXe5kuuI7jRnpWf50LJiytEDyNjZ1ODluUkyhVVyL4fa4eLPqa5zTRb3RfuAOYBOjTdtlwmJaoGof4Nts+N5cahPGQf4ePE3gkFacE+L+PkkmwhZlEy9S959ZU6Z+6xawTebfxnOr2PiOgKaORDpatOAwGK67NMmfvv3paJY5gf+3iNWSw4r0LZqIKL/84uuOCd+sTUz0wQVb1dl0i57wyICrzGHYTG3fWAuObCAnV71jOosK2Pa1M4GyM5QQj+waWgn8/MnxTi+L2xX9U31DslfuR7dH+6Jr/ZpI2DoHnE7e2RVLolhy7WLbpb50tftlQj/xPWK9RtXYMW6JWGeVwYAqzxYKaX9jUGey7dLsooHtwZatNFxbddJtalB9kczigvS7dFw/xRxEcKiDGZGzwQipYeYSTbEn1wB9DM1KJ0fIbYUoVDIWA1Kz8xFvNcqULyVNAXQ6oVbHJLY1l2xPnuxV7qPRymUeF39QdwzVC52m60GeTMPfV5Z6ndW8bZX24Yr9f9DnChTGElPs/fiGiZrFOvJJTp14dtiKxXmBm+i8GFY1TUQuSCx3ezvRWh97zJBDpvw+wBwG6LjZ78LTEz0UlFiY1N/5vvIcTJC65xPdKf/PD/5zAX762/ajCQTG0rJCYiY3fXbxobdvy2wyB0RiCfDh97Oz1z/lVc6MnXtG8pJi4ii8nXMHfVIMtul5XTBtktkgkH54Gv3spMV7n/Pyf626fAE4VyF3APVr609c6fDuuVe/rMv8h6qxFzVliuGjv2QK87P2DaSWMiKu7B2FflYCLpmJ8xIBdlb7cNc26LaGcYLPoOAq2EavyeSvPq+kUBNKqCPogiBw1414+zfUF6gsNlLnhL3KqCKzTMd+XKsG146d5v6CHc03n7tBCkd3SdJ6NwPZkVxuWmbsecaxisHZXlZVVpGdd33RWec00H58VHIBeuOeJXFNbYzfLgWd7pRlbHcwwpr4Gal8qZwJOPet4bwApKwiDFa7DiCXpOnY9MoFRZTpgBR3wxIfh9WA1JdH63hy+R2lP9GbPzheizEBXa/yw/3tIgb8PRrOlWfZ+QEVmATdWhb/j/dD6Gob1x1izq1S+YkNydPD9372LhnTX2V5G5JEhWCn0BzQmmlBAb49PEPnVmgTmJ22FsTmP97TofoBq2RuTle79nggRk6OgZ7obdNxT6kB9HGfF3IoT0aiL6epMR2IkWwYf94hLI54H034ePBQ/w7u2/TLeXWb9WftWZsZBPCB6UmgwOynPkwM5hQ2giKY9e0OXXRnVsHm0TpzbaNY+s0WCuByskAZqmKLA9CjvrQBMYlZPQ+h6ev4To3Kfp+bh6rpwfqqlA0kEwwOdkNzHvHUkSCT/VWTmOetRUYm0n8dlRv8TsA408tYsNdO8JAcpjGAxenoRpzMq9Y2ZfukPKttry1ic+UXCjuA2ASukxH+ir5jJQ/lJ8K50ILmf3BYTXgzF+4BIOdnvXfdu0JrEPBOU1Z7yxhkqw85/NQNiXxuPanVo9fglkSooAC1Wn/OT8hj4/5oC/GXivQmHR3GC+KuxUJ2DJW2TLWFZ7xVNqZpzFajn2RShuUcuJflb23Pa5rUwN5QRLWF+Iy2JUFL/vU3mkms8JVady3kPDJYpp8N7h5f7FG2S1RcFiNaWadnnWvEluOfPn/Bjm/pV8BAfbcSsfhj64a8q+WInjpoJZNa/9ndTwTbdX7Sk5LKWbilIZV7e08y5M8/J75BY7dBAB2WuaF8GsGiMVlpqSq5VZHuH/mtq7C8WsSmxZndpS+/R2TeN1Ac28spwGkyH+abFZhrpQo/jWifs53ZMFgNmwRGHsVZpKgkvbm3gAzsJgiviANrtMLPrTd9K71XoZt+RBPcoI99bqR4YwG/kKCbnyqx9p61uVbEYk336M00hPOBz7zC1PceqhPk2iTrTPswQhLH8i4WyTHkQMrjKG5PeY9JnmJYTPm6NUdk0FF7NA32W0pquF0h42o50h8rifBGMpQkRw7Q6khHATCyr0Q5EVsQcuN+j0TIEMoKvqH5IkEiTTTGJpMSQgq2rS/4jrMBwChA7v9lVmHiH29+Ul0JxEK4VHL/T1O52b9DqA35zSqFIX15rdjFBHV4CWRGFAtWbkEx8T/EYP1ragZriBCcTq5EtCEg+sf9jDHfdDR0Kqw8fg79Hk6fRzvTARQdIYGFPf+yL00u1C1PgQWEQd6gpTl/wguVtOJojc/DS5jikpwh6sMcDxAZsZ5xFp98J83zaIFexckyCF4lM/a0sVpu583MnsY6t8YqYXs+RA7Qo7pe6XX/TQWewLZATH2ujQcFXs2IrTbyA88Y2LGAL9evaBhYosFaICbzFQmIKPPkwT4suC1x6WJt9R50wr64phBLXF3jEq8NvQfxosmJR4HPm2EyyAF/4B5v9bdlb9brVsg7XI7lmrIjMJoP5nX88he7upBYwgkQWUY/NJ06+3AIxgh7lH3CH81wkSkaL33vLA4/A0SdsB8TBMdGdrrrXhDpmyIZ9UGQkcef9+plko0/fkKWAjcVPS8MTGdgM083PVP72s1Ogspe6pJFGw70oAGPmjSoupDhOHGcmKTjdq9gGdNegWjcj4tMlO8skZgjiwXT+FU7avCdB7PGCu978Um7CCBuMXhRswradFoBqpypngTtB8+KLz0b2qZkksa61ASmGZl0xRZfEsK/hPfUP13XSC3FVmsp2mewpGj4mF2dEIdjskVjgyMoQCW4098aq9nzMTIox7CU49xdZUaqlhz7Q+yJd++MPBQHjDbrNVtIET3pdbrrxtVhm2SssaKq2haKkLW3xVlWHVAurWGbaKYKjDjN9FVrdCFpP2EStZ3KVSS2BodgVBpASN9LCcFVimzPtHvaZDrwaIT28KZHIkX3HA8VYuG3N/evYWJiiiHB+FtOp6AfqlZcsEyKhMFTFvCR3a5TaIjhBbHO8fwHTzsNR0+t7LgvwgawNuT9GV470Q/Lxkwm0ugs5+eHri7lWAyKPFD4/D5Lx0F96bgN1nTV9/QM1FRfKjmOHIhafTqvL8y4jcwQLp51lkBkQgYbbH2C5LVkCNk13VMAzpFUiYsWFQo4RcKDdIdnsREbiTnopSK7QRbiAKxW6WFMlWBpG9bZHH3u7ORwQDWaZwBQErpmWydzvx/lLqTMujeAMfoQmb1RGK0k",o={sidebar_label:"Home",sidebar_position:1},s="Welcome to the drand docs \ud83c\udfb2!",a={id:"home",title:"Welcome to the drand docs \ud83c\udfb2!",description:"Use this documentation to add secure, high-entropy, verifiable randomness to your application.",source:"@site/docs/home.mdx",sourceDirName:".",slug:"/home",permalink:"/drand-docs/docs/home",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/home.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_label:"Home",sidebar_position:1},sidebar:"docsSidebar",next:{title:'1.0 About (What is "drand"?)',permalink:"/drand-docs/docs/category/10-about-what-is-drand"}},i={},c=[{value:"Contents:",id:"contents",level:2}];function p(A){const e={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...A.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(e.header,{children:(0,d.jsx)(e.h1,{id:"welcome-to-the-drand-docs-",children:"Welcome to the drand docs \ud83c\udfb2!"})}),"\n",(0,d.jsx)("img",{src:t}),"\n",(0,d.jsx)(e.p,{children:"Use this documentation to add secure, high-entropy, verifiable randomness to your application."}),"\n",(0,d.jsx)(e.p,{children:"This is the documentation site for drand including both general and developer documentation."}),"\n",(0,d.jsx)(e.h2,{id:"contents",children:"Contents:"}),"\n",(0,d.jsxs)(e.ul,{children:["\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/10-about-what-is-drand",children:"1.0 About"})," | A brief explanation of drand."]}),"\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/20-concepts-getting-started",children:"2.0 Concepts"})," | A brief introduction to key concepts."]}),"\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/30-developers-guide",children:"3.0 Developers Guide"})," | Assistance for developers who wish to use drand."]}),"\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/40-operators-guide",children:"4.0 Operators Guide"})," | A guide for drand node operators."]}),"\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/50-drand-community",children:"5.0 drand Community"})," | Ways you can connect with the drand community."]}),"\n",(0,d.jsxs)(e.li,{children:[(0,d.jsx)(e.a,{href:"category/60-drand-faq",children:"6.0 drand FAQ"})," | Frequently asked questions about drand and their answers."]}),"\n"]})]})}function h(A={}){const{wrapper:e}={...(0,r.R)(),...A.components};return e?(0,d.jsx)(e,{...A,children:(0,d.jsx)(p,{...A})}):p(A)}},8453:(A,e,n)=>{n.d(e,{R:()=>o,x:()=>s});var d=n(6540);const r={},t=d.createContext(r);function o(A){const e=d.useContext(t);return d.useMemo((function(){return"function"==typeof A?A(e):{...e,...A}}),[e,A])}function s(A){let e;return e=A.disableParentContext?"function"==typeof A.components?A.components(r):A.components||r:o(A.components),d.createElement(t.Provider,{value:e},A.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/0f048bff.1592e817.js b/site/assets/js/0f048bff.1592e817.js new file mode 100644 index 00000000..81d74da7 --- /dev/null +++ b/site/assets/js/0f048bff.1592e817.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8551],{1516:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var i=s(4848),t=s(8453);const r={id:"2-2-concepts-security-model",title:"2.2 Security Model",description:"Describes drand\u2019s security assumptions."},o="2.2 Concepts: Security Model",c={id:"concepts/2-2-concepts-security-model",title:"2.2 Security Model",description:"Describes drand\u2019s security assumptions.",source:"@site/docs/02_concepts/02-02-Concepts_Security_Model.md",sourceDirName:"02_concepts",slug:"/concepts/2-2-concepts-security-model",permalink:"/drand-docs/docs/concepts/2-2-concepts-security-model",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/02_concepts/02-02-Concepts_Security_Model.md",tags:[],version:"current",frontMatter:{id:"2-2-concepts-security-model",title:"2.2 Security Model",description:"Describes drand\u2019s security assumptions."},sidebar:"docsSidebar",previous:{title:"2.1 Cryptography",permalink:"/drand-docs/docs/concepts/2-1-concepts-cryptography"},next:{title:"2.3 Specification",permalink:"/drand-docs/docs/concepts/2-3-concepts-specification"}},a={},d=[{value:"\ud83d\udcd5 Key Terminology",id:"-key-terminology",level:2},{value:"\ud83c\udf12 Security Phases",id:"-security-phases",level:2},{value:"Phase 1. Distributed Key Generation (DKG) Setup",id:"phase-1-distributed-key-generation-dkg-setup",level:3},{value:"Phase 2. Randomness Generation",id:"phase-2-randomness-generation",level:3},{value:"\ud83d\udca5 Attack Vectors & Mitigations",id:"-attack-vectors--mitigations",level:2},{value:"Randomness Generation Attacks",id:"randomness-generation-attacks",level:3},{value:"Distributed Key Generation Attacks",id:"distributed-key-generation-attacks",level:3},{value:"Conclusion",id:"conclusion",level:2}];function l(e){const n={h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"22-concepts-security-model",children:"2.2 Concepts: Security Model"})}),"\n",(0,i.jsx)(n.h2,{id:"-key-terminology",children:"\ud83d\udcd5 Key Terminology"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Drand Node"}),": A node running the drand daemon, participating in generating randomness across one or multiple networks. A drand network consists of interconnected drand nodes, each with a long-term public key and a private share."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Relay Node"}),": A node connected to a drand daemon, providing an Internet-facing interface to fetch public randomness. The relay network consists of relay nodes that may be partially connected."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Corrupted Node"}),": A node controlled by an attacker, giving access to all its cryptographic material and network authorizations."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Offline Node"}),": A node that is unreachable from an external point of view."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Online Node"}),": A node that is running and correctly transmitting packets over the Internet."]}),"\n",(0,i.jsx)(n.h2,{id:"-security-phases",children:"\ud83c\udf12 Security Phases"}),"\n",(0,i.jsx)(n.p,{children:"In drand, there are two main phases, each with specific security assumptions:"}),"\n",(0,i.jsx)(n.h3,{id:"phase-1-distributed-key-generation-dkg-setup",children:"Phase 1. Distributed Key Generation (DKG) Setup"}),"\n",(0,i.jsx)(n.p,{children:"The DKG protocol follows Pedersen's protocol, ensuring:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Synchronous Network"}),": Packets reach their destination within a bounded time."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Synchronized Clocks"}),": Nodes have synchronized clocks with minimal offset."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reliable Broadcast Channel"}),": All nodes receive the same packet within a bounded time."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Authenticated Channel"}),": All communications are authenticated."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Public Group"}),": Nodes know each other's public keys before starting the DKG."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"phase-2-randomness-generation",children:"Phase 2. Randomness Generation"}),"\n",(0,i.jsx)(n.p,{children:"The randomness generation phase ensures:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Network Flexibility"}),": No strict network bounds; nodes process packets as they arrive."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Synchronized Clocks"}),": Nodes start rounds simultaneously with accurate clock synchronization."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Broadcast Channel"}),": A regular broadcast channel suffices for partial beacon transmission."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Threshold"}),": A specific number of nodes must be online and honest to create the final random beacon."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Determinism"}),": The chain is deterministic with respect to a fresh DKG phase."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"-attack-vectors--mitigations",children:"\ud83d\udca5 Attack Vectors & Mitigations"}),"\n",(0,i.jsx)(n.h3,{id:"randomness-generation-attacks",children:"Randomness Generation Attacks"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Front Running"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Passive Adversary"}),": An attacker listening to traffic might aggregate the final beacon before others."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Active Adversary"}),": An attacker tries to disable half of the nodes, deciding whether to release the final beacon."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Denial of Service (DoS) Attacks"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scenario"}),": Sustained DoS attacks can halt the chain if enough nodes are disabled."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Defense"}),": Block incoming traffic early, allowing only known IP addresses."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Corruption"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scenario #1"}),": Attacker corrupts less than the threshold of nodes, gaining no meaningful information."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scenario #2"}),": Attacker corrupts more than the threshold, deriving the entire chain."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"distributed-key-generation-attacks",children:"Distributed Key Generation Attacks"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"DoS During DKG"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Nodes may miss shares or replies, risking exclusion."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Remediation"}),": Manual verification of the final group and decision to re-run DKG if necessary."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Corruption During DKG"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scenario 1"}),": Attacker influences the distribution of private shares without biasing randomness."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scenario 2"}),": Attacker controls more than the threshold, knowing the randomness chain."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Broadcast Channel Assumption"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Attacker sends inconsistent shares, causing verification issues."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Observation"}),": Nodes publish the distributed public key and start randomness rounds, enabling third-party verification."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"drand employs robust security measures, including pairing-based cryptography and threshold BLS signatures, to ensure publicly verifiable, unbiased, and unpredictable randomness. Regular resharing and strict network protocols further enhance security and resilience against attacks."}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var i=s(6540);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/14eb3368.1844d12e.js b/site/assets/js/14eb3368.1844d12e.js new file mode 100644 index 00000000..d6154bff --- /dev/null +++ b/site/assets/js/14eb3368.1844d12e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[6969],{1243:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var s=n(4164),r=n(7559),i=n(6972),a=n(9169),l=n(8774),o=n(1312),c=n(6025),d=n(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("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 m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const b={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function x(e){let{children:t,href:n,isLast:s}=e;const r="breadcrumbs__link";return s?(0,d.jsx)("span",{className:r,itemProp:"name",children:t}):n?(0,d.jsx)(l.A,{className:r,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:r,children:t})}function p(e){let{children:t,active:n,index:r,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(r+1)})]})}function g(){const e=(0,i.OF)(),t=(0,a.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(r.G.docs.docBreadcrumbs,b.breadcrumbsContainer),"aria-label":(0,o.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,r="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(p,{active:s,index:n,addMicrodata:!!r,children:(0,d.jsx)(x,{href:r,isLast:s,children:t.label})},n)}))]})}):null}},4136:(e,t,n)=>{n.r(t),n.d(t,{default:()=>w});n(6540);var s=n(1213),r=n(6972),i=n(6025),a=n(4164),l=n(8774),o=n(5846),c=n(6654),d=n(1312),u=n(1107);const m={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};var h=n(4848);function b(e){let{href:t,children:n}=e;return(0,h.jsx)(l.A,{href:t,className:(0,a.A)("card padding--lg",m.cardContainer),children:n})}function x(e){let{href:t,icon:n,title:s,description:r}=e;return(0,h.jsxs)(b,{href:t,children:[(0,h.jsxs)(u.A,{as:"h2",className:(0,a.A)("text--truncate",m.cardTitle),title:s,children:[n," ",s]}),r&&(0,h.jsx)("p",{className:(0,a.A)("text--truncate",m.cardDescription),title:r,children:r})]})}function p(e){let{item:t}=e;const n=(0,r.Nr)(t),s=function(){const{selectMessage:e}=(0,o.W)();return t=>e(t,(0,d.T)({message:"1 item|{count} items",id:"theme.docs.DocCard.categoryDescription.plurals",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t}))}();return n?(0,h.jsx)(x,{href:n,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??s(t.items.length)}):null}function g(e){let{item:t}=e;const n=(0,c.A)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",s=(0,r.cC)(t.docId??void 0);return(0,h.jsx)(x,{href:t.href,icon:n,title:t.label,description:t.description??s?.description})}function v(e){let{item:t}=e;switch(t.type){case"link":return(0,h.jsx)(g,{item:t});case"category":return(0,h.jsx)(p,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function f(e){let{className:t}=e;const n=(0,r.$S)();return(0,h.jsx)(j,{items:n.items,className:t})}function j(e){const{items:t,className:n}=e;if(!t)return(0,h.jsx)(f,{...e});const s=(0,r.d1)(t);return(0,h.jsx)("section",{className:(0,a.A)("row",n),children:s.map(((e,t)=>(0,h.jsx)("article",{className:"col col--6 margin-bottom--lg",children:(0,h.jsx)(v,{item:e})},t)))})}var A=n(7719),N=n(1878),T=n(4267),_=n(1243);const L={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function k(e){let{categoryGeneratedIndex:t}=e;return(0,h.jsx)(s.be,{title:t.title,description:t.description,keywords:t.keywords,image:(0,i.Ay)(t.image)})}function y(e){let{categoryGeneratedIndex:t}=e;const n=(0,r.$S)();return(0,h.jsxs)("div",{className:L.generatedIndexPage,children:[(0,h.jsx)(N.A,{}),(0,h.jsx)(_.A,{}),(0,h.jsx)(T.A,{}),(0,h.jsxs)("header",{children:[(0,h.jsx)(u.A,{as:"h1",className:L.title,children:t.title}),t.description&&(0,h.jsx)("p",{children:t.description})]}),(0,h.jsx)("article",{className:"margin-top--lg",children:(0,h.jsx)(j,{items:n.items,className:L.list})}),(0,h.jsx)("footer",{className:"margin-top--lg",children:(0,h.jsx)(A.A,{previous:t.navigation.previous,next:t.navigation.next})})]})}function w(e){return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(k,{...e}),(0,h.jsx)(y,{...e})]})}},7719:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var s=n(1312),r=n(9022),i=n(4848);function a(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(r.A,{...t,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(r.A,{...n,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},4267:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(4164),r=n(1312),i=n(7559),a=n(3025),l=n(4848);function o(e){let{className:t}=e;const n=(0,a.r)();return n.badge?(0,l.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(r.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},1878:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(4164),r=n(4586),i=n(8774),a=n(1312),l=n(4070),o=n(7559),c=n(3886),d=n(3025),u=n(4848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.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:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(a.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:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function b(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(a.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,r.A)(),{pluginId:a}=(0,l.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(a),{latestDocSuggestion:m,latestVersionSuggestion:x}=(0,l.HW)(a),p=m??(g=x).docs.find((e=>e.id===g.mainDocId));var g;return(0,u.jsxs)("div",{className:(0,s.A)(t,o.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(b,{versionLabel:x.label,to:p.path,onClick:()=>d(x.name)})})]})}function p(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(x,{className:t,versionMetadata:n}):null}},9022:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var s=n(4164),r=n(8774),i=n(4848);function a(e){const{permalink:t,title:n,subLabel:a,isNext:l}=e;return(0,i.jsxs)(r.A,{className:(0,s.A)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[a&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:a}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}},5846:(e,t,n)=>{n.d(t,{W:()=>c});var s=n(6540),r=n(4586);const i=["zero","one","two","few","many","other"];function a(e){return i.filter((t=>e.includes(t)))}const l={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,r.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),l}}),[e])}function c(){const e=o();return{selectMessage:(t,n)=>function(e,t,n){const s=e.split("|");if(1===s.length)return s[0];s.length>n.pluralForms.length&&console.error(`For locale=${n.locale}, a maximum of ${n.pluralForms.length} plural forms are expected (${n.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const r=n.select(t),i=n.pluralForms.indexOf(r);return s[Math.min(i,s.length-1)]}(n,t,e)}}}}]); \ No newline at end of file diff --git a/site/assets/js/17896441.217d4c3c.js b/site/assets/js/17896441.217d4c3c.js new file mode 100644 index 00000000..96fcee0f --- /dev/null +++ b/site/assets/js/17896441.217d4c3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8401],{2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(4084),i=n(7559),o=n(7293),l=n(4848);function r(e){let{className:t}=e;return(0,l.jsx)(o.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,s.A)(t,i.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(r,{...e})]})}},1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var s=n(4164),a=n(4084),i=n(7559),o=n(7293),l=n(4848);function r(e){let{className:t}=e;return(0,l.jsx)(o.A,{type:"caution",title:(0,l.jsx)(a.Yh,{}),className:(0,s.A)(t,i.G.common.draftBanner),children:(0,l.jsx)(a.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:s}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||s.unlisted)&&(0,l.jsx)(c.A,{}),s.draft&&(0,l.jsx)(r,{})]})}},1243:(e,t,n)=>{n.d(t,{A:()=>f});n(6540);var s=n(4164),a=n(7559),i=n(6972),o=n(9169),l=n(8774),r=n(1312),c=n(6025),d=n(4848);function u(e){return(0,d.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,d.jsx)("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 m={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function h(){const e=(0,c.Ay)("/");return(0,d.jsx)("li",{className:"breadcrumbs__item",children:(0,d.jsx)(l.A,{"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,d.jsx)(u,{className:m.breadcrumbHomeIcon})})})}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function b(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,d.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,d.jsx)(l.A,{className:a,href:n,itemProp:"item",children:(0,d.jsx)("span",{itemProp:"name",children:t})}):(0,d.jsx)("span",{className:a,children:t})}function x(e){let{children:t,active:n,index:a,addMicrodata:i}=e;return(0,d.jsxs)("li",{...i&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,s.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,d.jsx)("meta",{itemProp:"position",content:String(a+1)})]})}function f(){const e=(0,i.OF)(),t=(0,o.Dt)();return e?(0,d.jsx)("nav",{className:(0,s.A)(a.G.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,r.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,d.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,d.jsx)(h,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,d.jsx)(x,{active:s,index:n,addMicrodata:!!a,children:(0,d.jsx)(b,{href:a,isLast:s,children:t.label})},n)}))]})}):null}},833:(e,t,n)=>{n.r(t),n.d(t,{default:()=>P});var s=n(6540),a=n(1213),i=n(9532),o=n(4848);const l=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,o.jsx)(l.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(l);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,o.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4164),m=n(4581),h=n(7719);function v(){const{metadata:e}=c();return(0,o.jsx)(h.A,{previous:e.previous,next:e.next})}var b=n(1878),x=n(4267),f=n(7559),p=n(2053),g=n(4336);function j(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,tags:a}=e,i=a.length>0,l=!!(t||n||s);return i||l?(0,o.jsxs)("footer",{className:(0,u.A)(f.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,o.jsx)("div",{className:(0,u.A)("row margin-top--sm",f.G.docs.docFooterTagsRow),children:(0,o.jsx)("div",{className:"col",children:(0,o.jsx)(p.A,{tags:a})})}),l&&(0,o.jsx)(g.A,{className:(0,u.A)("margin-top--sm",f.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s})]}):null}var A=n(1422),L=n(5195),C=n(1312);const N={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function _(e){let{collapsed:t,...n}=e;return(0,o.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",N.tocCollapsibleButton,!t&&N.tocCollapsibleButtonExpanded,n.className),children:(0,o.jsx)(C.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const T={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function k(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:l}=(0,A.u)({initialState:!0});return(0,o.jsxs)("div",{className:(0,u.A)(T.tocCollapsible,!i&&T.tocCollapsibleExpanded,n),children:[(0,o.jsx)(_,{collapsed:i,onClick:l}),(0,o.jsx)(A.N,{lazy:!0,className:T.tocCollapsibleContent,collapsed:i,children:(0,o.jsx)(L.A,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const H={tocMobile:"tocMobile_ITEo"};function M(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(k,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(f.G.docs.docTocMobile,H.tocMobile)})}var y=n(7763);function B(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(y.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:f.G.docs.docTocDesktop})}var I=n(1107),w=n(5533);function E(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,o.jsxs)("div",{className:(0,u.A)(f.G.docs.docMarkdown,"markdown"),children:[n&&(0,o.jsx)("header",{children:(0,o.jsx)(I.A,{as:"h1",children:n})}),(0,o.jsx)(w.A,{children:t})]})}var V=n(1243),O=n(1689);const G={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function S(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,o.jsx)(M,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,o.jsx)(B,{})}}(),{metadata:s}=c();return(0,o.jsxs)("div",{className:"row",children:[(0,o.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&G.docItemCol),children:[(0,o.jsx)(O.A,{metadata:s}),(0,o.jsx)(b.A,{}),(0,o.jsxs)("div",{className:G.docItemContainer,children:[(0,o.jsxs)("article",{children:[(0,o.jsx)(V.A,{}),(0,o.jsx)(x.A,{}),n.mobile,(0,o.jsx)(E,{children:t}),(0,o.jsx)(j,{})]}),(0,o.jsx)(v,{})]})]}),n.desktop&&(0,o.jsx)("div",{className:"col col--3",children:n.desktop})]})}function P(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,o.jsx)(r,{content:e.content,children:(0,o.jsxs)(a.e3,{className:t,children:[(0,o.jsx)(d,{}),(0,o.jsx)(S,{children:(0,o.jsx)(n,{})})]})})}},7719:(e,t,n)=>{n.d(t,{A:()=>o});n(6540);var s=n(1312),a=n(9022),i=n(4848);function o(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(a.A,{...t,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(a.A,{...n,subLabel:(0,i.jsx)(s.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}},4267:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(4164),a=n(1312),i=n(7559),o=n(3025),l=n(4848);function r(e){let{className:t}=e;const n=(0,o.r)();return n.badge?(0,l.jsx)("span",{className:(0,s.A)(t,i.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(a.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}},1878:(e,t,n)=>{n.d(t,{A:()=>x});n(6540);var s=n(4164),a=n(4586),i=n(8774),o=n(1312),l=n(4070),r=n(7559),c=n(3886),d=n(3025),u=n(4848);const m={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(o.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:(0,u.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,u.jsx)(o.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:(0,u.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function h(e){const t=m[e.versionMetadata.banner];return(0,u.jsx)(t,{...e})}function v(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,u.jsx)(o.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,u.jsx)("b",{children:(0,u.jsx)(i.A,{to:n,onClick:s,children:(0,u.jsx)(o.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function b(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:i}}=(0,a.A)(),{pluginId:o}=(0,l.vT)({failfast:!0}),{savePreferredVersionName:d}=(0,c.g1)(o),{latestDocSuggestion:m,latestVersionSuggestion:b}=(0,l.HW)(o),x=m??(f=b).docs.find((e=>e.id===f.mainDocId));var f;return(0,u.jsxs)("div",{className:(0,s.A)(t,r.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,u.jsx)("div",{children:(0,u.jsx)(h,{siteTitle:i,versionMetadata:n})}),(0,u.jsx)("div",{className:"margin-top--md",children:(0,u.jsx)(v,{versionLabel:b.label,to:x.path,onClick:()=>d(b.name)})})]})}function x(e){let{className:t}=e;const n=(0,d.r)();return n.banner?(0,u.jsx)(b,{className:t,versionMetadata:n}):null}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=n(4848);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,o.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",t),children:(0,o.jsx)(a.A,{...n,linkClassName:l,linkActiveClassName:r})})}},5195:(e,t,n)=>{n.d(t,{A:()=>b});var s=n(6540),a=n(6342);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function o(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function l(e){const t=e.getBoundingClientRect();return t.top===t.bottom?l(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>l(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:n.current}),d=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(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}var u=n(8774),m=n(4848);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,f=u??b.tableOfContents.maxHeadingLevel,p=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>o({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:f});return d((0,s.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:f}}),[l,r,x,f])),(0,m.jsx)(v,{toc:p,className:n,linkClassName:l,...h})}},4084:(e,t,n)=>{n.d(t,{AE:()=>r,Rc:()=>o,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var s=n(1312),a=n(5260),i=n(4848);function o(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,i.jsx)(a.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,i.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/site/assets/js/1ab32222.41cc101f.js b/site/assets/js/1ab32222.41cc101f.js new file mode 100644 index 00000000..afd00990 --- /dev/null +++ b/site/assets/js/1ab32222.41cc101f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4532],{8716:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var r=t(4848),s=t(8453);const o={id:"4-1-ops-guide-deployment",title:"4.1 Deployment",description:"Detailed instructions for how to deploy one or more drand nodes."},i="4.1 DevOps: Deployment",d={id:"ops-guide/4-1-ops-guide-deployment",title:"4.1 Deployment",description:"Detailed instructions for how to deploy one or more drand nodes.",source:"@site/docs/04_ops-guide/04-01-DevOps_Deployment.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-1-ops-guide-deployment",permalink:"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-01-DevOps_Deployment.md",tags:[],version:"current",frontMatter:{id:"4-1-ops-guide-deployment",title:"4.1 Deployment",description:"Detailed instructions for how to deploy one or more drand nodes."},sidebar:"docsSidebar",previous:{title:"4.0 OPERATORS GUIDE",permalink:"/drand-docs/docs/ops-guide/4-0-ops-guide"},next:{title:"4.2 Docker Install",permalink:"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install"}},a={},l=[{value:"Setup",id:"setup",level:2},{value:"Beacon ID",id:"beacon-id",level:3},{value:"Long-term Key",id:"long-term-key",level:3},{value:"Starting the drand Daemon",id:"starting-the-drand-daemon",level:3},{value:"TLS setup: Nginx with Let's Encrypt",id:"tls-setup-nginx-with-lets-encrypt",level:3},{value:"TLS Setup: Apache for HTTP",id:"tls-setup-apache-for-http",level:3},{value:"Test the Connection to a Node",id:"test-the-connection-to-a-node",level:3},{value:"Test the Connection to a Network",id:"test-the-connection-to-a-network",level:3},{value:"Run the Setup Phase",id:"run-the-setup-phase",level:3},{value:"Custom Entropy Source",id:"custom-entropy-source",level:3},{value:"Group TOML File",id:"group-toml-file",level:3},{value:"Randomness Generation",id:"randomness-generation",level:2},{value:"Timings",id:"timings",level:3},{value:"Daemon Downtime and Chain Sync",id:"daemon-downtime-and-chain-sync",level:3},{value:"drand Network Failure",id:"drand-network-failure",level:3},{value:"Control Functionalities",id:"control-functionalities",level:2},{value:"Long-term Private Key",id:"long-term-private-key",level:3},{value:"Long-term Public Key",id:"long-term-public-key",level:3},{value:"Private Key Share",id:"private-key-share",level:3},{value:"Chain Information",id:"chain-information",level:3},{value:"Updating drand Group",id:"updating-drand-group",level:2},{value:"Metrics",id:"metrics",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"41-devops-deployment",children:"4.1 DevOps: Deployment"})}),"\n",(0,r.jsx)(n.h1,{id:"deployment-guide",children:(0,r.jsx)(n.strong,{children:"Deployment guide"})}),"\n",(0,r.jsx)(n.p,{children:"This document explains the workflow to have a working group of drand nodes generate randomness. There are four sections to this guide:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Start the daemons."}),"\n",(0,r.jsx)(n.li,{children:"Choose a beacon id."}),"\n",(0,r.jsx)(n.li,{children:"Generate the long-term key pairs and the group file."}),"\n",(0,r.jsx)(n.li,{children:"Have each node collectively participate in the distributed key generation (DKG)."}),"\n",(0,r.jsx)(n.li,{children:"Generate randomness."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["You can repeat these steps every time you want to start a new network for randomness generation. If the drand daemon is already running, please skip that step. For each new network, a unique identifier, known as\xa0",(0,r.jsx)(n.code,{children:"Beacon ID"}),"\xa0is required."]})}),"\n",(0,r.jsx)(n.h2,{id:"setup",children:(0,r.jsx)(n.strong,{children:"Setup"})}),"\n",(0,r.jsx)(n.p,{children:"The setup process for a drand node consists of the following steps:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Start the drand daemon on each node."}),"\n",(0,r.jsx)(n.li,{children:"Choose a beacon id for the new network."}),"\n",(0,r.jsx)(n.li,{children:"Generate the long-term key pair for each new network."}),"\n",(0,r.jsx)(n.li,{children:"The leader starts the command as a coordinator & every participant connects to the coordinator to setup the network."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["This document explains how to do the setup with the drand binary itself. If you want to install drand using Docker, follow the\xa0",(0,r.jsx)(n.a,{href:"4-2-ops-guide-docker-install",children:(0,r.jsx)(n.strong,{children:"Docker instructions instead"})}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"beacon-id",children:(0,r.jsx)(n.strong,{children:"Beacon ID"})}),"\n",(0,r.jsxs)(n.p,{children:["Each drand network needs a\xa0",(0,r.jsx)(n.strong,{children:"unique identifier"}),"\xa0to run. The only constraint regarding possible values is it could not have been used before on another network. If you leave the id empty, the node will set it to\xa0",(0,r.jsx)(n.code,{children:"default"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"long-term-key",children:(0,r.jsx)(n.strong,{children:"Long-term Key"})}),"\n",(0,r.jsxs)(n.p,{children:["Each drand network needs a public and secret key to interact with the rest of the nodes. To generate these keys run\xa0",(0,r.jsx)(n.a,{href:"https://drand.love/operator/drand-cli/#drand-generate-keypair",children:(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.code,{children:"drand generate-keypair"})})}),"\xa0followed by the address of your node:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand generate-keypair --id {beacon-id} drand.example.com:443\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The address must be reachable over a TLS connection through a reverse proxy doing gRPC TLS termination. Disabling TLS can be done when running a development or test deployment by building drand with the ",(0,r.jsx)(n.code,{children:"-tags=conn_insecure"})," build tag."]}),"\n",(0,r.jsxs)(n.p,{children:["The default location for your keys is\xa0",(0,r.jsx)(n.code,{children:"~/.drand"}),". You can specify where you want the keys to be saved by using the\xa0",(0,r.jsx)(n.code,{children:"--folder"}),"\xa0flag:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand generate-keypair --folder ~/.drand-node-0 --id {beacon-id} drand0.example.com:443\n"})}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-drand-daemon",children:(0,r.jsx)(n.strong,{children:"Starting the drand Daemon"})}),"\n",(0,r.jsxs)(n.p,{children:["The daemon does not automatically run in the background. To run the daemon in the background, you must add\xa0",(0,r.jsx)(n.code,{children:"&"}),"\xa0to the end of your command. Docker users can use the\xa0",(0,r.jsx)(n.code,{children:"-d"}),"\xa0option. Once the daemon is running, the best way to issue commands is to use the control functionalities. The control client has to run on the same server as the drand daemon, so only drand administrators can issue a command to their drand daemons."]}),"\n",(0,r.jsxs)(n.p,{children:["To choose where drand listens, use the\xa0",(0,r.jsx)(n.code,{children:"--private-listen"}),"\xa0flag. You can also use the\xa0",(0,r.jsx)(n.code,{children:"--public-listen"}),"\xa0flag to specify the address of the public API. Both these flags allow specifying the interface and/or port for drand to listen on. The\xa0",(0,r.jsx)(n.code,{children:"--private-listen"}),"\xa0flag is the primary listener used to expose a gRPC service for inter-group-member communication. The\xa0",(0,r.jsx)(n.code,{children:"--public-listen"}),"\xa0flag exposes a public and limited HTTP service designed to be CDN friendly with caching header, and provide basic information for drand users."]}),"\n",(0,r.jsxs)(n.p,{children:["To get TLS certificates for free, you can use, for example,\xa0",(0,r.jsx)(n.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"})," with its official CLI tool\xa0",(0,r.jsx)(n.a,{href:"https://certbot.eff.org/",children:"EFF's certbot"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"tls-setup-nginx-with-lets-encrypt",children:(0,r.jsx)(n.strong,{children:"TLS setup: Nginx with Let's Encrypt"})}),"\n",(0,r.jsxs)(n.p,{children:["Running drand behind a reverse proxy is the\xa0",(0,r.jsx)(n.strong,{children:"default"}),"\xa0method of deploying drand. Such a setup greatly simplifies TLS management issues (renewal of certificates, etc.). We provide here the minimum setup using\xa0",(0,r.jsx)(n.a,{href:"https://www.nginx.com/",children:"Nginx"})," ****and\xa0",(0,r.jsx)(n.a,{href:"https://certbot.eff.org/instructions/",children:"certbot"}),"- make sure you have both binaries installed with the latest version; Nginx version must be at least >=\xa0",(0,r.jsx)(n.code,{children:"1.13.10"}),"\xa0for gRPC compatibility."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"First, add an entry in the Nginx configuration for drand:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"# /etc/nginx/sites-available/default\nserver {\n server_name drand.example.xyz;\n listen 80;\n location / {\n proxy_pass http://localhost:8080;\n proxy_set_header Host $host;\n }\n}\n\nserver {\n server_name drand.example.xyz;\n listen 443 ssl http2;\n location / {\n grpc_pass grpc://localhost:4444;\n grpc_set_header X-Real-IP $remote_addr;\n }\n\n\t# Add ssl certificates by running certbot --nginx\n}\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can change:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["the port on which you want drand to be accessible by changing the line\xa0",(0,r.jsx)(n.code,{children:"listen 443 ssl http2"}),"\xa0to use any port."]}),"\n",(0,r.jsxs)(n.li,{children:["the port on which the drand binary will listen locally by changing the line\xa0",(0,r.jsx)(n.code,{children:"grpc_pass grpc://localhost:4444;"}),"\xa0to the private API port and\xa0",(0,r.jsx)(n.code,{children:"proxy_pass http://localhost:8080;"}),"\xa0to the public API port."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can use different\xa0",(0,r.jsx)(n.code,{children:"server"}),"\xa0blocks to apply different configurations (DNS names, for example) for the private and public API."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Run certbot to get a TLS certificate:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"sudo certbot --nginx\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Running drand uses two ports: one for group member communication, and one for a public-facing API for distributing randomness. These ports and interfaces should be specified with flags."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand start --private-listen 127.0.0.1:4444 --public-listen drand0.example.com:8080\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The\xa0",(0,r.jsx)(n.code,{children:"--private-listen"}),"\xa0flag tells drand to listen on the given address. The public-facing address associated with this listener is given to other group members in the setup phase (see below)."]}),"\n",(0,r.jsxs)(n.p,{children:["If no\xa0",(0,r.jsx)(n.code,{children:"private-listen"}),"\xa0address is provided, it will default to the discovered public address of the drand node."]}),"\n",(0,r.jsxs)(n.p,{children:["If no\xa0",(0,r.jsx)(n.code,{children:"public-listen"}),"\xa0flag is provided, drand will not expose a public HTTP interface."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"tls-setup-apache-for-http",children:(0,r.jsx)(n.strong,{children:"TLS Setup: Apache for HTTP"})}),"\n",(0,r.jsx)(n.p,{children:"The equivalent Apache config block to the NGinX config above for forwarding HTTP requests back to the drand public port would be:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"ProxyPreserveHost On\nSSLProxyEngine on\nSSLProxyCheckPeerCN off\nProxyPass / https://127.0.0.1:8080/\nProxyPassReverse / https://127.0.0.1:8080/\n\nallow from all\n\n"})}),"\n",(0,r.jsx)(n.h3,{id:"test-the-connection-to-a-node",children:(0,r.jsx)(n.strong,{children:"Test the Connection to a Node"})}),"\n",(0,r.jsxs)(n.p,{children:["Use\xa0",(0,r.jsx)(n.code,{children:"drand util check
"}),"\xa0to test the gRPC endpoint on a drand node (like a ping to the node)."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand util check example.com:443\n\n> drand: id example.com:443 answers correctly\n"})}),"\n",(0,r.jsx)(n.p,{children:"If the address used is a DNS name, this command will try to resolve the DNS name to IP."}),"\n",(0,r.jsx)(n.h3,{id:"test-the-connection-to-a-network",children:(0,r.jsx)(n.strong,{children:"Test the Connection to a Network"})}),"\n",(0,r.jsxs)(n.p,{children:["Use\xa0",(0,r.jsx)(n.code,{children:"drand util check --id
"})," \xa0to test the gRPC endpoint of a drand network which has a specific beacon id."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand util check --id example.com:443\n\n> drand: id example.com:443 answers correctly\n"})}),"\n",(0,r.jsx)(n.p,{children:"If the address used is a DNS name, this command will try to resolve the DNS name to IP."}),"\n",(0,r.jsx)(n.h3,{id:"run-the-setup-phase",children:(0,r.jsx)(n.strong,{children:"Run the Setup Phase"})}),"\n",(0,r.jsx)(n.p,{children:"To setup a new network, drand uses the notion of a coordinator that collects the public key of the participants, setups the group configuration once all keys are received, and then start the distributed key generation phase. Once the DKG phase is performed, the participants can see the list of members in the group configuration file."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Coordinator"}),": The designated coordinator node must run the following command\xa0",(0,r.jsx)(n.strong,{children:"before"}),"\xa0everyone else:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand dkg init --threshold 6 --proposal /path/to/proposal/file --period 30s --id {beacon-id} --scheme {scheme-id}\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Rest of participants"}),": Once the coordinator has run the previous command, the rest of the participants must run the following command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand dkg join --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.p,{children:"The flags usage is as follows:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Flag"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--leader"}),(0,r.jsx)(n.td,{children:"This\xa0node is the group coordinator."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--nodes"}),(0,r.jsx)(n.td,{children:"The number of nodes in this group."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--threshold"}),(0,r.jsx)(n.td,{children:"The minimum number of nodes that need to be online for the network to be live."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--period"}),(0,r.jsxs)(n.td,{children:["The period of the randomness beacon to use. It must be a valid duration as parsed by Golang's\xa0",(0,r.jsx)(n.a,{href:"https://golang.org/pkg/time/#ParseDurationhttps://golang.org/pkg/time/#ParseDurationmethod",children:"https://golang.org/pkg/time/#ParseDurationhttps://golang.org/pkg/time/#ParseDurationmethod"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--catchup-period"}),(0,r.jsx)(n.td,{children:"The period of randomness when recovering from a failure. A valid Golang duration, it may be 0 to catch up as fast as possible."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--secret-file"}),(0,r.jsx)(n.td,{children:"The file that contains the password that the leader uses to authenticate nodes that want to participate in the group. This password must be at least 32 characters long. This variable contains the path and name of the file. Notice that this flag takes precedence over the\xa0DRAND_SHARE_SECRET\xa0env variable if set."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--id"}),(0,r.jsx)(n.td,{children:"The unique identification for this new network. It allows drand to handle various networks running at the same time."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"--scheme"}),(0,r.jsx)(n.td,{children:"The scheme the new network will use. It allows the network to work on chain or unchained mode."})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["The\xa0",(0,r.jsx)(n.code,{children:"drand share"}),"\xa0command will run until the DKG has finished. If you quit the command, the DKG will continue, but the group file will not be created. In that case, once the DKG is done, you can get the group file by running:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show group --out group.toml --id {beacon-id}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If you specified a\xa0",(0,r.jsx)(n.code,{children:"--control"}),"\xa0in when you started the drand node, you will have to supply the same port with this command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show group --out group.toml --control 3001 --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.h3,{id:"custom-entropy-source",children:(0,r.jsx)(n.strong,{children:"Custom Entropy Source"})}),"\n",(0,r.jsxs)(n.p,{children:["Drand takes its entropy for the setup phase from the OS's entropy source by default. This source is\xa0",(0,r.jsx)(n.code,{children:"/dev/urandom"}),"\xa0on Unix systems. However, it is possible for a participant to inject their own entropy source into the creation of their secret."]}),"\n",(0,r.jsx)(n.h3,{id:"group-toml-file",children:(0,r.jsx)(n.strong,{children:"Group TOML File"})}),"\n",(0,r.jsxs)(n.p,{children:["Once the DKG phase is done, each node has both a private share and a group file containing the distributed public key. Using the previous commands, the group file will be written to\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),". That updated group file is needed by drand to securely contact drand nodes on their public interface to gather private or public randomness. To view this file, run\xa0",(0,r.jsx)(n.code,{children:"drand show group"}),". If you want to save the output to a file, add the\xa0",(0,r.jsx)(n.code,{children:"--out "}),"\xa0flag:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show group --out ~/group-config.toml --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"randomness-generation",children:(0,r.jsx)(n.strong,{children:"Randomness Generation"})}),"\n",(0,r.jsxs)(n.p,{children:["After a successful setup phase, drand will switch to the randomness generation mode\xa0",(0,r.jsx)(n.em,{children:"at the genesis time"}),"\xa0specified in the group file. Each node broadcasts\xa0",(0,r.jsx)(n.em,{children:"randomness shares"}),"\xa0at regular intervals. Every new random beacon is linked to the previous one in a chain of randomness. Once a node has collected a threshold of shares in the current round, it computes the public, random value, and stores it in its local instance of\xa0",(0,r.jsx)(n.a,{href:"https://github.com/coreos/bbolt",children:"BoltDB"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"For third party implementations of randomness beacon verification, you need:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The distributed public key generated during the setup phase."}),"\n",(0,r.jsx)(n.li,{children:"The period."}),"\n",(0,r.jsx)(n.li,{children:"The genesis time of the chain."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"As an administrator of a drand node, you can use the control port to access a series of important information:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"For listing all running networks:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand util status --list-ids\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"For accessing the chain information of a network:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show chain-info --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.p,{children:"Non-administrators can contact an external drand node to ask for its current distributed public key:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand get chain-info --id {beacon-id}
\n"})}),"\n",(0,r.jsxs)(n.p,{children:["In this command,\xa0",(0,r.jsx)(n.code,{children:"
"}),"\xa0is the address of a drand node. Use the",(0,r.jsx)(n.code,{children:"--tls-cert"}),"\xa0flag to specify the server's certificate if needed. The\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0file does not need to be updated with the collective key."]}),"\n",(0,r.jsxs)(n.p,{children:["When using the\xa0",(0,r.jsx)(n.code,{children:"get chain-info"}),"\xa0method, a drand node\xa0",(0,r.jsx)(n.em,{children:"can"}),"\xa0lie about the key if no out-of-band verification is performed. That information is usually best gathered from a trusted drand operator and then embedded in any applications using drand."]}),"\n",(0,r.jsx)(n.h3,{id:"timings",children:(0,r.jsx)(n.strong,{children:"Timings"})}),"\n",(0,r.jsx)(n.p,{children:"At each new period, each node will try to broadcast their partial signatures for the corresponding round and try to generate full randomness from the partial signatures. The corresponding round is the number of rounds elapsed from the genesis time. That means there is a 1-1 mapping between a given time and a drand round."}),"\n",(0,r.jsx)(n.h3,{id:"daemon-downtime-and-chain-sync",children:(0,r.jsx)(n.strong,{children:"Daemon Downtime and Chain Sync"})}),"\n",(0,r.jsxs)(n.p,{children:["Due to the threshold nature of drand, a drand network can support some numbers of nodes offline at any given point. This number is determined by the threshold:\xa0",(0,r.jsx)(n.code,{children:"max_offline = group_len - threshold"}),". When a drand node goes back up, it will sync rapidly with the other nodes to catch up its local chain and participate in the next upcoming drand round."]}),"\n",(0,r.jsx)(n.h3,{id:"drand-network-failure",children:(0,r.jsx)(n.strong,{children:"drand Network Failure"})}),"\n",(0,r.jsxs)(n.p,{children:["If, for some reason, drand goes down for some time and then backs up, the new random beacon will be built over the\xa0",(0,r.jsx)(n.em,{children:"last successfully generated beacon"}),". For example, if the network goes down at round\xa0",(0,r.jsx)(n.code,{children:"10"}),"\xa0(i.e., the last beacon generated contained\xa0",(0,r.jsx)(n.code,{children:"round: 10"}),"), and back up again at round\xa0",(0,r.jsx)(n.code,{children:"20"}),"\xa0(i.e., field\xa0",(0,r.jsx)(n.code,{children:"round: 20"}),"), then this new randomness contains the field\xa0",(0,r.jsx)(n.code,{children:"previous_round:10"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"control-functionalities",children:(0,r.jsx)(n.strong,{children:"Control Functionalities"})}),"\n",(0,r.jsxs)(n.p,{children:["Drand's local administrator interface provides further functionality, e.g., to update group details or retrieve secret information. By default, the daemon listens on\xa0",(0,r.jsx)(n.code,{children:"127.0.0.1:8888"}),", but you can specify another control port when starting the daemon with:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand start --control 1234\n"})}),"\n",(0,r.jsx)(n.p,{children:"In that case, you need to specify the control port for each of the following commands."}),"\n",(0,r.jsx)(n.h3,{id:"long-term-private-key",children:(0,r.jsx)(n.strong,{children:"Long-term Private Key"})}),"\n",(0,r.jsx)(n.p,{children:"To retrieve the long-term private key of our node, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show private --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.h3,{id:"long-term-public-key",children:(0,r.jsx)(n.strong,{children:"Long-term Public Key"})}),"\n",(0,r.jsx)(n.p,{children:"To retrieve the long-term public key of our node, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show public --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.h3,{id:"private-key-share",children:(0,r.jsx)(n.strong,{children:"Private Key Share"})}),"\n",(0,r.jsx)(n.p,{children:"To retrieve the private key share of our node, as determined during the DKG, run the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show share --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.p,{children:"The JSON-formatted output has the following form:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:'{\n "index": 1,\n "share": {\n "gid": 22,\n "scalar": "764f6e3eecdc4aba8b2f0119e7b2fd8c35948bf2be3f87ebb5823150c6065764"\n }\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:'The "gid" simply indicates which group the data belongs to. It is present for scalar and points on the curve, even though scalars are the same on the three groups of bls12-381. The field is present already to be able to accommodate different curves later on.'}),"\n",(0,r.jsx)(n.h3,{id:"chain-information",children:(0,r.jsx)(n.strong,{children:"Chain Information"})}),"\n",(0,r.jsx)(n.p,{children:"To retrieve information about the chain this node participates in, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand show chain-info --id {beacon-id}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"updating-drand-group",children:(0,r.jsx)(n.strong,{children:"Updating drand Group"})}),"\n",(0,r.jsxs)(n.p,{children:['Drand allows for "semi-dynamic" group update with a\xa0',(0,r.jsx)(n.em,{children:"resharing"}),"\xa0protocol that offers the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["New nodes can join an existing group and get new shares. Note that, in fact, all nodes get\xa0",(0,r.jsx)(n.em,{children:"new"}),"\xa0shares after running the resharing protocol."]}),"\n",(0,r.jsx)(n.li,{children:"Nodes can leave their current group. It may be necessary for nodes that do not wish to operate drand anymore."}),"\n",(0,r.jsx)(n.li,{children:"Nodes can update the threshold associated with their current distributed public key."}),"\n",(0,r.jsx)(n.li,{children:"refresh the shares (similar to using a new private key)"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The main advantage of this method is that the distributed public key stays the\xa0",(0,r.jsx)(n.em,{children:"same"}),"\xa0even with new nodes coming in. That can be useful when the distributed public key is embedded inside the application using drand, and hence is difficult to update."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Setting up the coordinator"}),": The coordinator must be a member of the current network. To run the coordinator, run the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand share --leader --transition --secret-file /path/to/my/secret/file --nodes 15 --threshold 10 --out group2.toml --id {beacon-id}\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Setting up the current members for the resharing"}),": The current members can simply run the following command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand share --connect --transition --secret-file /path/to/my/secret/file --out group2.toml --id {beacon-id}\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Setting up the new members"}),": The new members need the current group file to proceed. Check how to get the group file in the\xa0",(0,r.jsx)(n.a,{href:"4-1-ops-guide-deployment",children:"Deployment"})," section."]}),"\n",(0,r.jsx)("aside",{children:(0,r.jsxs)(n.p,{children:["\ud83d\udca1 ",(0,r.jsx)(n.strong,{children:"TIP"}),": A new member will need the full history of randomness beacons to participate in a group so that the new node can field requests for previous rounds. Getting the full history can take a while."]})}),"\n",(0,r.jsx)(n.p,{children:"A new member can synchronize with a chain before joining. This can be done by anyone, and does not require resharing to have started."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand follow --sync-nodes --chain-hash \n"})}),"\n",(0,r.jsxs)(n.p,{children:["This command will not exit, but will keep adding new beacons to the local database as they are produced. If you wish for the command to terminate once it has synchronized up to\xa0",(0,r.jsx)(n.em,{children:"now"}),", you can add the option\xa0",(0,r.jsx)(n.code,{children:"--up-to="}),"\xa0where\xa0",(0,r.jsx)(n.code,{children:"round"}),"\xa0is the current randomness round."]}),"\n",(0,r.jsx)(n.p,{children:"To join the group, the incoming member should execute:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand share connect --from group.toml --secret-file /path/to/my/secret/file --out group2.toml\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After the protocol is finished, each node will have the new group file written out as\xa0",(0,r.jsx)(n.code,{children:"group2.toml"}),". The randomness generation starts only at the specified transition time specified in the new group file."]}),"\n",(0,r.jsxs)(n.p,{children:["In this case, the\xa0",(0,r.jsx)(n.code,{children:"Beacon ID"}),"\xa0is not required as it is taken from the group file."]}),"\n",(0,r.jsx)(n.h2,{id:"metrics",children:(0,r.jsx)(n.strong,{children:"Metrics"})}),"\n",(0,r.jsxs)(n.p,{children:["The\xa0",(0,r.jsx)(n.code,{children:"--metrics "}),"\xa0flag may be used to launch a metrics server at the provided address. The address may be specified as\xa0",(0,r.jsx)(n.code,{children:"127.0.0.1:port"}),", or as\xa0",(0,r.jsx)(n.code,{children:":port"}),"\xa0to bind to the default network interface. The webserver at this port will serve\xa0",(0,r.jsx)(n.a,{href:"https://golang.org/pkg/net/http/pprof/",children:"pprof"})," runtime profiling data at\xa0",(0,r.jsx)(n.code,{children:"/debug/pprof"}),", allow triggering golang garbage collection at\xa0",(0,r.jsx)(n.code,{children:"/debug/gc"}),", and will serve\xa0",(0,r.jsx)(n.a,{href:"https://prometheus.io/docs/guides/go-application/",children:"Prometheus"}),"\xa0metrics at\xa0",(0,r.jsx)(n.code,{children:":/metrics"}),". Prometheus counters track the number of gRPC requests sent and received by the drand node, as well as the number of HTTP API requests. This endpoint should not be exposed publicly. If desired, prometheus metrics can be used as a data source for\xa0",(0,r.jsx)(n.a,{href:"https://grafana.com/docs/grafana/latest/features/datasources/prometheus/",children:"grafana dashboards"}),"\xa0or other monitoring services."]}),"\n",(0,r.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>d});var r=t(6540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/1df93b7f.4bbe161e.js b/site/assets/js/1df93b7f.4bbe161e.js new file mode 100644 index 00000000..e3969963 --- /dev/null +++ b/site/assets/js/1df93b7f.4bbe161e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4583],{5579:(A,e,a)=>{a.r(e),a.d(e,{default:()=>h});var s=a(4164),i=a(8774),n=a(4586),r=a(781),t=a(1107);const d={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var c=a(4848);const o=[{title:"drand",image:a(1538).A,description:(0,c.jsx)(c.Fragment,{children:"drand is a distributed randomness beacon daemon written in the Go programming language. It generates collective, publicly verifiable, unbiased, and unpredictable random values at fixed intervals using advanced cryptographic techniques."})},{title:"League of Entropy",image:a(8524).A,description:(0,c.jsx)(c.Fragment,{children:"The League of Entropy is a voluntary consortium providing a verifiable, decentralized randomness beacon for anyone who needs a publicly verifiable source of randomness."})},{title:"League Members",image:a(5820).A,description:(0,c.jsx)(c.Fragment,{children:"Active members of the League currently include Arbitrand, Automata Network, ChainSafe, cLabs, Cloudflare, DIA Association, Emerald Onion, \xc9cole Polytechnique F\xe9d\xe9rale de Lausanne (EPFL), Ethereum Foundation, Filecoin Foundation; Gelato Network; IPFS Force, KEN Labs, Kudelski Security, Protocol Labs, PTisp, Quantum Resistant Ledger (QRL) Foundation, Randamu, StorSwift, Tierion, University of Chile, UCL, Tangle Network, and Zama."})}];function l(A){let{title:e,image:a,description:i}=A;return(0,c.jsxs)("div",{className:(0,s.A)("col col--4"),children:[(0,c.jsx)("div",{className:"text--center",children:(0,c.jsx)("img",{src:a,className:d.featureSvg,alt:e})}),(0,c.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,c.jsx)(t.A,{as:"h3",children:e}),(0,c.jsx)("p",{children:i})]})]})}function p(){return(0,c.jsx)("section",{className:d.features,children:(0,c.jsx)("div",{className:"container",children:(0,c.jsx)("div",{className:"row",children:o.map(((A,e)=>(0,c.jsx)(l,{...A},e)))})})})}const m={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function u(){const{siteConfig:A}=(0,n.A)();return(0,c.jsx)("header",{className:(0,s.A)("hero hero--primary",m.heroBanner),children:(0,c.jsxs)("div",{className:"container",children:[(0,c.jsx)(t.A,{as:"h1",className:"hero__title",children:A.title}),(0,c.jsx)("p",{className:"hero__subtitle",children:A.tagline}),(0,c.jsx)("div",{className:m.buttons,children:(0,c.jsx)(i.A,{className:"button button--secondary button--lg",to:"/docs/concepts/2-0-concepts",children:"Get Started using drand!"})})]})})}function h(){const{siteConfig:A}=(0,n.A)();return(0,c.jsxs)(r.A,{title:`Hello from ${A.title}`,description:"Description will go into a meta tag in ",children:[(0,c.jsx)(u,{}),(0,c.jsx)("main",{children:(0,c.jsx)(p,{})})]})}},1538:(A,e,a)=>{a.d(e,{A:()=>s});const s="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAABaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAsaWxvYwAAAABEAAACAAEAAAABAAAMAQAACj0AAgAAAAEAAAGIAAAKeQAAADhpaW5mAAAAAAACAAAAFWluZmUCAAAAAAEAAGF2MDEAAAAAFWluZmUCAAAAAAIAAGF2MDEAAAAAGmlyZWYAAAAAAAAADmF1eGwAAgABAAEAAACvaXBycAAAAIppcGNvAAAAFGlzcGUAAAAAAAAAgAAAAIAAAAAMYXYxQ4E/AAAAAAAQcGl4aQAAAAADCAgIAAAADGF2MUOBHxwAAAAADnBpeGkAAAAAAQgAAAA4YXV4QwAAAAB1cm46bXBlZzptcGVnQjpjaWNwOnN5c3RlbXM6YXV4aWxpYXJ5OmFscGhhAAAAAB1pcG1hAAAAAAAAAAIAAQMBggMAAgQBhAYFAAAUvm1kYXQSAAoGH9m//y1QMuwUZGeNfyAQGAg4AAAAAAACCkEEQOIufVI+vHMXVQBBiRWKX+kmNGsOI3f7zROTD2HDfsrcXbXSvITcf71/mo9WiELZG4ysB0qeJ7f+Z0vYy1+Tly+cM3P93eM0pF7CzGwYO5ggJkx8/WCdw96ctVDtQsIhxoCYg2qnAuPYlmrM3zpij6/AC7+wGy+v3obVMMkqMxoIHBdmJVb1xUEwDPhEYFM0U8ao8GX+tL7ZlLHM2DrQfh5QwH3fTFroI8EpmOeRavBhKxtLxW6J2qdVxsAgLVkzshczowcmkU6tEVedSW3K2CfB1FZ/TOcH7EfwE/bpNgompnKZOt4vNY1iafSnnIWLOT5Q2NHAyJdPkj1cE32PMvO/P4Vhk3x6Me2Ro5UKHQxJbkE20KVAv0clLshDwa231ewQRrldXGHzhs786XzeLujg/rfbD5IBK1pX/KKf+JlstdgknFNp3AH24MVpRRgpWVK15VkhtgmL2LiULiQ0VwLuyOIAN2wdlzOM7pmquvUELouFAlu3pepnKlQx7u/zkvVBNZJTaMFlc+a40gFx4UAM9BKN9yL4MeqNtL+Mrww3beHAM4JV/A1N9pR8RI1wG6gVoLhb7PFqFWOqufJgjP8byr9xE0/XGFx86+WTvakfrSOr1qTr7lc/tDejwLibNWbYTdYnXjREh9I1qbmAFc9ROgvtB5akPui6+GPSwC6hkHSh19rhI+ptCZ8r6UB09iOFWX0TC/vXp7Mqqpm6sQXi5NZpaKH29bOvyUaS8fqHq6BIVZaL7PjsITRPRtxr4YVjg+VvNX/rglfdJNLSXBIYIx2zrLPHo+s9FLmkZv5KYAoxx7l2VguJnFxTqMk4BPGTwyZMQ+DhfUhGlAGZNvKlqQTTY+GRPFz1UGLZrVKF2dtIcHt0B1nAPBcyMDaA2qjUAShxtt9Faty//C012wI67+X93X9YqM9CXA5PwCfKear1tLqUzBzOF2AzX0kJIcFt+WMm5T6HoGcnbx/UuVOglTrTI54fD/+Jona3aPu/Gd4mkqLEcOQfr6N1TJifn8LoFjGfUobAMu3JJ6oEQxzR6/wzXNsuy0CO9JC4pIZTvF8W3GN1djN0Dv8TZlsXWyayHC0YoJHOsUxR7ZUYsLMbcpAAyy/JrIk829oh2fnl/K6IDpYPBRvRDiev/9sPlslwdyePi97wElwltgu6WVGDZuaksmPJm+NCoZTKKTPCy4ElBv0TwykLDyCSp+OwALTQob0I5JcuQh548HrUfbk76rFu4RNFQYPuAE5eEkso2EvloF/EFWwKh59WmYF0BjMgs2udycOVFN/xyPZT4fQaC8T4VClO3195k+PXyhnWLPNZ/qComSggQObSZf/rSO7G4Vtw0vzm+EOZKawffBdeEITN2oT/aDDvke5KsvYpPZv6cK4Xpphmf3D02HynGvXn2e/DjWjYusmAwXhymJS5NQuR4R+Vkk7+E/tvzvde9jhuFg5hJ9w2wKPPWBoYEC+y2f72MIlw9Cfs4lmy9F+QjAYTGHCnraNPPrR66QRUb8FiysUJqd1LmEFr+cd+t5vgRHY0G3HPahGclaySzebXeZjCeaI+CwaSwUDDf+AmdxJ7owsG+0eM1iZp48KMOskRrHYI2sbcdhLH+ysp27U9TWyYFQVcjXHN8WQdK/6RiULdmHz0Ap8ZxouH3I5kr6EYsOOJ7hXkm+JC6MDJX3M0O46o61GXOB9UFmItu2GEk6ZTdwnD2q05bq6aCDG8m7SSkKXqRtyIasnOOgAFP9cjaZ/NxejBoxmehO4JeZhjR32DX0oQRyUqCuGc/dZE1shwza0IkhUCrgk/8oaPH+ghBb2uUXQxmOxxa8Cu0GCsQkanOvCcEZWipXAf6KkW/xr4SXKBDPMPbJ9bpWg0HzAetSS7gpLmiTCAeLVC8p47pNQaBXHtFg9ON4Y+oHOY0TZvcojwWYH3Xdv23O5IUnXIXaKMJ3R8fh5zZS1wMikKcQqzcddrkkzrJukW4ZE7k7bv93bQv6kHvxCxP/6K9Hbp2KRQkMXSHv7jOUmOhSZ2UJ0y+4gXVh14GtCMPjZLpQmLkhgBkN2yLdJ9gVJOcgbrACd6RroUdJBRIgIPJcddNqnDisyo+pSYS4oOY++hmUe2nuhyWyZrBhG0PQYiqvr+3g0al0ZLlrxEFncDc/lePxxqVKQpVkznEpfs/qNd3h2+fCroATcs8AL1cvjp0cW4YnO2bImaQu0ATiJzPTvrbLpqgfn1ZlqjeZd0LkGfiWdxehpP48S1u2SWwOio3srICtrU6HQlKePe+DMcw44z3si/iAKTOY574BZvNhIDbp15ocMMsAB0byASGmyeoebmKzTxHB41j4CQtSJQC96B8EwF0N6q+DEprD1+AYR/arcCFRWWu89nr2WiYU7UKI+jOw+/AbaHcp/5FO2dHSXyhq+R0TreMcdXAmUnSmnv/chiE8VkB2Enw0IqY6mDmz63y8MBSxD+3MkzUYaqNNHLhXGy36pP8XuNoLA/5dThnUOOpmIT8NGEK8qLxi4g9pyw81CpaaytqRBGDI+tfocmdrkZY6eQJetwMHgkvEDG4rJeMNoX33Hpy4T6kbeTl4urZp8UmuMc3spPxHZw/A3BM8qndBJYyCsxikzQvvKLK+SuFmW2g6+e8dAvlCLNwFeaLvUZ0vEUzzlJH5BfVZNiX2c6E19rWubRBlzRF40iI9oY95lssp/yVHsAjozNTwOPqfWwvHKyEXvdelx6rcbPDOpIt4ORkf6eixN8eH7xJLYl9wcd2gjJqZDdDXUIsvfs1KGsOd3yrgjRXVnSUCYSe/pRSoFiOm4gBDM14Ii1/YqFi/k/TG/P0HL8M8+DvlmBAQ2DMqZLIY6MNglm4VqzOnIG9QFyaZRMvxxvuHxqAqJr7AJcZPwPRGnGubS5p+ivM35PvmxCLmNjpbQ6ZTQMr7IF3s+XrNntfSjQyZN0y2hnkwnBgN1UeT2jl9B8O8t9Jtdbgihn0QC3Enf734xXDIqAGbO5AiQ5yvJEFD7JdXcVs8L5y0zHFpLv0FYpNhY8jKrvk4zqkpbdND3/fxGTE1r0ER1pwnNG1t0CaKkOZpazFj1OrLE9pdP9P9u5ZhwzSHQt71Yz7zPbAyuG2QzvddQCN+FqgtmgsIB92xsXNSaY9BaXpUj4eSqVpEe8qP6quz8IL0tgjzFq1YJbfVfFFj0i4b/j0lbc4UJqlC/y6I6d/3q1nZTDlV67U40anRYIMZJwY5OOZlFaQ/T3D6eyObPjgUmsbTTQE3YVJRQNziwQmKR2BfrA1i2/gGCYWw0BV33iqw+GfRQecmfpBLQNtdIX9kE/2xLeATq/c/5wo2YU+4UjNO05S+LOlzfG90Q0yQRGDX4IP63VptEjQeUQlWIVNtdzY8gm3Gt7H67Z8BMcG4w+LJ1d2kUgxCevjJ2cAerf63HAQvC40fpQjnJuJ6Rqd1w/sIIvSrPRuDQXDfwocxDQo7OQ7+mIj7AsL8H1qtmjUp8816uvFHIMSZWnj6L34vF/nBykO/VwxhOSZhAJv0VaTBf8hhIACgk/2b//LQENBtAyrRRkYovQycT/P7gIDAQiAAAAAAAAmyuiCCCKgPYKM0z00+Zp92OfpXtPhbHTWztLV9DKITPh9eOT8hFyNCizYDzeQxsM3QnNFK4xkq6MvLAhYyYQWpEAuOHvJhHlhI1tgjKOii2K4ysmYSzIai0WoN4g/iVwJSxs7hCci5RgpZ8Tio0T/GsQRWagQiu36Boi9cFEAGpNl6ae83ZA6+Ina5bSClPG5vYyw6WiBPgY9AQbuO94cdPCDpYpwd2OMcIk+p3nCpQTnS3q2ga7UiLRTBhqyABdGRzYg7E9P6mAXe5kuuI7jRnpWf50LJiytEDyNjZ1ODluUkyhVVyL4fa4eLPqa5zTRb3RfuAOYBOjTdtlwmJaoGof4Nts+N5cahPGQf4ePE3gkFacE+L+PkkmwhZlEy9S959ZU6Z+6xawTebfxnOr2PiOgKaORDpatOAwGK67NMmfvv3paJY5gf+3iNWSw4r0LZqIKL/84uuOCd+sTUz0wQVb1dl0i57wyICrzGHYTG3fWAuObCAnV71jOosK2Pa1M4GyM5QQj+waWgn8/MnxTi+L2xX9U31DslfuR7dH+6Jr/ZpI2DoHnE7e2RVLolhy7WLbpb50tftlQj/xPWK9RtXYMW6JWGeVwYAqzxYKaX9jUGey7dLsooHtwZatNFxbddJtalB9kczigvS7dFw/xRxEcKiDGZGzwQipYeYSTbEn1wB9DM1KJ0fIbYUoVDIWA1Kz8xFvNcqULyVNAXQ6oVbHJLY1l2xPnuxV7qPRymUeF39QdwzVC52m60GeTMPfV5Z6ndW8bZX24Yr9f9DnChTGElPs/fiGiZrFOvJJTp14dtiKxXmBm+i8GFY1TUQuSCx3ezvRWh97zJBDpvw+wBwG6LjZ78LTEz0UlFiY1N/5vvIcTJC65xPdKf/PD/5zAX762/ajCQTG0rJCYiY3fXbxobdvy2wyB0RiCfDh97Oz1z/lVc6MnXtG8pJi4ii8nXMHfVIMtul5XTBtktkgkH54Gv3spMV7n/Pyf626fAE4VyF3APVr609c6fDuuVe/rMv8h6qxFzVliuGjv2QK87P2DaSWMiKu7B2FflYCLpmJ8xIBdlb7cNc26LaGcYLPoOAq2EavyeSvPq+kUBNKqCPogiBw1414+zfUF6gsNlLnhL3KqCKzTMd+XKsG146d5v6CHc03n7tBCkd3SdJ6NwPZkVxuWmbsecaxisHZXlZVVpGdd33RWec00H58VHIBeuOeJXFNbYzfLgWd7pRlbHcwwpr4Gal8qZwJOPet4bwApKwiDFa7DiCXpOnY9MoFRZTpgBR3wxIfh9WA1JdH63hy+R2lP9GbPzheizEBXa/yw/3tIgb8PRrOlWfZ+QEVmATdWhb/j/dD6Gob1x1izq1S+YkNydPD9372LhnTX2V5G5JEhWCn0BzQmmlBAb49PEPnVmgTmJ22FsTmP97TofoBq2RuTle79nggRk6OgZ7obdNxT6kB9HGfF3IoT0aiL6epMR2IkWwYf94hLI54H034ePBQ/w7u2/TLeXWb9WftWZsZBPCB6UmgwOynPkwM5hQ2giKY9e0OXXRnVsHm0TpzbaNY+s0WCuByskAZqmKLA9CjvrQBMYlZPQ+h6ev4To3Kfp+bh6rpwfqqlA0kEwwOdkNzHvHUkSCT/VWTmOetRUYm0n8dlRv8TsA408tYsNdO8JAcpjGAxenoRpzMq9Y2ZfukPKttry1ic+UXCjuA2ASukxH+ir5jJQ/lJ8K50ILmf3BYTXgzF+4BIOdnvXfdu0JrEPBOU1Z7yxhkqw85/NQNiXxuPanVo9fglkSooAC1Wn/OT8hj4/5oC/GXivQmHR3GC+KuxUJ2DJW2TLWFZ7xVNqZpzFajn2RShuUcuJflb23Pa5rUwN5QRLWF+Iy2JUFL/vU3mkms8JVady3kPDJYpp8N7h5f7FG2S1RcFiNaWadnnWvEluOfPn/Bjm/pV8BAfbcSsfhj64a8q+WInjpoJZNa/9ndTwTbdX7Sk5LKWbilIZV7e08y5M8/J75BY7dBAB2WuaF8GsGiMVlpqSq5VZHuH/mtq7C8WsSmxZndpS+/R2TeN1Ac28spwGkyH+abFZhrpQo/jWifs53ZMFgNmwRGHsVZpKgkvbm3gAzsJgiviANrtMLPrTd9K71XoZt+RBPcoI99bqR4YwG/kKCbnyqx9p61uVbEYk336M00hPOBz7zC1PceqhPk2iTrTPswQhLH8i4WyTHkQMrjKG5PeY9JnmJYTPm6NUdk0FF7NA32W0pquF0h42o50h8rifBGMpQkRw7Q6khHATCyr0Q5EVsQcuN+j0TIEMoKvqH5IkEiTTTGJpMSQgq2rS/4jrMBwChA7v9lVmHiH29+Ul0JxEK4VHL/T1O52b9DqA35zSqFIX15rdjFBHV4CWRGFAtWbkEx8T/EYP1ragZriBCcTq5EtCEg+sf9jDHfdDR0Kqw8fg79Hk6fRzvTARQdIYGFPf+yL00u1C1PgQWEQd6gpTl/wguVtOJojc/DS5jikpwh6sMcDxAZsZ5xFp98J83zaIFexckyCF4lM/a0sVpu583MnsY6t8YqYXs+RA7Qo7pe6XX/TQWewLZATH2ujQcFXs2IrTbyA88Y2LGAL9evaBhYosFaICbzFQmIKPPkwT4suC1x6WJt9R50wr64phBLXF3jEq8NvQfxosmJR4HPm2EyyAF/4B5v9bdlb9brVsg7XI7lmrIjMJoP5nX88he7upBYwgkQWUY/NJ06+3AIxgh7lH3CH81wkSkaL33vLA4/A0SdsB8TBMdGdrrrXhDpmyIZ9UGQkcef9+plko0/fkKWAjcVPS8MTGdgM083PVP72s1Ogspe6pJFGw70oAGPmjSoupDhOHGcmKTjdq9gGdNegWjcj4tMlO8skZgjiwXT+FU7avCdB7PGCu978Um7CCBuMXhRswradFoBqpypngTtB8+KLz0b2qZkksa61ASmGZl0xRZfEsK/hPfUP13XSC3FVmsp2mewpGj4mF2dEIdjskVjgyMoQCW4098aq9nzMTIox7CU49xdZUaqlhz7Q+yJd++MPBQHjDbrNVtIET3pdbrrxtVhm2SssaKq2haKkLW3xVlWHVAurWGbaKYKjDjN9FVrdCFpP2EStZ3KVSS2BodgVBpASN9LCcFVimzPtHvaZDrwaIT28KZHIkX3HA8VYuG3N/evYWJiiiHB+FtOp6AfqlZcsEyKhMFTFvCR3a5TaIjhBbHO8fwHTzsNR0+t7LgvwgawNuT9GV470Q/Lxkwm0ugs5+eHri7lWAyKPFD4/D5Lx0F96bgN1nTV9/QM1FRfKjmOHIhafTqvL8y4jcwQLp51lkBkQgYbbH2C5LVkCNk13VMAzpFUiYsWFQo4RcKDdIdnsREbiTnopSK7QRbiAKxW6WFMlWBpG9bZHH3u7ORwQDWaZwBQErpmWydzvx/lLqTMujeAMfoQmb1RGK0k"},5820:(A,e,a)=>{a.d(e,{A:()=>s});const s=a.p+"assets/images/league-members-fd5562d01d57b04331fa2e75a9954cc6.avif"},8524:(A,e,a)=>{a.d(e,{A:()=>s});const s=a.p+"assets/images/league-of-entropy-c53918ec1c15ce148a65857a820b1014.avif"}}]); \ No newline at end of file diff --git a/site/assets/js/2080a1aa.9945b360.js b/site/assets/js/2080a1aa.9945b360.js new file mode 100644 index 00000000..2e1bdb88 --- /dev/null +++ b/site/assets/js/2080a1aa.9945b360.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3833],{6705:a=>{a.exports=JSON.parse('{"tag":{"label":"Hola","permalink":"/drand-docs/blog/tags/hola","description":"Hola tag description","allTagsPath":"/drand-docs/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/drand-docs/blog/tags/hola","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/2237.982ee814.js b/site/assets/js/2237.982ee814.js new file mode 100644 index 00000000..7b742c96 --- /dev/null +++ b/site/assets/js/2237.982ee814.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2237],{3363:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var i=n(4164),o=n(1312),s=n(1107),r=n(4848);function a(e){let{className:t}=e;return(0,r.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var i=n(1312),o=n(1213),s=n(781),r=n(3363),a=n(4848);function d(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}}}]); \ No newline at end of file diff --git a/site/assets/js/24f06274.cc8c4631.js b/site/assets/js/24f06274.cc8c4631.js new file mode 100644 index 00000000..4c89802b --- /dev/null +++ b/site/assets/js/24f06274.cc8c4631.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4318],{9202:d=>{d.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"6.0 DRAND FAQ","description":"A list of frequently asked questions and their answers.","slug":"/category/60-drand-faq","permalink":"/drand-docs/docs/category/60-drand-faq","sidebar":"docsSidebar","navigation":{"previous":{"title":"5.1 Contributing","permalink":"/drand-docs/docs/drand-community/5-1-drand-community-contributing"},"next":{"title":"6.0 DRAND FAQ","permalink":"/drand-docs/docs/drand-faq/6-0-drand-faq"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/2a9db486.1f5e4555.js b/site/assets/js/2a9db486.1f5e4555.js new file mode 100644 index 00000000..86c05952 --- /dev/null +++ b/site/assets/js/2a9db486.1f5e4555.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2691],{57:t=>{t.exports=JSON.parse('{"authors":[{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","page":{"permalink":"/drand-docs/blog/authors/yangshun"},"socials":{"x":"https://x.com/yangshunz","github":"https://github.com/yangshun"},"imageURL":"https://github.com/yangshun.png","key":"yangshun","count":3},{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","page":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles"},"socials":{"x":"https://x.com/sebastienlorber","linkedin":"https://www.linkedin.com/in/sebastienlorber/","github":"https://github.com/slorber","newsletter":"https://thisweekinreact.com"},"imageURL":"https://github.com/slorber.png","key":"slorber","count":3},{"name":"Kent Bull","title":"drand Community Manager","url":"https://kentbull.com","page":{"permalink":"/drand-docs/blog/authors/kentbull"},"socials":{"x":"https://x.com/kentopbull","github":"https://github.com/kentbull"},"imageURL":"https://avatars.githubusercontent.com/u/65027257?v=4","key":"kentbull","count":1},{"name":"Dave Grantham","title":"drand Community Scout Master","url":"https://cryptid.tech","page":{"permalink":"/drand-docs/blog/authors/all-dave-grantham-articles"},"socials":{"github":"https://github.com/dhuseby"},"imageURL":"https://avatars.githubusercontent.com/u/5017470?v=4","key":"dgrantham","count":1}]}')}}]); \ No newline at end of file diff --git a/site/assets/js/2acb4dcc.e1a2a4c1.js b/site/assets/js/2acb4dcc.e1a2a4c1.js new file mode 100644 index 00000000..58a7f440 --- /dev/null +++ b/site/assets/js/2acb4dcc.e1a2a4c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9025],{5645:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>l,frontMatter:()=>d,metadata:()=>o,toc:()=>c});var r=t(4848),s=t(8453);const d={id:"6-0-drand-faq",title:"6.0 DRAND FAQ",description:"A list of frequently asked questions and their answers."},a="6.0 DRAND FAQ",o={id:"drand-faq/6-0-drand-faq",title:"6.0 DRAND FAQ",description:"A list of frequently asked questions and their answers.",source:"@site/docs/06_drand-faq/06-00-DRAND_FAQ.md",sourceDirName:"06_drand-faq",slug:"/drand-faq/6-0-drand-faq",permalink:"/drand-docs/docs/drand-faq/6-0-drand-faq",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/06_drand-faq/06-00-DRAND_FAQ.md",tags:[],version:"current",frontMatter:{id:"6-0-drand-faq",title:"6.0 DRAND FAQ",description:"A list of frequently asked questions and their answers."},sidebar:"docsSidebar",previous:{title:"6.0 DRAND FAQ",permalink:"/drand-docs/docs/category/60-drand-faq"}},i={},c=[];function u(e){const n={h1:"h1",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"60-drand-faq",children:"6.0 DRAND FAQ"})}),"\n",(0,r.jsx)(n.p,{children:"[Note: Currently a stub. Fill this up!]"}),"\n",(0,r.jsx)(n.p,{children:""})]})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var r=t(6540);const s={},d=r.createContext(s);function a(e){const n=r.useContext(d);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/2b46ab97.81ab04ae.js b/site/assets/js/2b46ab97.81ab04ae.js new file mode 100644 index 00000000..dcce1578 --- /dev/null +++ b/site/assets/js/2b46ab97.81ab04ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[580],{2405:a=>{a.exports=JSON.parse('{"metadata":{"permalink":"/drand-docs/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/3347.8e958281.js b/site/assets/js/3347.8e958281.js new file mode 100644 index 00000000..0cd8d9cd --- /dev/null +++ b/site/assets/js/3347.8e958281.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3347],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>M,Ki:()=>A,kJ:()=>f,x:()=>i,e7:()=>u,J_:()=>x,Gx:()=>_});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function u(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var m=a(6025),h=a(4586);const d=e=>new Date(e).toISOString();function g(e){const t=e.map(v);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function f(e){const{siteConfig:t}=(0,h.A)(),{withBaseUrl:a}=(0,m.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,u=n.image??s.image,m=s.keywords??[],h=`${t.url}${r.permalink}`,f=c?d(c):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:i,name:i,description:o,datePublished:l,...f?{dateModified:f}:{},...g(r.authors),...p(u,a,i),...m?{keywords:m}:{}}}(e.content,t,a)))}}function x(){const e=i(),{assets:t,metadata:a}=u(),{siteConfig:n}=(0,h.A)(),{withBaseUrl:s}=(0,m.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:f}=a,x=t.image??c.image,v=c.keywords??[],j=f?d(f):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...j?{dateModified:j}:{},...g(a.authors),...p(x,s,l),...v?{keywords:v}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function v(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),w=a(8774),N=a(1682),k=a(9169);function _(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,N.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function M(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(w.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},6913:(e,t,a)=>{a.d(t,{A:()=>j});a(6540);var n=a(4164),s=a(8774),r=a(4848);const l="githubSvg_Uu4N";const i="xSvg_y3PF";const o=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},c={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},u={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,l),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,i),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function m(e){let{platform:t,link:a}=e;const{Icon:l,label:i}=u[m=t]??{Icon:o,label:m};var m;return(0,r.jsx)(s.A,{className:c.authorSocialLink,href:a,title:i,children:(0,r.jsx)(l,{className:(0,n.A)(c.authorSocialLink)})})}function h(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:c.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(m,{platform:t,link:a},t)}))})}var d=a(1107);const g={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function p(e){return e.href?(0,r.jsx)(s.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function f(e){let{title:t}=e;return(0,r.jsx)("small",{className:g.authorTitle,title:t,children:t})}function x(e){let{name:t,as:a}=e;return a?(0,r.jsx)(d.A,{as:a,className:g.authorName,children:t}):(0,r.jsx)("span",{className:g.authorName,children:t})}function v(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(g.authorBlogPostCount),children:t})}function j(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:u,email:m,page:d}=a,j=d?.permalink||c||m&&`mailto:${m}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,g[`author-as-${t}`]),children:[u&&(0,r.jsx)(p,{href:j,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",g.authorImage),src:u,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",g.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(p,{href:j,children:(0,r.jsx)(x,{name:i,as:t})}),l&&(0,r.jsx)(v,{count:l})]}),!!o&&(0,r.jsx)(f,{title:o}),(0,r.jsx)(h,{author:a})]})]})}},8027:(e,t,a)=>{a.d(t,{A:()=>L});var n=a(6540),s=a(4164),r=a(781),l=a(4581),i=a(1312),o=a(4096),c=a(6342),u=a(1107),m=a(4848);function h(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,m.jsxs)("div",{role:"group",children:[(0,m.jsx)(u.A,{as:"h3",className:a,children:t}),n]})}function d(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,m.jsx)(m.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,m.jsx)(h,{year:t,yearGroupHeadingClassName:a,children:(0,m.jsx)(n,{items:s})},t)}))})}return(0,m.jsx)(n,{items:t})}const g=(0,n.memo)(d),p="sidebar_re4s",f="sidebarItemTitle_pO2u",x="sidebarItemList_Yudw",v="sidebarItem__DBe",j="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",w="yearGroupHeading_rMGB",N=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(x,"clean-list"),liClassName:v,linkClassName:j,linkActiveClassName:b})};function k(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)("aside",{className:"col col--3",children:(0,m.jsxs)("nav",{className:(0,s.A)(p,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,m.jsx)("div",{className:(0,s.A)(f,"margin-bottom--md"),children:t.title}),(0,m.jsx)(g,{items:a,ListComponent:N,yearGroupHeadingClassName:w})]})})}const _=(0,n.memo)(k);var A=a(5600);const M={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,m.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function y(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,m.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:M.yearGroupHeading})}function P(e){return(0,m.jsx)(A.GX,{component:y,props:e})}const B=(0,n.memo)(P);function I(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,m.jsx)(B,{sidebar:t}):(0,m.jsx)(_,{sidebar:t}):null}function L(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,m.jsx)(r.A,{...l,children:(0,m.jsx)("div",{className:"container margin-vert--lg",children:(0,m.jsxs)("div",{className:"row",children:[(0,m.jsx)(I,{sidebar:t}),(0,m.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,m.jsx)("div",{className:"col col--2",children:a})]})})})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/site/assets/js/33fc5bb8.b8d29537.js b/site/assets/js/33fc5bb8.b8d29537.js new file mode 100644 index 00000000..accae3ab --- /dev/null +++ b/site/assets/js/33fc5bb8.b8d29537.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[867],{778:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(6540);var s=a(4164),r=a(1213),n=a(7559),o=a(6461),l=a(8774),i=a(4096),c=a(8027),d=a(7713),u=a(1463),m=a(3892),g=a(6913),h=a(4848);function p(e){let{author:t}=e;const a=(0,o.wI)(t);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(r.be,{title:a}),(0,h.jsx)(u.A,{tag:"blog_authors_posts"})]})}function x(){const{authorsListPath:e}=(0,i.x)();return(0,h.jsx)(l.A,{href:e,children:(0,h.jsx)(o.np,{})})}function j(e){let{author:t,items:a,sidebar:s,listMetadata:r}=e;return(0,h.jsxs)(c.A,{sidebar:s,children:[(0,h.jsxs)("header",{className:"margin-bottom--xl",children:[(0,h.jsx)(g.A,{as:"h1",author:t}),t.description&&(0,h.jsx)("p",{children:t.description}),(0,h.jsx)(x,{})]}),(0,h.jsx)("hr",{}),(0,h.jsx)(m.A,{items:a}),(0,h.jsx)(d.A,{metadata:r})]})}function b(e){return(0,h.jsxs)(r.e3,{className:(0,s.A)(n.G.wrapper.blogPages,n.G.page.blogAuthorsPostsPage),children:[(0,h.jsx)(p,{...e}),(0,h.jsx)(j,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(1312),r=a(9022),n=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,n.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,n.jsx)(r.A,{permalink:a,title:(0,n.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),o&&(0,n.jsx)(r.A,{permalink:o,title:(0,n.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},2907:(e,t,a)=>{a.d(t,{A:()=>O});a(6540);var s=a(4164),r=a(4096),n=a(4848);function o(e){let{children:t,className:a}=e;return(0,n.jsx)("article",{className:a,children:t})}var l=a(8774);const i={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,r.e7)(),{permalink:c,title:d}=a,u=o?"h1":"h2";return(0,n.jsx)(u,{className:(0,s.A)(i.title,t),children:o?d:(0,n.jsx)(l.A,{to:c,children:d})})}var d=a(1312),u=a(5846),m=a(6266);const g={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,n.jsx)(n.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,n.jsx)("time",{dateTime:t,children:a})}function x(){return(0,n.jsx)(n.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,r.e7)(),{date:o,readingTime:l}=a,i=(0,m.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,n.jsxs)("div",{className:(0,s.A)(g.container,"margin-vert--md",t),children:[(0,n.jsx)(p,{date:o,formattedDate:(c=o,i.format(new Date(c)))}),void 0!==l&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(x,{}),(0,n.jsx)(h,{readingTime:l})]})]});var c}var b=a(6913);const f={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,r.e7)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t})),i=1===a.length;return(0,n.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?f.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,n.jsx)("div",{className:(0,s.A)(!l&&(i?"col col--12":"col col--6"),l?f.imageOnlyAuthorCol:f.authorCol),children:(0,n.jsx)(b.A,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,n.jsxs)("header",{children:[(0,n.jsx)(c,{}),(0,n.jsx)(j,{}),(0,n.jsx)(A,{})]})}var T=a(440),N=a(5533);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,r.e7)();return(0,n.jsx)("div",{id:o?T.LU:void 0,className:(0,s.A)("markdown",a),children:(0,n.jsx)(N.A,{children:t})})}var P=a(7559),y=a(4336),k=a(2053);function _(){return(0,n.jsx)("b",{children:(0,n.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function U(e){const{blogPostTitle:t,...a}=e;return(0,n.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,n.jsx)(_,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,r.e7)(),{tags:a,title:o,editUrl:l,hasTruncateMarker:i,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&i,m=a.length>0;if(!(m||u||l))return null;if(t){const e=!!(l||d||c);return(0,n.jsxs)("footer",{className:"docusaurus-mt-lg",children:[m&&(0,n.jsx)("div",{className:(0,s.A)("row","margin-top--sm",P.G.blog.blogFooterEditMetaRow),children:(0,n.jsx)("div",{className:"col",children:(0,n.jsx)(k.A,{tags:a})})}),e&&(0,n.jsx)(y.A,{className:(0,s.A)("margin-top--sm",P.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,n.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[m&&(0,n.jsx)("div",{className:(0,s.A)("col",{"col--9":u}),children:(0,n.jsx)(k.A,{tags:a})}),u&&(0,n.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":m}),children:(0,n.jsx)(U,{blogPostTitle:o,to:e.permalink})})]})}function O(e){let{children:t,className:a}=e;const l=function(){const{isBlogPostPage:e}=(0,r.e7)();return e?void 0:"margin-bottom--xl"}();return(0,n.jsxs)(o,{className:(0,s.A)(l,a),children:[(0,n.jsx)(v,{}),(0,n.jsx)(w,{children:t}),(0,n.jsx)(R,{})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4096),r=a(2907),n=a(4848);function o(e){let{items:t,component:a=r.A}=e;return(0,n.jsx)(n.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,n.jsx)(s.in,{content:t,children:(0,n.jsx)(a,{children:(0,n.jsx)(t,{})})},t.metadata.permalink)}))})}},6461:(e,t,a)=>{a.d(t,{ZD:()=>l,np:()=>d,uz:()=>c,wI:()=>i});a(6540);var s=a(1312),r=a(5846),n=a(4848);function o(){const{selectMessage:e}=(0,r.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function l(e){const t=o();return(0,s.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function i(e){const t=o();return(0,s.T)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:t(e.count),authorName:e.name||e.key})}const c=()=>(0,s.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function d(){return(0,n.jsx)(s.A,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}}}]); \ No newline at end of file diff --git a/site/assets/js/36994c47.47378eed.js b/site/assets/js/36994c47.47378eed.js new file mode 100644 index 00000000..ac7a9983 --- /dev/null +++ b/site/assets/js/36994c47.47378eed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9858],{5516:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/site/assets/js/3e814fbd.757e41f8.js b/site/assets/js/3e814fbd.757e41f8.js new file mode 100644 index 00000000..a286eeca --- /dev/null +++ b/site/assets/js/3e814fbd.757e41f8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1502],{1026:e=>{e.exports=JSON.parse('{"author":{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","page":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles"},"socials":{"x":"https://x.com/sebastienlorber","linkedin":"https://www.linkedin.com/in/sebastienlorber/","github":"https://github.com/slorber","newsletter":"https://thisweekinreact.com"},"imageURL":"https://github.com/slorber.png","key":"slorber","count":3},"listMetadata":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/4c7240d8.b5d9d4d0.js b/site/assets/js/4c7240d8.b5d9d4d0.js new file mode 100644 index 00000000..bce117b1 --- /dev/null +++ b/site/assets/js/4c7240d8.b5d9d4d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3655],{3823:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var r=i(4848),d=i(8453);const s=i.p+"assets/images/Go-Logo_Blue-6a3cd1884425f3b03c7dfc819b3abac8.png",t=i.p+"assets/images/JavaScriptBadge-130c0ecd57833da6f75c6e5acfc50b09.png",l={id:"3-3-dev-guide-client-libraries",title:"3.3 Client Libraries",description:"Instructions for installing and using client libraries."},a="3.3 DevGuide: Client Libraries",c={id:"dev-guide/3-3-dev-guide-client-libraries",title:"3.3 Client Libraries",description:"Instructions for installing and using client libraries.",source:"@site/docs/03_dev-guide/03-03-DevGuide_Client_Libraries.mdx",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-3-dev-guide-client-libraries",permalink:"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-03-DevGuide_Client_Libraries.mdx",tags:[],version:"current",frontMatter:{id:"3-3-dev-guide-client-libraries",title:"3.3 Client Libraries",description:"Instructions for installing and using client libraries."},sidebar:"docsSidebar",previous:{title:"3.2 drand-client CLI",permalink:"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli"},next:{title:"3.4 HTTP API",permalink:"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api"}},o={},h=[{value:"Install",id:"install",level:3},{value:"Usage",id:"usage",level:3},{value:"Install",id:"install-1",level:3},{value:"Usage",id:"usage-1",level:3}];function g(e){const n={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"33-devguide-client-libraries",children:"3.3 DevGuide: Client Libraries"})}),"\n",(0,r.jsxs)(n.p,{children:["Client libraries enable easy access to drand randomness in specific programming languages. They also provide peace of mind by\xa0",(0,r.jsx)(n.em,{children:"verifying"}),"\xa0randomness rounds and add additional features like failover, racing, aggregation, and caching."]}),"\n",(0,r.jsxs)(n.p,{children:["Drand randomness is available over\xa0",(0,r.jsx)(n.a,{href:"./3-4-dev-guide-http-api",children:(0,r.jsx)(n.strong,{children:"HTTP"})}),",\xa0",(0,r.jsx)(n.a,{href:"./3-5-dev-guide-pubsub-network",children:(0,r.jsx)(n.strong,{children:"libp2p PubSub"})}),"\xa0and gRPC."]}),"\n",(0,r.jsx)(n.p,{children:"Currently, the following client libraries are available:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/drand/drand",children:(0,r.jsx)(n.strong,{children:"Go"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/drand/drand-client",children:(0,r.jsx)(n.strong,{children:"JavaScript"})})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["If your application cannot use the libraries above, you can still use the\xa0",(0,r.jsx)(n.a,{href:"./3-2-dev-guide-drand-client-cli",children:(0,r.jsx)(n.strong,{children:"drand-client CLI"})}),"\xa0or make requests to the\xa0",(0,r.jsx)(n.a,{href:"./3-4-dev-guide-http-api",children:(0,r.jsx)(n.strong,{children:"HTTP API"})}),"\xa0endpoints. If you have created a client library or know of a client library not listed here,\xa0",(0,r.jsx)(n.a,{href:"https://github.com/drand/website/issues/new",children:(0,r.jsx)(n.strong,{children:"please let us know by opening an issue"})}),"."]}),"\n",(0,r.jsx)("img",{src:s,alt:"Go Logo",width:"100"}),"\n",(0,r.jsx)(n.h3,{id:"install",children:(0,r.jsx)(n.strong,{children:"Install"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"go get github.com/drand/drand\n"})}),"\n",(0,r.jsx)(n.h3,{id:"usage",children:(0,r.jsx)(n.strong,{children:"Usage"})}),"\n",(0,r.jsxs)(n.p,{children:["The Go drand client library is structured with a base client interface in\xa0",(0,r.jsx)(n.code,{children:"/client"}),", and with protocol-specific transport implementations in\xa0",(0,r.jsx)(n.code,{children:"/client/http"}),",\xa0",(0,r.jsx)(n.code,{children:"/client/grpc"}),"\xa0and\xa0",(0,r.jsx)(n.code,{children:"/lp2p/client"}),". The main\xa0",(0,r.jsx)(n.code,{children:"client"}),"\xa0package holds transport agnostic logic for retrying, validation, and caching."]}),"\n",(0,r.jsx)(n.p,{children:"For documentation and examples please check the Go clients reference:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Transport agnostic top-level client:\xa0",(0,r.jsx)(n.a,{href:"https://pkg.go.dev/github.com/drand/drand/client",children:(0,r.jsx)(n.strong,{children:"https://pkg.go.dev/github.com/drand/drand/client"})})]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Client implementations (to be used with the above):"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"./3-4-dev-guide-http-api",children:(0,r.jsx)(n.strong,{children:"HTTP"})}),"\xa0client:\xa0",(0,r.jsx)(n.a,{href:"https://pkg.go.dev/github.com/drand/drand/client/http",children:(0,r.jsx)(n.strong,{children:"https://pkg.go.dev/github.com/drand/drand/client/http"})})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"./3-5-dev-guide-pubsub-network",children:(0,r.jsx)(n.strong,{children:"libp2p gossip"})}),"\xa0client:\xa0",(0,r.jsx)(n.a,{href:"https://pkg.go.dev/github.com/drand/drand/lp2p/client",children:(0,r.jsx)(n.strong,{children:"https://pkg.go.dev/github.com/drand/drand/lp2p/client"})})]}),"\n",(0,r.jsxs)(n.li,{children:["gRPC client:\xa0",(0,r.jsx)(n.a,{href:"https://pkg.go.dev/github.com/drand/drand/client/grpc",children:(0,r.jsx)(n.strong,{children:"https://pkg.go.dev/github.com/drand/drand/client/grpc"})})]}),"\n"]}),"\n",(0,r.jsx)("img",{src:t,width:"100"}),"\n",(0,r.jsx)(n.h3,{id:"install-1",children:(0,r.jsx)(n.strong,{children:"Install"})}),"\n",(0,r.jsxs)(n.p,{children:["In the browser or\xa0",(0,r.jsx)(n.a,{href:"https://deno.land/",children:"Deno"})," you can grab and use the client from a CDN e.g.\xa0",(0,r.jsx)(n.a,{href:"https://cdn.jsdelivr.net/npm/drand-client/drand.js",children:"https://cdn.jsdelivr.net/npm/drand-client/drand.js"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["In\xa0",(0,r.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"}),", install with:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"npm install drand-client\n"})}),"\n",(0,r.jsx)(n.h3,{id:"usage-1",children:(0,r.jsx)(n.strong,{children:"Usage"})}),"\n",(0,r.jsxs)(n.p,{children:["The JS drand client is an esmodule. It has no dependencies and is not transpiled. It can be\xa0",(0,r.jsx)(n.code,{children:"import"}),"ed directly in the browser, Deno or Node.js. In Node.js it can be imported from CommonJS using\xa0",(0,r.jsx)(n.code,{children:"await import('...')"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/drand/drand-client#usage",children:(0,r.jsx)(n.strong,{children:"Usage and examples"})})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/drand/drand-client#api",children:(0,r.jsx)(n.strong,{children:"API reference"})})}),"\n"]}),"\n",(0,r.jsx)(n.hr,{})]})}function p(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>l});var r=i(6540);const d={},s=r.createContext(d);function t(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/4e0eb3dc.b3f03104.js b/site/assets/js/4e0eb3dc.b3f03104.js new file mode 100644 index 00000000..a10387f5 --- /dev/null +++ b/site/assets/js/4e0eb3dc.b3f03104.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1245],{101:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>d});var o=n(4848),r=n(8453);const a={slug:"drand-greetings",title:"Greetings!",authors:["kentbull","dgrantham"],tags:["hello"]},s=void 0,i={permalink:"/drand-docs/blog/drand-greetings",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2024-08-19-greetings.md",source:"@site/blog/2024-08-19-greetings.md",title:"Greetings!",description:"Congratulations, you have made your first post!",date:"2024-08-19T00:00:00.000Z",tags:[{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"}],readingTime:.345,hasTruncateMarker:!0,authors:[{name:"Kent Bull",title:"drand Community Manager",url:"https://kentbull.com",page:{permalink:"/drand-docs/blog/authors/kentbull"},socials:{x:"https://x.com/kentopbull",github:"https://github.com/kentbull"},imageURL:"https://avatars.githubusercontent.com/u/65027257?v=4",key:"kentbull"},{name:"Dave Grantham",title:"drand Community Scout Master",url:"https://cryptid.tech",page:{permalink:"/drand-docs/blog/authors/all-dave-grantham-articles"},socials:{github:"https://github.com/dhuseby"},imageURL:"https://avatars.githubusercontent.com/u/5017470?v=4",key:"dgrantham"}],frontMatter:{slug:"drand-greetings",title:"Greetings!",authors:["kentbull","dgrantham"],tags:["hello"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/drand-docs/blog/welcome"}},l={authorsImageUrls:[void 0,void 0]},d=[];function c(t){const e={admonition:"admonition",p:"p",...(0,r.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.p,{children:"Congratulations, you have made your first post!"}),"\n",(0,o.jsx)(e.p,{children:"Feel free to play around and edit this post as much as you like."}),"\n",(0,o.jsx)(e.p,{children:"We are building a replacement for the drand community docs."}),"\n",(0,o.jsx)(e.p,{children:"Once we are done then all of the docs will be done with docusaurus."}),"\n",(0,o.jsx)(e.p,{children:"How is line six?"}),"\n",(0,o.jsx)(e.admonition,{title:"Or eight?",type:"tip",children:(0,o.jsx)(e.p,{children:"Or eight lines?"})}),"\n",(0,o.jsx)(e.admonition,{title:"Or ten?",type:"danger",children:(0,o.jsx)(e.p,{children:"Or even ten? Oh no!"})}),"\n",(0,o.jsx)(e.p,{children:"How about twenty?"})]})}function u(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(c,{...t})}):c(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>i});var o=n(6540);const r={},a=o.createContext(r);function s(t){const e=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),o.createElement(a.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/52a7705f.150d1613.js b/site/assets/js/52a7705f.150d1613.js new file mode 100644 index 00000000..e3aa0f5a --- /dev/null +++ b/site/assets/js/52a7705f.150d1613.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5218],{3027:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>t,metadata:()=>o,toc:()=>h});var s=i(4848),r=i(8453);const t={id:"2-1-concepts-cryptography",title:"2.1 Cryptography",description:"An overview of drand's cryptographic building blocks"},a="2.1 Concepts: Cryptography",o={id:"concepts/2-1-concepts-cryptography",title:"2.1 Cryptography",description:"An overview of drand's cryptographic building blocks",source:"@site/docs/02_concepts/02-01-Concepts_Cryptography.md",sourceDirName:"02_concepts",slug:"/concepts/2-1-concepts-cryptography",permalink:"/drand-docs/docs/concepts/2-1-concepts-cryptography",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/02_concepts/02-01-Concepts_Cryptography.md",tags:[],version:"current",frontMatter:{id:"2-1-concepts-cryptography",title:"2.1 Cryptography",description:"An overview of drand's cryptographic building blocks"},sidebar:"docsSidebar",previous:{title:"2.0 Concepts",permalink:"/drand-docs/docs/concepts/2-0-concepts"},next:{title:"2.2 Security Model",permalink:"/drand-docs/docs/concepts/2-2-concepts-security-model"}},c={},h=[{value:"\ud83d\udd73\ufe0f Threshold Cryptography",id:"\ufe0f-threshold-cryptography",level:2},{value:"1. Setup Phase",id:"1-setup-phase",level:2},{value:"\ud83e\udd10 Secret Sharing",id:"-secret-sharing",level:3},{value:"\ud83e\udd2b Verifiable Secret Sharing",id:"-verifiable-secret-sharing",level:3},{value:"\ud83d\udd11 Distributed Key Generation (DKG)",id:"-distributed-key-generation-dkg",level:3},{value:"\ud83d\udea8 2. Beacon Phase",id:"-2-beacon-phase",level:2},{value:"\ud83d\udc6b Pairing-Based Cryptography",id:"-pairing-based-cryptography",level:3},{value:"\ud83c\udfb2 Randomness Generation",id:"-randomness-generation",level:3},{value:"\ud83d\udd0f Smaller Signatures for Resource-Constrained Applications",id:"-smaller-signatures-for-resource-constrained-applications",level:3},{value:"\u26d3\ufe0f Chained and Unchained Modes",id:"\ufe0f-chained-and-unchained-modes",level:3},{value:"\ud83c\udf93 Learning More",id:"-learning-more",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"21-concepts-cryptography",children:"2.1 Concepts: Cryptography"})}),"\n",(0,s.jsx)(n.p,{children:"This document provides an overview of the cryptographic building blocks that drand uses to generate publicly verifiable, unbiased, and unpredictable randomness in a distributed manner."}),"\n",(0,s.jsx)(n.h2,{id:"\ufe0f-threshold-cryptography",children:"\ud83d\udd73\ufe0f Threshold Cryptography"}),"\n",(0,s.jsxs)(n.p,{children:["drand relies on ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Threshold_cryptosystem",children:"threshold cryptography"}),", where a minimum number of participants must work together to execute cryptographic operations. This approach avoids single points of failure and enhances security."]}),"\n",(0,s.jsx)(n.p,{children:"The drand beacon operates in two phases: 1.) the setup phase and 2.) the beacon phase."}),"\n",(0,s.jsx)(n.h2,{id:"1-setup-phase",children:"1. Setup Phase"}),"\n",(0,s.jsxs)(n.p,{children:["The setup phase creates a collective private and public key pair shared among participants. This is done through a ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Distributed_key_generation",children:"Distributed Key Generation"})," (DKG) process, ensuring that no individual node knows the entire collective private key. Each private key share is used for cryptographic threshold computations, such as generating threshold signatures."]}),"\n",(0,s.jsx)(n.h3,{id:"-secret-sharing",children:"\ud83e\udd10 Secret Sharing"}),"\n",(0,s.jsxs)(n.p,{children:["Secret sharing allows a secret value to be split into shares, which can be reconstructed only if a threshold of shares is available. drand uses ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing",children:"Shamir's Secret Sharing"})," (SSS) scheme, which is well-known for its reliability and security."]}),"\n",(0,s.jsx)("aside",{children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)("img",{src:"https://www.notion.so/icons/mathematics_green.svg",alt:"https://www.notion.so/icons/mathematics_green.svg",width:"40px"})," In Shamir's Secret Sharing (SSS), a polynomial of degree $t\u22121$ is constructed, where $t$ is the threshold. The secret is the constant term of this polynomial, and each share is a point on the polynomial. To reconstruct the secret, at least $t$ shares are needed to solve the polynomial equation."]})}),"\n",(0,s.jsx)(n.h3,{id:"-verifiable-secret-sharing",children:"\ud83e\udd2b Verifiable Secret Sharing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Verifiable_secret_sharing",children:"Verifiable Secret Sharing"})," (VSS) ensures that participants can verify their shares, protecting against malicious dealers. drand uses Feldman's VSS scheme, an extension of SSS, to ensure the shared secret can be correctly reconstructed."]}),"\n",(0,s.jsx)("aside",{children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)("img",{src:"https://www.notion.so/icons/mathematics_green.svg",alt:"https://www.notion.so/icons/mathematics_green.svg",width:"40px"})," Feldman's VSS enhances SSS by adding commitments to the polynomial's coefficients. These commitments allow participants to verify their shares against the public commitments, ensuring that the dealer has distributed consistent shares."]})}),"\n",(0,s.jsx)(n.h3,{id:"-distributed-key-generation-dkg",children:"\ud83d\udd11 Distributed Key Generation (DKG)"}),"\n",(0,s.jsx)(n.p,{children:"DKG creates a collectively shared secret without any single participant knowing it. drand uses Pedersen's DKG scheme, running multiple instances of Feldman's VSS in parallel to create a final share for each participant. This collective public key is then used in the randomness generation phase."}),"\n",(0,s.jsx)("aside",{children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)("img",{src:"https://www.notion.so/icons/mathematics_green.svg",alt:"https://www.notion.so/icons/mathematics_green.svg",width:"40px"})," In Pedersen's DKG, each participant generates their own secret and shares it using VSS. The participants then combine these shares to form the collective secret, ensuring that no single participant knows the entire secret."]})}),"\n",(0,s.jsx)(n.h2,{id:"-2-beacon-phase",children:"\ud83d\udea8 2. Beacon Phase"}),"\n",(0,s.jsxs)(n.p,{children:["In the beacon phase, drand uses pairing-based cryptography to generate publicly verifiable, unbiased, and unpredictable randomness. The process involves threshold ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/BLS_digital_signature",children:"Boneh-Lynn-Shacham"})," (BLS) signatures."]}),"\n",(0,s.jsx)(n.h3,{id:"-pairing-based-cryptography",children:"\ud83d\udc6b Pairing-Based Cryptography"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Pairing-based_cryptography",children:"Pairing-based cryptography"})," uses bilinear groups to create efficient cryptographic operations. drand currently uses the ",(0,s.jsx)(n.a,{href:"https://hackmd.io/@benjaminion/bls12-381",children:"BLS12-381"})," curve."]}),"\n",(0,s.jsx)("aside",{children:(0,s.jsx)(n.p,{children:"\ud83d\uddfa\ufe0f Pairing-based cryptography involves a bilinear map, usually denoted as $e: G_1 \\times G_2 \\to G_T$, where $G_1$, $G_2$, and $G_T$ are groups with certain mathematical properties. This map allows for efficient verification of signatures and is central to constructing BLS signatures."})}),"\n",(0,s.jsx)(n.h3,{id:"-randomness-generation",children:"\ud83c\udfb2 Randomness Generation"}),"\n",(0,s.jsx)(n.p,{children:"To generate randomness, drand uses threshold BLS signatures. Each participant creates a partial signature, which are then combined to form a collective BLS signature. This signature is hashed to produce the final random value."}),"\n",(0,s.jsx)("aside",{children:(0,s.jsx)(n.p,{children:"\ud83d\udd73\ufe0f In threshold BLS signatures, each participant generates a partial signature using their private key share. These partial signatures are then combined using Lagrange interpolation over the subgroup $G_1$ to form the final signature. This ensures that no single participant can control the output, and the signature is verifiable using the pairing function."})}),"\n",(0,s.jsx)(n.h3,{id:"-smaller-signatures-for-resource-constrained-applications",children:"\ud83d\udd0f Smaller Signatures for Resource-Constrained Applications"}),"\n",(0,s.jsx)(n.p,{children:"drand supports schemes, which are network-level configurations that determine the cryptographic methods and protocols used to generate randomness. These scheme aim to minimize the size of signatures, reducing storage requirements and improving efficiency."}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-chained-and-unchained-modes",children:"\u26d3\ufe0f Chained and Unchained Modes"}),"\n",(0,s.jsx)(n.p,{children:"drand operates in two modes: chained and unchained. In chained mode, each random value depends on all previous values, ensuring security and consistency. In unchained mode, each random value is generated independently."}),"\n",(0,s.jsx)("aside",{children:(0,s.jsx)(n.p,{children:"\u2139\ufe0f In chained mode, the randomness of each round is linked to the previous rounds, forming a chain. This ensures that any tampering with the randomness of a previous round affects all subsequent rounds. In unchained mode, each round's randomness is independent, simplifying verification but not providing the same level of historical integrity."})}),"\n",(0,s.jsx)(n.h2,{id:"-learning-more",children:"\ud83c\udf93 Learning More"}),"\n",(0,s.jsx)(n.p,{children:"For more detailed information, refer to the drand project specifications and related research papers on scalable bias-resistant distributed randomness."}),"\n",(0,s.jsx)(n.hr,{})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function a(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/5589aa37.9e1166dd.js b/site/assets/js/5589aa37.9e1166dd.js new file mode 100644 index 00000000..6bbed4e0 --- /dev/null +++ b/site/assets/js/5589aa37.9e1166dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2268],{3018:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>l});var r=s(4848),t=s(8453);const d={id:"4-2-ops-guide-docker-install",title:"4.2 Docker Install",description:"Detailed instructions for running a production drand node using Docker."},o="4.2 DevOps: Docker Install",i={id:"ops-guide/4-2-ops-guide-docker-install",title:"4.2 Docker Install",description:"Detailed instructions for running a production drand node using Docker.",source:"@site/docs/04_ops-guide/04-02-DevOps_Docker_Install.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-2-ops-guide-docker-install",permalink:"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-02-DevOps_Docker_Install.md",tags:[],version:"current",frontMatter:{id:"4-2-ops-guide-docker-install",title:"4.2 Docker Install",description:"Detailed instructions for running a production drand node using Docker."},sidebar:"docsSidebar",previous:{title:"4.1 Deployment",permalink:"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment"},next:{title:"4.3 Storage Backends",permalink:"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends"}},c={},l=[{value:"Prerequisites for this Guide",id:"prerequisites-for-this-guide",level:2},{value:"First Steps",id:"first-steps",level:2},{value:"Setting up TLS",id:"setting-up-tls",level:2},{value:"First option: use TLS within drand",id:"first-option-use-tls-within-drand",level:3},{value:"Second option: disable TLS in drand",id:"second-option-disable-tls-in-drand",level:3},{value:"Public HTTP API",id:"public-http-api",level:2},{value:"Generate drand Keys",id:"generate-drand-keys",level:2},{value:"Docker-compose Setup",id:"docker-compose-setup",level:2},{value:"Distributed Key Generation (DKG)",id:"distributed-key-generation-dkg",level:2},{value:"Other Topics",id:"other-topics",level:2},{value:"Updating drand",id:"updating-drand",level:3},{value:"Reset the Docker State (without losing the Keys)",id:"reset-the-docker-state-without-losing-the-keys",level:3},{value:"Method 1: using\xa0drand clean",id:"method-1-usingdrand-clean",level:3},{value:"Method 2: performing a Manual Reset",id:"method-2-performing-a-manual-reset",level:3},{value:"Docker behind Reverse Proxy Setup",id:"docker-behind-reverse-proxy-setup",level:3}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"42-devops-docker-install",children:"4.2 DevOps: Docker Install"})}),"\n",(0,r.jsx)(n.h1,{id:"install-drand-with-docker",children:(0,r.jsx)(n.strong,{children:"Install drand with Docker"})}),"\n",(0,r.jsxs)(n.p,{children:["This page describes how to run a\xa0",(0,r.jsx)(n.em,{children:"production"}),"\xa0version of\xa0",(0,r.jsx)(n.code,{children:"drand"}),"\xa0based on\xa0",(0,r.jsx)(n.code,{children:"docker-compose"}),". This is meant as a\xa0",(0,r.jsx)(n.strong,{children:"production setup"}),". It notably involves generating TLS certificates for your public-facing server. Check out the\xa0",(0,r.jsx)(n.a,{href:"4-5-ops-guide-command-line-tools",children:(0,r.jsx)(n.strong,{children:"simple install if you just want a local drand demo \u2192"})})]}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites-for-this-guide",children:(0,r.jsx)(n.strong,{children:"Prerequisites for this Guide"})}),"\n",(0,r.jsx)(n.p,{children:"a VPS with the following software setup:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"docker >= 17.12"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"docker-compose >= 1.18"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:"go >= 1.12"})}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"certbot"}),', a TLS-capable reverse-proxy, or any other way to get TLS certificates (see section "Setting up TLS")']}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"first-steps",children:(0,r.jsx)(n.strong,{children:"First Steps"})}),"\n",(0,r.jsxs)(n.p,{children:["Copy/send this folder on your server, then open a shell in it. You may place this directory where you want, e.g.\xa0",(0,r.jsx)(n.code,{children:"~/deploy-example"}),". Its name is irrelevant too, should you want to change it (just don't call it\xa0",(0,r.jsx)(n.code,{children:"~/.drand"}),"\xa0which is used for the config files)."]}),"\n",(0,r.jsx)(n.p,{children:"At this point, your current working directory should look like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"$ pwd\n/home/drand/deploy-example\n------------------------------------------------------------\n$ tree\n.\n\u251c\u2500\u2500 data\n\u2502 \u251c\u2500\u2500 tls_certificates\n\u2502 \u2514\u2500\u2500 tls_keypair\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 README.md\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Also make sure\xa0",(0,r.jsx)(n.code,{children:"data"}),"\xa0is owned by your user, and have rights\xa0",(0,r.jsx)(n.code,{children:"740"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"chmod -R 740 data\n"})}),"\n",(0,r.jsx)(n.h2,{id:"setting-up-tls",children:(0,r.jsx)(n.strong,{children:"Setting up TLS"})}),"\n",(0,r.jsx)(n.p,{children:"To be secure, drand needs authenticated channels to talk to other drand nodes. This can be currently done in two ways:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"via the TLS module within drand; in that case, you need to give TLS certificates to drand itself."}),"\n",(0,r.jsx)(n.li,{children:"via a reverse-proxy in front of drand; in that case, drand itself is unaware of TLS, and your reverse proxy is handling TLS itself."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"first-option-use-tls-within-drand",children:(0,r.jsx)(n.strong,{children:"First option: use TLS within drand"})}),"\n",(0,r.jsxs)(n.p,{children:["One way to get a TLS certificate is through ",(0,r.jsx)(n.a,{href:"https://certbot.eff.org/lets-encrypt/debianjessie-other",children:"LetsEncrypt"})," and their command-line tool\xa0",(0,r.jsx)(n.code,{children:"certbot"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Use\xa0",(0,r.jsx)(n.code,{children:"certbox"}),"\xa0to generate TLS certificates. The command will depend on your setup, but typically can be\xa0",(0,r.jsx)(n.code,{children:"sudo certbot certonly --standalone"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Once done,\xa0",(0,r.jsx)(n.code,{children:"certbot"}),"\xa0put the files in\xa0",(0,r.jsx)(n.code,{children:"/etc/letsencrypt/live"}),". We are interested in\xa0",(0,r.jsx)(n.code,{children:"/etc/letsencrypt/live/YOURSERVER/certX.pem"}),"\xa0and\xa0",(0,r.jsx)(n.code,{children:"/etc/letsencrypt/live/YOURSERVER/privkeyX.pem"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Copy those two files into\xa0",(0,r.jsx)(n.code,{children:"data/tls_keypair"}),", renaming them as\xa0",(0,r.jsx)(n.code,{children:"cert.pem"}),"\xa0and\xa0",(0,r.jsx)(n.code,{children:"privkey.pem"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"cp /etc/letsencrypt/live/YOURSERVER/certX.pem data/cert.pem\ncp /etc/letsencrypt/live/YOURSERVER/privX.pem data/priv.pem\n"})}),"\n",(0,r.jsx)(n.p,{children:"The TLS setup is done."}),"\n",(0,r.jsx)(n.h3,{id:"second-option-disable-tls-in-drand",children:(0,r.jsx)(n.strong,{children:"Second option: disable TLS in drand"})}),"\n",(0,r.jsxs)(n.p,{children:["Note:\xa0",(0,r.jsx)(n.strong,{children:"only"}),"\xa0do this if you intend to setup TLS with your reverse proxy. If you don't use TLS at all, there's no point in doing this setup, it won't be secure ! If you're just trying to run an insecure demo, run\xa0",(0,r.jsx)(n.code,{children:"make demo"}),"\xa0in the root folder of this repository instead of following this guide."]}),"\n",(0,r.jsxs)(n.p,{children:["In this case, replace the following line in the\xa0",(0,r.jsx)(n.code,{children:"docker-compose.yml"}),"\xa0file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:' command: --verbose 2 start --private-listen 0.0.0.0:8080 --cert-dir "/data/drand/.drand/tls_certificates" --tls-cert "/data/drand/.drand/tls_keypair/cert.pem" --tls-key "/data/drand/.drand/tls_keypair/key.pem"\n'})}),"\n",(0,r.jsx)(n.p,{children:"by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:" command: --verbose 2 -tls-disable start --private-listen 0.0.0.0:8080\n"})}),"\n",(0,r.jsx)(n.p,{children:"This guide will continue focusing on drand; jump to the end of this guide to configure the reverse proxy."}),"\n",(0,r.jsx)(n.h2,{id:"public-http-api",children:(0,r.jsx)(n.strong,{children:"Public HTTP API"})}),"\n",(0,r.jsxs)(n.p,{children:["The compose file also opens a public http API to be consumed by the clients. This public endpoint is exposed on the 8081 port (specified with\xa0",(0,r.jsx)(n.code,{children:"--public-listen"}),"]). If you wish to not expose the public http endpoint, you need to change the docker file to remove references to public port."]}),"\n",(0,r.jsx)(n.h2,{id:"generate-drand-keys",children:(0,r.jsx)(n.strong,{children:"Generate drand Keys"})}),"\n",(0,r.jsx)(n.p,{children:"Now, let's generate keys for drand:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"go get -u github.com/drand/drand\ndrand generate-keypair
\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Where\xa0",(0,r.jsx)(n.code,{children:"
"}),"\xa0is for instance\xa0",(0,r.jsx)(n.code,{children:"drand.yourserver.com:8080"}),"\xa0or\xa0",(0,r.jsx)(n.code,{children:"yourserver.com:8080"}),". If you'll be using a reverse-proxy, make sure you enter the public-facing port."]}),"\n",(0,r.jsxs)(n.p,{children:["This generates keys in\xa0",(0,r.jsx)(n.code,{children:"~/.drand/keys/"}),". Let's move them into\xa0",(0,r.jsx)(n.code,{children:"data"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"mv ~/.drand/key data\n"})}),"\n",(0,r.jsx)(n.h2,{id:"docker-compose-setup",children:(0,r.jsx)(n.strong,{children:"Docker-compose Setup"})}),"\n",(0,r.jsx)(n.p,{children:"Drand can now be started as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose up -d\n"})}),"\n",(0,r.jsx)(n.p,{children:"To check what is happening, access the docker-compose logs via"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose logs\n"})}),"\n",(0,r.jsx)(n.h2,{id:"distributed-key-generation-dkg",children:(0,r.jsx)(n.strong,{children:"Distributed Key Generation (DKG)"})}),"\n",(0,r.jsx)(n.p,{children:"If you did the setup above, you have a container running the drand deamon, loaded with your keys. It still misses two things:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["the\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0file corresponding to other participants. For this, you have to exchange keys manually, e.g., via email."]}),"\n",(0,r.jsx)(n.li,{children:"running the DKG protocol to bootstrap drand."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Fortunately, with our docker-compose volumes, it's now very easy to add things into the running container. Just add your\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0into the root of the\xa0",(0,r.jsx)(n.code,{children:"data"}),"\xa0folder (",(0,r.jsx)(n.strong,{children:"NOT"}),"\xa0in the\xa0",(0,r.jsx)(n.code,{children:"data/groups/"}),"\xa0folder; this one is manually managed by drand, don't touch it)."]}),"\n",(0,r.jsx)(n.p,{children:"Then, open a CLI into your running docker."}),"\n",(0,r.jsx)(n.p,{children:"First find its id on the host:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:'$ docker ps\n697e4766f8b2 drand_drand "drand --verbose 2 s\u2026" 11 minutes ago Up 9 minutes\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The id of the container is\xa0",(0,r.jsx)(n.code,{children:"697e4766f8b2"}),". Enter it by running:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker exec -it 697e4766f8b2 /bin/sh\n"})}),"\n",(0,r.jsx)(n.p,{children:"Then, you're inside the container; tell drand to run the DKG like so:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand share --connect --nodes --threshold \n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Notice the full path"}),"\xa0",(0,r.jsx)(n.code,{children:"/data/drand/.drand/group.toml"}),"\xa0and not\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0nor\xa0",(0,r.jsx)(n.code,{children:"./group.toml"})]}),"\n",(0,r.jsxs)(n.p,{children:["At this point, once\xa0",(0,r.jsx)(n.em,{children:"everybody"}),"\xa0in the group.toml has run the same command (at the same time), the randomness generation starts. Well done! Simply let it run, there's nothing else to do."]}),"\n",(0,r.jsx)(n.h2,{id:"other-topics",children:(0,r.jsx)(n.strong,{children:"Other Topics"})}),"\n",(0,r.jsx)(n.h3,{id:"updating-drand",children:(0,r.jsx)(n.strong,{children:"Updating drand"})}),"\n",(0,r.jsx)(n.p,{children:"To update drand, simply shut it the container"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose down\n"})}),"\n",(0,r.jsxs)(n.p,{children:["and to fully rebuild it, you need to first clean the already-used layers (for some reason Docker is confused and thinks nothing has changed, and it keeps rebuilding the old version). Caution! this delete\xa0",(0,r.jsx)(n.em,{children:"all"}),"\xa0your\xa0",(0,r.jsx)(n.em,{children:"unused"}),"\xa0containers and networks; it's typically fine, but just be aware of it."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker system prune -a\n"})}),"\n",(0,r.jsx)(n.p,{children:"Then rebuild and restart it"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose up --build -d\n"})}),"\n",(0,r.jsx)(n.h3,{id:"reset-the-docker-state-without-losing-the-keys",children:(0,r.jsx)(n.strong,{children:"Reset the Docker State (without losing the Keys)"})}),"\n",(0,r.jsx)(n.p,{children:"This part is if you need to reset drand's internal state without loosing the keys."}),"\n",(0,r.jsx)(n.h3,{id:"method-1-usingdrand-clean",children:(0,r.jsxs)(n.strong,{children:["Method 1: using\xa0",(0,r.jsx)(n.code,{children:"drand clean"})]})}),"\n",(0,r.jsx)(n.p,{children:"First, try using this method. If that doesn't work, use the method below."}),"\n",(0,r.jsx)(n.p,{children:"Find drand's container id on the host, and enter it:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:'$ docker ps\n697e4766f8b2 drand_drand "drand --verbose 2 s\u2026" 11 minutes ago Up 9 minutes\n\n$ docker exec -it 697e4766f8b2 /bin/sh\n'})}),"\n",(0,r.jsx)(n.p,{children:"Then simply call:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand reset\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Exit the container with\xa0",(0,r.jsx)(n.code,{children:"CTRL-C"}),". Then, on the host, I advise you to restart the container (to make sure the drand deamon has a clean restart and can reload its cleaned config):"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose down\ndocker-compose up --build -d\n"})}),"\n",(0,r.jsx)(n.h3,{id:"method-2-performing-a-manual-reset",children:(0,r.jsx)(n.strong,{children:"Method 2: performing a Manual Reset"})}),"\n",(0,r.jsxs)(n.p,{children:["The method above relies on\xa0",(0,r.jsx)(n.code,{children:"drand clean"}),", which could theoretically fail. If you want a manual hard-reset, start by killing the container:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose down\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Delete what you want to reset in\xa0",(0,r.jsx)(n.code,{children:"data"}),": typically, you absolutely want to\xa0",(0,r.jsx)(n.strong,{children:"keep"}),"\xa0",(0,r.jsx)(n.code,{children:"data/keys"}),",\xa0",(0,r.jsx)(n.strong,{children:"especially"}),"\xa0if you shared those keys to create a\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0with other people. For instance if the DKG failed, remove\xa0",(0,r.jsx)(n.code,{children:"data/db"}),"\xa0and\xa0",(0,r.jsx)(n.code,{children:"data/groups"}),". Notice that if you added the\xa0",(0,r.jsx)(n.code,{children:"group.toml"}),"\xa0into the root of\xa0",(0,r.jsx)(n.code,{children:"data"}),"\xa0as suggested, it should still be there (don't delete it unless you want to change the group)."]}),"\n",(0,r.jsx)(n.p,{children:"Then, rebuild the image from scratch:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker system prune -a\ndocker-compose up --build -d\n"})}),"\n",(0,r.jsx)(n.p,{children:"Check that things are running with"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker-compose logs\n"})}),"\n",(0,r.jsx)(n.p,{children:'You\'re now back to the step "Distributed Key Generation" of this guide.'}),"\n",(0,r.jsx)(n.h3,{id:"docker-behind-reverse-proxy-setup",children:(0,r.jsx)(n.strong,{children:"Docker behind Reverse Proxy Setup"})}),"\n",(0,r.jsx)(n.p,{children:"Typically, the TLS part of my VPS is managed by a single reverse proxy, which then proxies multiple services running locally with docker."}),"\n",(0,r.jsxs)(n.p,{children:["There is one subtletly: you need to forward\xa0",(0,r.jsx)(n.em,{children:"both"}),'\xa0GRPC (used by drand "core") and web traffic (for the web interface). To forward GRPC, you need to have nginx\xa0',(0,r.jsx)(n.code,{children:"1.13.10"}),"\xa0or above, it's a fairly recent addition."]}),"\n",(0,r.jsxs)(n.p,{children:["Then, you need to forward differently traffic to private API port and the HTTP public API port. Here's an example configuration for\xa0",(0,r.jsx)(n.code,{children:"nginx"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"server {\n server_name drand.lbarman.ch;\n listen 443 ssl http2;\n ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n // default --private-listen port specified in the docker compose\n grpc_pass grpc://localhost:1234;\n grpc_set_header X-Real-IP $remote_addr;\n }\n\n location /info {\n // default --public-listen flag specified in the docker compose\n proxy_pass http://localhost:8081;\n proxy_set_header Host $host;\n }\n\n location /public/ {\n // default --public-listen flag specified in the docker compose\n proxy_pass http://localhost:8081;\n proxy_set_header Host $host;\n }\n\n ssl_certificate /etc/letsencrypt/live/.../fullchain.pem; # managed by Certbot\n ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem; # managed by Certbot\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You can separate the entries in two in nginx by having two\xa0",(0,r.jsx)(n.code,{children:"server"}),"\xa0blocks to apply different configurations."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Note:"}),"\xa0to others, you'll still be using TLS (handled by your reverse proxy), so make sure you generate your drand-keys using an https address, and the flag\xa0",(0,r.jsx)(n.code,{children:"TLS=true"}),"."]}),"\n",(0,r.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},d=r.createContext(t);function o(e){const n=r.useContext(d);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/56aab574.730cb5ff.js b/site/assets/js/56aab574.730cb5ff.js new file mode 100644 index 00000000..c9dd54ab --- /dev/null +++ b/site/assets/js/56aab574.730cb5ff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4342],{8818:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var i=t(4848),r=t(8453);const s={id:"2-4-concepts-timelock-encryption",title:"2.4 Timelock Encryption",description:"Describes timelock encryption and how it works."},o="2.4 Concepts: Timelock Encryption",c={id:"concepts/2-4-concepts-timelock-encryption",title:"2.4 Timelock Encryption",description:"Describes timelock encryption and how it works.",source:"@site/docs/02_concepts/02-04-Concepts_Timelock_Encryption.md",sourceDirName:"02_concepts",slug:"/concepts/2-4-concepts-timelock-encryption",permalink:"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/02_concepts/02-04-Concepts_Timelock_Encryption.md",tags:[],version:"current",frontMatter:{id:"2-4-concepts-timelock-encryption",title:"2.4 Timelock Encryption",description:"Describes timelock encryption and how it works."},sidebar:"docsSidebar",previous:{title:"2.3 Specification",permalink:"/drand-docs/docs/concepts/2-3-concepts-specification"},next:{title:"3.0 DEVELOPERS GUIDE",permalink:"/drand-docs/docs/category/30-developers-guide"}},l={},a=[{value:"\ud83e\udd14 What is Timelock Encryption?",id:"-what-is-timelock-encryption",level:2},{value:"How drand enables Timelock Encryption",id:"how-drand-enables-timelock-encryption",level:2},{value:"\ud83c\udf93 Learn more about Timelock Encryption",id:"-learn-more-about-timelock-encryption",level:2},{value:"\ud83d\udee1\ufe0f Security Assumptions",id:"\ufe0f-security-assumptions",level:2},{value:"\ud83d\udccb Use Cases",id:"-use-cases",level:2},{value:"\ud83e\uddee The Math behind Timelock Encryption",id:"-the-math-behind-timelock-encryption",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"24-concepts-timelock-encryption",children:"2.4 Concepts: Timelock Encryption"})}),"\n",(0,i.jsxs)(n.h2,{id:"-what-is-timelock-encryption",children:["\ud83e\udd14 ",(0,i.jsx)(n.strong,{children:"What is Timelock Encryption?"})]}),"\n",(0,i.jsx)(n.p,{children:"Timelock encryption allows you to encrypt information now that can only be decrypted at a future time. Traditional methods have used either trusted third parties to store keys or proof of work, requiring users to perform computations to decrypt the information. Proof of work has become ineffective due to advancements in hardware and computational science, and it also wastes a lot of energy. Using a trusted third party avoids these issues but relies on trusting that party and hoping they aren't breached."}),"\n",(0,i.jsx)(n.h2,{id:"how-drand-enables-timelock-encryption",children:(0,i.jsx)(n.strong,{children:"How drand enables Timelock Encryption"})}),"\n",(0,i.jsx)(n.p,{children:"With the launch of our unchained scheme, drand supports a new paradigm for timelock encryption. drand acts as a reference clock: each drand round is mapped to a specific time, and network nodes share their signature over that round number once the time is reached. These signatures form a full randomness beacon, attesting that the network believes the clock time has been reached."}),"\n",(0,i.jsx)(n.p,{children:"Our timelock scheme uses identity-based encryption to allow users to create ciphertexts using a future round's random value as the private key. The drand network won't release that randomness until the specified time, providing accurate timelock encryption without wasting energy or relying on a single third party. Users can decrypt their timelock ciphertext offline without needing a third party."}),"\n",(0,i.jsxs)(n.h2,{id:"-learn-more-about-timelock-encryption",children:["\ud83c\udf93 ",(0,i.jsx)(n.strong,{children:"Learn more about Timelock Encryption"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.notion.so/Timelock-Encryption-is-now-supported-on-drand-mainnet-327425b1e16d4c22aa0d785dbf1c5fbb?pvs=21",children:"Our blog post announcing the new network and timelock encryption"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.youtube.com/watch?v=Xh849Ij3lhU",children:(0,i.jsx)(n.strong,{children:"Yolan's talk at Real World Crypto on timelock encryption"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://eprint.iacr.org/2023/189",children:"The Timelock Paper on ePrint"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.notion.so/fastnet-to-be-sunset-long-live-quicknet-5d125025752146b5bc307c834435d49e?pvs=21",children:"Our post about deprecating fastnet in favor of quicknet"})}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"\ufe0f-security-assumptions",children:["\ud83d\udee1\ufe0f ",(0,i.jsx)(n.strong,{children:"Security Assumptions"})]}),"\n",(0,i.jsx)(n.p,{children:"While our timelock scheme has been assessed by Kudelski Security, it's essential to understand its limitations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Malicious Nodes"}),": If a threshold number of malicious nodes join the network, they could generate all future random values and decrypt future timelock ciphertexts. Our quicknet network started with 18 organizations running 22 nodes, minimizing this risk."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Quantum Resistance"}),": Our cryptography does not use quantum-resistant algorithms. If you encrypt something for 1000 years and a viable quantum computer emerges, it could decrypt it. Currently, no widespread quantum-resistant schemes exist for threshold identity-based encryption (IBE) cryptography."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Network Shutdown"}),": If the ",(0,i.jsx)(n.a,{href:"https://leagueofentropy.org",children:"League of Entropy"})," shuts down, members would delete their keys. This means ciphertexts created after the network's cessation would be un-decryptable until quantum computers can break them."]}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"-use-cases",children:["\ud83d\udccb ",(0,i.jsx)(n.strong,{children:"Use Cases"})]}),"\n",(0,i.jsx)(n.p,{children:"Timelock encryption has various applications, including:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Responsible vulnerability disclosures"}),"\n",(0,i.jsx)(n.li,{children:"Transfer of assets/passwords upon death"}),"\n",(0,i.jsx)(n.li,{children:"Sealed-bid auctions"}),"\n",(0,i.jsx)(n.li,{children:"Maximal extractable value (MEV) prevention"}),"\n",(0,i.jsx)(n.li,{children:"Public, turn-based games"}),"\n",(0,i.jsx)(n.li,{children:"Voting"}),"\n",(0,i.jsx)(n.li,{children:"Quizzes"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Join our ",(0,i.jsx)(n.a,{href:"https://drandworkspace.slack.com",children:"Slack"})," and post your ideas in the #drand-use-cases channel for discussion!"]}),"\n",(0,i.jsxs)(n.h2,{id:"-the-math-behind-timelock-encryption",children:["\ud83e\uddee ",(0,i.jsx)(n.strong,{children:"The Math behind Timelock Encryption"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Encryption"}),": A client encrypts a message to be decrypted at a specific epoch by:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Computing the "round public key.\u201d'}),"\n",(0,i.jsx)(n.li,{children:'Choosing a random "mask."'}),"\n",(0,i.jsx)(n.li,{children:"Setting the ephemeral secret key."}),"\n",(0,i.jsx)(n.li,{children:"Outputting the ciphertext with the ephemeral public key, mask commitment, and one-time pad."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Decryption"}),": A client decrypts a ciphertext using the epoch signature by:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Computing the necessary values."}),"\n",(0,i.jsx)(n.li,{children:"Verifying the ciphertext."}),"\n",(0,i.jsx)(n.li,{children:"Extracting the plaintext."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Libraries for Timelock Encryption"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/drand/tlock",children:(0,i.jsx)(n.strong,{children:"tlock"})}),": A Go CLI and library.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"tlock is a go CLI and library developed and maintained by the drand team for performing timelock encryption and decryption."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/drand/tlock-js",children:(0,i.jsx)(n.strong,{children:"tlock-js"})}),": A JavaScript library written in Typescript.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"tlock-js is a JavaScript library developed and maintained by the drand team for performing timelock encryption and decryption written in Typescript."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/thibmeu/drand-rs",children:(0,i.jsx)(n.strong,{children:"dee"})}),": A Rust CLI by Thibault Meunier from ",(0,i.jsx)(n.a,{href:"https://leagueofentropy.org/cloudflare/",children:"Cloudflare"}),".","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["dee is a rust CLI developed and maintained by Thibault Meunier from ",(0,i.jsx)(n.a,{href:"https://leagueofentropy.org/cloudflare",children:"Cloudflare"}),". It can perform timelock encryption and decryption, as well as retrieve beacons from any of the drand networks."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://timevault.drand.love/",children:(0,i.jsx)(n.strong,{children:"timevault"})}),": A web app for timelock encryption and decryption.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"timevault is a web app for timelock encrypting and decrypting vulnerability reports for responsible disclosure as well as arbitrary text. It is developed and maintained by the drand team."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"tlock-fvm"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Timelock encryption and decryption will be available on the\xa0",(0,i.jsx)(n.a,{href:"https://fvm.bilecoin.io/",children:(0,i.jsx)(n.strong,{children:"Filecoin Virtual Machine"})}),"\xa0in the second half of 2023. Stay tuned to our blog for updates!"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var i=t(6540);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/59362658.4f0764d1.js b/site/assets/js/59362658.4f0764d1.js new file mode 100644 index 00000000..95adae9d --- /dev/null +++ b/site/assets/js/59362658.4f0764d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9325],{1180:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>c,toc:()=>i});var s=o(4848),n=o(8453);const r={slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},a=void 0,c={permalink:"/drand-docs/blog/mdx-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-01-mdx-blog-post.mdx",source:"@site/blog/2021-08-01-mdx-blog-post.mdx",title:"MDX Blog Post",description:"Blog posts support Docusaurus Markdown features, such as MDX.",date:"2021-08-01T00:00:00.000Z",tags:[{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.235,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"}],frontMatter:{slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},unlisted:!1,prevItem:{title:"Welcome",permalink:"/drand-docs/blog/welcome"},nextItem:{title:"Long Blog Post",permalink:"/drand-docs/blog/long-blog-post"}},l={authorsImageUrls:[void 0]},i=[];function u(t){const e={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,n.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(e.p,{children:["Blog posts support ",(0,s.jsx)(e.a,{href:"https://docusaurus.io/docs/markdown-features",children:"Docusaurus Markdown features"}),", such as ",(0,s.jsx)(e.a,{href:"https://mdxjs.com/",children:"MDX"}),"."]}),"\n",(0,s.jsx)(e.admonition,{type:"tip",children:(0,s.jsx)(e.p,{children:"Use the power of React to create interactive blog posts."})}),"\n","\n",(0,s.jsx)(e.p,{children:"For example, use JSX to create an interactive button:"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-js",children:"\n"})}),"\n",(0,s.jsx)("button",{onClick:()=>alert("button clicked!"),children:"Click me!"})]})}function d(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>c});var s=o(6540);const n={},r=s.createContext(n);function a(t){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function c(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:a(t.components),s.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/5e95c892.0d8a2771.js b/site/assets/js/5e95c892.0d8a2771.js new file mode 100644 index 00000000..ff871f84 --- /dev/null +++ b/site/assets/js/5e95c892.0d8a2771.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9647],{7121:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(6540);var d=r(4164),a=r(1213),c=r(7559),n=r(2831),u=r(781),t=r(4848);function l(e){return(0,t.jsx)(a.e3,{className:(0,d.A)(c.G.wrapper.docsPages),children:(0,t.jsx)(u.A,{children:(0,n.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/site/assets/js/621db11d.f90eb02b.js b/site/assets/js/621db11d.f90eb02b.js new file mode 100644 index 00000000..9bfdccf0 --- /dev/null +++ b/site/assets/js/621db11d.f90eb02b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4212],{3250:(t,e,s)=>{s.r(e),s.d(e,{default:()=>m});s(6540);var a=s(4164),o=s(1213),r=s(7559),n=s(6461),l=s(8027),u=s(1463),i=s(1107),h=s(6913);const c={authorListItem:"authorListItem_n3yI"};var g=s(4848);function d(t){let{author:e}=t;return(0,g.jsx)("li",{className:c.authorListItem,children:(0,g.jsx)(h.A,{as:"h2",author:e,count:e.count})})}function p(t){let{authors:e}=t;return(0,g.jsx)("section",{className:(0,a.A)("margin-vert--lg",c.authorsListSection),children:(0,g.jsx)("ul",{children:e.map((t=>(0,g.jsx)(d,{author:t},t.key)))})})}function m(t){let{authors:e,sidebar:s}=t;const h=(0,n.uz)();return(0,g.jsxs)(o.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogAuthorsListPage),children:[(0,g.jsx)(o.be,{title:h}),(0,g.jsx)(u.A,{tag:"blog_authors_list"}),(0,g.jsxs)(l.A,{sidebar:s,children:[(0,g.jsx)(i.A,{as:"h1",children:h}),(0,g.jsx)(p,{authors:e})]})]})}},6461:(t,e,s)=>{s.d(e,{ZD:()=>l,np:()=>h,uz:()=>i,wI:()=>u});s(6540);var a=s(1312),o=s(5846),r=s(4848);function n(){const{selectMessage:t}=(0,o.W)();return e=>t(e,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:e}))}function l(t){const e=n();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:e(t.count),tagName:t.label})}function u(t){const e=n();return(0,a.T)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:e(t.count),authorName:t.name||t.key})}const i=()=>(0,a.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function h(){return(0,r.jsx)(a.A,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}}}]); \ No newline at end of file diff --git a/site/assets/js/6412f335.a106b4db.js b/site/assets/js/6412f335.a106b4db.js new file mode 100644 index 00000000..90ddee7b --- /dev/null +++ b/site/assets/js/6412f335.a106b4db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4205],{8169:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var t=o(4848),d=o(8453);const r={id:"4-5-ops-guide-command-line-tools",title:"4.5 Command-line Tools",description:"Installing and operating drand from the command line."},a="4.5 DevOps: Command-line Tools",s={id:"ops-guide/4-5-ops-guide-command-line-tools",title:"4.5 Command-line Tools",description:"Installing and operating drand from the command line.",source:"@site/docs/04_ops-guide/04-05-DevOps_Command-line_Tools.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-5-ops-guide-command-line-tools",permalink:"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-05-DevOps_Command-line_Tools.md",tags:[],version:"current",frontMatter:{id:"4-5-ops-guide-command-line-tools",title:"4.5 Command-line Tools",description:"Installing and operating drand from the command line."},sidebar:"docsSidebar",previous:{title:"4.4 Metrics Guide",permalink:"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide"},next:{title:"5.0 DRAND COMMUNITY",permalink:"/drand-docs/docs/category/50-drand-community"}},i={},l=[{value:"Installing drand",id:"installing-drand",level:2},{value:"Binary Releases",id:"binary-releases",level:3},{value:"Source Code",id:"source-code",level:3},{value:"Usage",id:"usage",level:2},{value:"drand generate-keypair",id:"drand-generate-keypair",level:3},{value:"drand start",id:"drand-start",level:3},{value:"Endpoint Configuration",id:"endpoint-configuration",level:3},{value:"drand stop",id:"drand-stop",level:3},{value:"drand load",id:"drand-load",level:3},{value:"drand dkg",id:"drand-dkg",level:3},{value:"drand dkg generate-proposal",id:"drand-dkg-generate-proposal",level:3},{value:"drand dkg init",id:"drand-dkg-init",level:3},{value:"drand dkg reshare",id:"drand-dkg-reshare",level:3},{value:"drand dkg join",id:"drand-dkg-join",level:3},{value:"drand dkg accept",id:"drand-dkg-accept",level:3},{value:"drand dkg reject",id:"drand-dkg-reject",level:3},{value:"drand dkg execute",id:"drand-dkg-execute",level:3},{value:"drand dkg abort",id:"drand-dkg-abort",level:3},{value:"drand dkg status",id:"drand-dkg-status",level:3},{value:"drand get",id:"drand-get",level:3},{value:"drand show",id:"drand-show",level:3},{value:"drand util",id:"drand-util",level:3},{value:"Supplemental Tools",id:"supplemental-tools",level:2},{value:"drand-client",id:"drand-client",level:3},{value:"drand-relay-http",id:"drand-relay-http",level:3},{value:"drand-relay-gossip",id:"drand-relay-gossip",level:3}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,d.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"45-devops-command-line-tools",children:"4.5 DevOps: Command-line Tools"})}),"\n",(0,t.jsxs)(n.p,{children:["Drand's main functionality is provided by the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0program, which allows you to run a drand server and control its operation. You can also use\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0as a client to fetch randomness from a drand network."]}),"\n",(0,t.jsx)(n.h2,{id:"installing-drand",children:(0,t.jsx)(n.strong,{children:"Installing drand"})}),"\n",(0,t.jsx)(n.h3,{id:"binary-releases",children:(0,t.jsx)(n.strong,{children:"Binary Releases"})}),"\n",(0,t.jsxs)(n.p,{children:["The simplest way to get\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0is to\xa0",(0,t.jsx)(n.a,{href:"https://github.com/drand/drand/releases",children:"download a pre-built binary release"}),"\xa0for your platform."]}),"\n",(0,t.jsxs)(n.p,{children:["You can verify the checksum of a\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0binary release by checking the\xa0",(0,t.jsx)(n.code,{children:"checksums.txt"}),"\xa0listed in the GitHub assets for the release, which contains the SHA-256 checksum for each release archive. To check your local download, you can use the\xa0",(0,t.jsx)(n.code,{children:"shasum"}),"\xa0command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"shasum -a 256 \n"})}),"\n",(0,t.jsx)(n.h3,{id:"source-code",children:(0,t.jsx)(n.strong,{children:"Source Code"})}),"\n",(0,t.jsxs)(n.p,{children:["You can compile\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0from source code by cloning the\xa0",(0,t.jsx)(n.a,{href:"https://github.com/drand/drand",children:"drand GitHub repository"}),"\xa0and building the project."]}),"\n",(0,t.jsxs)(n.p,{children:["This will require a working\xa0",(0,t.jsx)(n.a,{href:"https://golang.org/doc/install",children:"Go installation"}),", and your\xa0",(0,t.jsx)(n.a,{href:"https://golang.org/doc/code.html#GOPATH",children:"GOPATH"}),"\xa0must be set. You'll also need the\xa0",(0,t.jsx)(n.code,{children:"make"}),"\xa0command available."]}),"\n",(0,t.jsx)(n.p,{children:"With those requirements met, install drand via:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"git clone https://github.com/drand/drand\ncd drand\nmake install\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will install\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0into\xa0",(0,t.jsx)(n.code,{children:"$GOPATH/bin"}),", which should be on your\xa0",(0,t.jsx)(n.code,{children:"$PATH"}),"\xa0if you followed the standard Go install instructions."]}),"\n",(0,t.jsxs)(n.p,{children:["If you'd prefer not to install\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0globally, or if you want to put the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0binary in a different location, you can run\xa0",(0,t.jsx)(n.code,{children:"make build"}),"\xa0instead of\xa0",(0,t.jsx)(n.code,{children:"make install"}),". This will create the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0binary in the current directory."]}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:(0,t.jsx)(n.strong,{children:"Usage"})}),"\n",(0,t.jsxs)(n.p,{children:["This section gives a basic overview of the main\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0CLI interface to give an idea of the options available. If you're setting up a drand network deployment, please see the\xa0",(0,t.jsx)(n.a,{href:"4-1-ops-guide-deployment",children:"4.1 DevOps: Deployment"}),", which walks through using\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0to run a live network."]}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0command has several subcommands. Among the most important is\xa0",(0,t.jsx)(n.code,{children:"drand help"}),", which will introduce you to the rest of the subcommands:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"$ drand help\n\nNAME:\n drand - distributed randomness service\n\nUSAGE:\n drand [global options] command [command options] [arguments...]\n\nVERSION:\n 2.0.1\n\nCOMMANDS:\n dkg Commands for interacting with the DKG\n start Start the drand daemon.\n stop Stop the drand daemon.\n\n share The old command for running DKGs; this has been removed\n load Launch a sharing protocol from filesystem\n sync sync your local randomness chain with other nodes and validate your local beacon chain. To follow a remote node, it requires the use of the 'follow' flag.\n generate-keypair Generate the longterm keypair (drand.private, drand.public) for this node, and load it on the drand daemon if it is up and running.\n\n util Multiple commands of utility functions, such as reseting a state, checking the connection of a peer...\n show local information retrieval about the node's cryptographic material. Show prints the information about the collective public key, the group details (group.toml),the long-term public key (drand.public), respectively.\n\n help, h Shows a list of commands or help for one command\n\nGLOBAL OPTIONS:\n --verbose If set, verbosity is at the debug level (default: false) [$DRAND_VERBOSE]\n --folder value Folder to keep all drand cryptographic information, with absolute path. (default: \"/Users/1337user/.drand\") [$DRAND_FOLDER]\n --help, -h show help (default: false)\n --version, -v print the version (default: false)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"help"}),"\xa0command can be used for subcommands as well, for example\xa0",(0,t.jsx)(n.code,{children:"drand help generate-keypair"}),". If you prefer, you can also show help with the\xa0",(0,t.jsx)(n.code,{children:"--help"}),"\xa0flag after the subcommand name, e.g.:\xa0",(0,t.jsx)(n.code,{children:"drand generate-keypair --help"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"drand-generate-keypair",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand generate-keypair"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"generate-keypair"}),"\xa0command creates a long-term public/private keypair for a drand network. You must provide the address that your drand node will listen on, including the publicly reachable port number. This may be different from the port specified when starting the daemon, for example if you've set up\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0to run behind a reverse proxy as described in the\xa0",(0,t.jsx)(n.a,{href:"4-1-ops-guide-deployment",children:(0,t.jsx)(n.strong,{children:"Deployment Guide"})}),". These new keys will be loaded on drand daemon if the daemon is up and running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand help generate-keypair\n\nNAME:\n drand generate-keypair - Generate the longterm keypair (drand.private, drand.public) for this node, and load it on the drand daemon if it is up and running.\n\nUSAGE:\n drand generate-keypair [command options]
is the address other nodes will be able to contact this node on (specified as \'private-listen\' to the daemon)\n\nOPTIONS:\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --folder value Folder to keep all drand cryptographic information, with absolute path. (default: "/Users/1337user/.drand") [$DRAND_FOLDER]\n --id value Indicates the id for the randomness generation process which will be started [$DRAND_ID]\n --scheme value Indicates a set of values drand will use to configure the randomness generation process (default: "pedersen-bls-chained") [$DRAND_SCHEME]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The generated key and all other drand state will be stored in\xa0",(0,t.jsx)(n.code,{children:"$HOME/.drand"}),"\xa0by default, but this can be overridden with the\xa0",(0,t.jsx)(n.code,{children:"--folder"}),"\xa0flag."]}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"--id"}),"\xa0flag should be used when generating long-term public/private keypair for networks with beacon id different from default. If you don't provide a value, the default beacon id will be used. For example, a network with beacon id\xa0",(0,t.jsx)(n.code,{children:"beacon_name_x"}),", you must set the flag\xa0",(0,t.jsx)(n.code,{children:"--id beacon_name_x"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["If you use a non-standard control port, you will also need to use the\xa0",(0,t.jsx)(n.code,{children:"--control"}),"\xa0flag when running this command."]}),"\n",(0,t.jsx)(n.h3,{id:"drand-start",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand start"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"start"}),"\xa0command starts the drand daemon. Note that\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0does not automatically go into the background when launched, and long-running deployments should be run inside of a\xa0",(0,t.jsx)(n.code,{children:"screen"}),"\xa0or\xa0",(0,t.jsx)(n.code,{children:"tmux"}),'\xa0session, or otherwise "daemonized" using the tools available for your operating system.']}),"\n",(0,t.jsx)(n.p,{children:"If this node has already joined a network by performing a Distributed Key Generation phase, it will attempt to catch up with the drand beacon chain by contacting other nodes and will participate in the randomness generation protocol once it has caught up."}),"\n",(0,t.jsxs)(n.p,{children:["If the DKG has not yet been performed, the daemon will wait for an operator to begin the DKG phase using the\xa0",(0,t.jsx)(n.a,{href:"4-5-ops-guide-command-line-tools#drand-dkg-init",children:(0,t.jsx)(n.code,{children:"drand dkg init"})}),"\xa0command."]}),"\n",(0,t.jsx)(n.p,{children:"It contains a lot of flags for metrics, OpenTelemetry configuration, json log formatting, and configuring which database engine to user."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand help start\n\nNAME:\n drand start - Start the drand daemon.\n\nUSAGE:\n drand start [command options] [arguments...]\n\nOPTIONS:\n --folder value Folder to keep all drand cryptographic information, with absolute path. (default: "/Users/1337user/.drand") [$DRAND_FOLDER]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --private-listen value Set the listening (binding) address of the private API. Useful if you have some kind of proxy. [$DRAND_PRIVATE_LISTEN]\n --public-listen value Set the listening (binding) address of the public API. Useful if you have some kind of proxy. [$DRAND_PUBLIC_LISTEN]\n --metrics value Launch a metrics server at the specified (host:)port. [$DRAND_METRICS]\n --traces value Publish metrics to the specific OpenTelemetry compatible host:port server. E.g. 127.0.0.1:4317 [$DRAND_TRACES]\n --traces-probability value The probability for a certain trace to end up being collected.Between 0.0 and 1.0 values, that corresponds to 0% and 100%.Be careful as a high probability ratio can produce a lot of data. (default: 0.05) [$DRAND_TRACES_PROBABILITY]\n --push Push mode forces the daemon to start making beacon requests to the other node, instead of waiting the other nodes contact it to catch-up on the round (default: false) [$DRAND_PUSH]\n --verbose If set, verbosity is at the debug level (default: false) [$DRAND_VERBOSE]\n --from value Old group.toml path to specify when a new node wishes to participate in a resharing protocol. This flag is optional in case a node is alreadyincluded in the current DKG. [$DRAND_FROM]\n --skipValidation skips bls verification of beacon rounds for faster catchup. (default: false) [$DRAND_SKIP_VALIDATION]\n --json Set the output as json format (default: false) [$DRAND_JSON]\n --id value Indicates the id for the randomness generation process which will be started [$DRAND_ID]\n --db value Which database engine to use. Supported values: bolt, postgres, or memdb. (default: "bolt") [$DRAND_DB]\n --pg-dsn value PostgreSQL DSN configuration.\n Supported options are:\n - sslmode: if the SSL connection is disabled or required. Default disabled. See: https://www.postgresql.org/docs/15/libpq-ssl.html#LIBPQ-SSL-PROTECTION\n - connect_timeout: how many seconds before the connection attempt times out. Default 5 (seconds). See: https://www.postgresql.org/docs/15/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT\n - max-idle: number of maximum idle connections. Default: 2\n - max-open: number of maximum open connections. Default: 0 - unlimited.\n (default: "postgres://drand:drand@127.0.0.1:5432/drand?sslmode=disable&connect_timeout=5") [$DRAND_PG_DSN]\n --memdb-size value The buffer size for in-memory storage. Must be at least 10. Recommended, 2000 or more (default: 2000) [$DRAND_MEMDB_SIZE]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"endpoint-configuration",children:(0,t.jsx)(n.strong,{children:"Endpoint Configuration"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"drand"}),"\xa0exposes up to four endpoints, depending on the flags passed in."]}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.strong,{children:"private drand API endpoint"}),"\xa0is used to communicate with other nodes using gRPC. The private API is always enabled. As drand can now support multiple beacons, it will always need the private address to be set, in order to know where to listen. You can pass the\xa0",(0,t.jsx)(n.code,{children:"--private-listen"}),"\xa0flag and specify the\xa0",(0,t.jsx)(n.code,{children:"host:port"}),"\xa0to bind to. Note that the addresss associated with the keypair must be publicly accessible and mapped to the\xa0",(0,t.jsx)(n.code,{children:"--private-listen"}),"\xa0address, for example using a reverse proxy."]}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\u26a0\ufe0f ",(0,t.jsx)(n.strong,{children:"WARNING"}),": While the private API is primarily intended for inter-node communication, it may be exposed to the internet to allow clients to fetch randomness over gRPC using the\xa0",(0,t.jsx)(n.a,{href:"https://drand.love/operator/drand-cli/#drand-get",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand get"})})}),"\xa0command and/or\xa0",(0,t.jsx)(n.a,{href:"https://drand.love/operator/drand-cli/#drand-client",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand-client"})})}),". This will not allow access to any secret information, but we generally recommend restricting gRPC access using firewall rules to limit the potential for denial of service attacks."]})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.strong,{children:"control API endpoint"}),"\xa0is used by the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0command to control a running drand daemon using commands like\xa0",(0,t.jsx)(n.code,{children:"drand dkg init"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The control interface is always enabled and bound to the\xa0",(0,t.jsx)(n.code,{children:"localhost"}),"\xa0interface. The default port is\xa0",(0,t.jsx)(n.code,{children:"8888"}),", but this can be overridden with the\xa0",(0,t.jsx)(n.code,{children:"--control"}),"\xa0flag. If you use a non-standard control port, you will also need to use the\xa0",(0,t.jsx)(n.code,{children:"--control"}),"\xa0flag when running other commands such as\xa0",(0,t.jsx)(n.code,{children:"drand share"}),"."]}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\u26d4 ",(0,t.jsx)(n.strong,{children:"DANGER"}),": The control API exposes private information, therefore,\xa0",(0,t.jsx)(n.strong,{children:"the control port must not be exposed to the internet"}),"\xa0and should be used only from the local machine where the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon is running."]})}),"\n",(0,t.jsx)(n.p,{children:"The remaining endpoints are optional, and will only be enabled if the flags are given."}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.strong,{children:"public HTTP endpoint"}),"\xa0provides an API that clients can fetch randomness from. To enable it, pass in the\xa0",(0,t.jsx)(n.code,{children:"--public-listen"}),"\xa0flag and specify the\xa0",(0,t.jsx)(n.code,{children:"host:port"}),"\xa0that you want to listen on. This endpoint exposes no sensitive information and is safe to expose to the internet. Alternatively, you may keep this endpoint behind a firewall and expose randomness to the public with the help of a relay server such as\xa0",(0,t.jsx)(n.a,{href:"https://drand.love/operator/drand-cli/#drand-relay-http",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand-relay-http"})})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.strong,{children:"metrics endpoint"}),"\xa0provides an API for observing runtime metrics about the drand node. It can be enabled with the\xa0",(0,t.jsx)(n.code,{children:"--metrics "}),"\xa0flag. See\xa0",(0,t.jsx)(n.a,{href:"https://drand.love/operator/metrics/",children:(0,t.jsx)(n.strong,{children:"drand Metrics"})}),"\xa0for more details on accessing the metrics."]}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\u26d4 ",(0,t.jsx)(n.strong,{children:"DANGER"}),": The metrics API may expose sensitive information about the running\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon, and should not be exposed to the public internet."]})}),"\n",(0,t.jsxs)(n.p,{children:["Finally drand can produce traces compatible with OpenTelemetry specification. To turn on this feature, set the\xa0",(0,t.jsx)(n.code,{children:"DRAND_TRACES"}),"\xa0environment varible to the desired destination, e.g."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"export DRAND_TRACES=127.0.0.1:4317\nexport DRAND_TRACES_PROBABILITY=1 # This will sample all traces to the destination server\n"})}),"\n",(0,t.jsxs)(n.p,{children:["After that, in the same terminal, use any of the drand features, such as\xa0",(0,t.jsx)(n.code,{children:"make test-unit-memdb"}),", to start producing traces."]}),"\n",(0,t.jsxs)(n.p,{children:["To explore the trace details, launch a new browser tab/window at the\xa0",(0,t.jsx)(n.a,{href:"http://127.0.0.1:3000/explore?orgId=1",children:"Grafana instance"}),", which will allow you to explore in detail the inner workings of Drand."]}),"\n",(0,t.jsxs)(n.p,{children:["For more details on how to use Grafana, you can\xa0",(0,t.jsx)(n.a,{href:"https://grafana.com/docs/grafana/v9.4/explore/trace-integration/",children:"read the manual here"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"TLS configuration"})}),"\n",(0,t.jsxs)(n.p,{children:["TLS certificate configuration is no longer supported by drand as of v2. Instead, you should run drand behind a reverse proxy and perform TLS termination there, as described in the\xa0",(0,t.jsx)(n.a,{href:"4-1-ops-guide-deployment",children:"4.1 DevOps: Deployment"})," . By default, drand assumes that all connections between nodes will take place over TLS. To override this config and run an insecure network, you can build it with the following go compiler flag:\xa0",(0,t.jsx)(n.code,{children:"-tags=conn_insecure"}),"\xa0."]}),"\n",(0,t.jsxs)(n.p,{children:["For more on TLS setup, see the\xa0",(0,t.jsx)(n.a,{href:"4-1-ops-guide-deployment",children:"4.1 DevOps: Deployment"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"drand-stop",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand stop"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"stop"}),"\xa0command tells the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon to shut down. If no beacon id is set, it will stop the entire daemon. However, if you provide the\xa0",(0,t.jsx)(n.code,{children:"--id"}),"\xa0flag and a value, it will only stop that specific network."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand help stop\n\nNAME:\n drand stop - Stop the drand daemon.\n\nUSAGE:\n drand stop [command options] [arguments...]\n\nOPTIONS:\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\ud83d\udca1 ",(0,t.jsx)(n.strong,{children:"TIP"}),": If the daemon was started with a non-standard control port, you must use the\xa0",(0,t.jsx)(n.code,{children:"--control"}),"\xa0flag to specify the control port when running\xa0",(0,t.jsx)(n.code,{children:"drand stop"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"drand-load",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand load"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"load"}),"\xa0command tells the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon to load a network which has been previously stopped. You must set\xa0",(0,t.jsx)(n.code,{children:"--id"}),"\xa0flag to choose the correct network to load again."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"$ drand help load\n\nNAME:\n drand load - Load a stopped beacon from the filesystem\n\nUSAGE:\n drand load [command options] [arguments...]\n\nOPTIONS:\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default port 8888.\n --id value Indicates the id for the randomness generation process which will be started\n"})}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\ud83d\udca1 ",(0,t.jsx)(n.strong,{children:"TIP"}),": If the daemon was started with a non-standard control port, you must use the\xa0",(0,t.jsx)(n.code,{children:"--control"}),"\xa0flag to specify the control port when running\xa0",(0,t.jsx)(n.code,{children:"drand stop"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"dkg"}),"\xa0subcommand contains a range of commands related to the generation and resharing of the distributed key."]}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"init"}),"\xa0command must be used when setting up a new drand network before randomness generation can begin. The\xa0",(0,t.jsx)(n.code,{children:"reshare"}),'\xa0command must be used after the network is running to "re-share" the key material, which allows us to change the members of the drand network without interrupting the generation of randomness.']}),"\n",(0,t.jsxs)(n.p,{children:["For details about to running the initial DKG, see the\xa0",(0,t.jsx)(n.a,{href:"https://drand.love/operator/deploy/",children:(0,t.jsx)(n.strong,{children:"Deployment Guide"})}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"$ drand help dkg\n\nNAME:\n drand dkg - Commands for interacting with the DKG\n\nUSAGE:\n drand dkg command [command options] [arguments...]\n\nCOMMANDS:\n init\n reshare\n join\n execute\n accept\n reject\n abort\n status\n generate-proposal\n help, h Shows a list of commands or help for one command\n\nOPTIONS:\n --help, -h show help (default: false)\n"})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-generate-proposal",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg generate-proposal"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"generate-proposal"}),"\xa0command is a helper to automatically pull the public keys of various nodes and form them into a toml file for running DKGs. This allows users to inspect and verify the expected parties to the DKG."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"joiner"}),"s are parties who are not yet participating in the network - for the first foundation of the network, everybody is a joiner!\xa0",(0,t.jsx)(n.code,{children:"remainer"}),"s are parties who are currently participating in the network generating randomness who are intended to continue doing so in the next 'epoch'. They can signal acceptance or rejection of proposals to the other nodes for consideration.\xa0",(0,t.jsx)(n.code,{children:"leaver"}),"s are parties who are currently participating in the network generating randomness, but who are intended to leave before the next 'epoch'."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"$ ./drand dkg generate-proposal -h\n\nNAME:\n drand dkg generate-proposal\n\nUSAGE:\n drand dkg generate-proposal [command options] [arguments...]\n\nOPTIONS:\n --joiner value [ --joiner value ] the address of a joiner you wish to add to a DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'\n --remainer value [ --remainer value ] the address of a remainer you wish to add to a DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'\n --out value the location you wish to save the proposal file to\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: \"8888\") [$DRAND_CONTROL]\n --leaver value [ --leaver value ] the address of a leaver you wish to add to the DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'\n --help, -h show help (default: false)\n"})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-init",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg init"})})}),"\n",(0,t.jsxs)(n.p,{children:["The initial DKG is run to create a distributed key amongst a set of nodes for the first time. It takes a proposal file (created using the\xa0",(0,t.jsx)(n.a,{href:"./4-5-ops-guide-command-line-tools#drand-dkg-generate-proposal",children:(0,t.jsx)(n.code,{children:"drand dkg generate-proposal"})}),"\xa0command, or by hand for sadists), and key attributes of the new network such as period (how often it emits randomness), threshold (the number of shares required to create a valid signature), and the catchup period (how fast the network can create new beacons if it gets behind)."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg init -h\n\nNAME:\n drand dkg init\n\nUSAGE:\n drand dkg init [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to.[$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --scheme value Indicates a set of values drand will use to configure the randomness generation process (default: "pedersen-bls-chained") [$DRAND_SCHEME]\n --period value period to set when doing a setup [$DRAND_PERIOD]\n --threshold value threshold to use for the DKG (default: 0) [$DRAND_THRESHOLD]\n --catchup-period value Minimum period while in catchup. Set only by the leader of share / reshares (default: "0s") [$DRAND_CATCHUP_PERIOD]\n --proposal value Path to a toml file specifying the leavers, joiners and remainers for a network proposal [$DRAND_PROPOSAL_PATH]\n --timeout value The duration from now in which DKG participants should abort the DKG if it has not completed. (default: "24h")\n --source value The path to an external binary used to inject additional entropy into the DKG process\n --genesis-delay value The duration from now until the network should start creating randomness\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\ud83d\udca1 ",(0,t.jsx)(n.strong,{children:"TIP"}),": You can mix an external source of entropy into the key sharing protocol by using the\xa0",(0,t.jsx)(n.code,{children:"--source"}),"\xa0flag. The argument should be the path to an executable that must output random binary data when run. By default, external entropy sources are mixed with Golang's\xa0",(0,t.jsx)(n.code,{children:"crypto/rand"}),"\xa0secure RNG. The\xa0",(0,t.jsx)(n.code,{children:"--user-source-only"}),'\xa0flag overrides this default, which is useful during testing and debugging to allow a reproducible "random" value, but should not be used in production.']})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-reshare",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg reshare"})})}),"\n",(0,t.jsxs)(n.p,{children:["The resharing process is used for adding or removing nodes to a currently running network. The same private key generating during the initial distributed key generation is resharing between the proposed nodes such that they all receive a small share. Resharing can happen as often as necessary, and does not allow a single party to gain any more information about the private key by retaining their own shares between epochs. It operates similar to the\xa0",(0,t.jsx)(n.code,{children:"drand dkg init"}),"\xa0command, though some parameters are no longer changeable between epochs (e.g. the period)."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg reshare -h\n\nNAME:\n drand dkg reshare\n\nUSAGE:\n drand dkg reshare [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to.[$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --threshold value threshold to use for the DKG (default: 0) [$DRAND_THRESHOLD]\n --catchup-period value Minimum period while in catchup. Set only by the leader of share / reshares (default: "0s") [$DRAND_CATCHUP_PERIOD]\n --proposal value Path to a toml file specifying the leavers, joiners and remainers for a network proposal [$DRAND_PROPOSAL_PATH]\n --timeout value The duration from now in which DKG participants should abort the DKG if it has not completed. (default: "24h")\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-join",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg join"})})}),"\n",(0,t.jsxs)(n.p,{children:["New joiners to a network must run the\xa0",(0,t.jsx)(n.code,{children:"join"}),"\xa0command to register their interest in taking part in the distributed key generation/resharing process. If this is a resharing, the new nodes must obtain a copy of the group configuration file from an existing member, and use the\xa0",(0,t.jsx)(n.code,{children:"--group "}),"\xa0flag to specify the path to the\xa0",(0,t.jsx)(n.code,{children:"group.toml"}),"\xa0file. In this case,\xa0",(0,t.jsx)(n.code,{children:"--id"}),"\xa0flag is not required, as the unique identifier will be taken from the file."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg join -h\n\nNAME:\n drand dkg join\n\nUSAGE:\n drand dkg join [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --group value The group file of the previous epoch [$DRAND_DKG_GROUP]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-accept",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg accept"})})}),"\n",(0,t.jsxs)(n.p,{children:["Members of the existing network epoch can run\xa0",(0,t.jsx)(n.code,{children:"accept"}),"\xa0to express their acceptance of a leader's resharing proposal."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg accept -h\n\nNAME:\n drand dkg accept\n\nUSAGE:\n drand dkg accept [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-reject",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg reject"})})}),"\n",(0,t.jsxs)(n.p,{children:["Members of the existing network epoch can run\xa0",(0,t.jsx)(n.code,{children:"reject"}),"\xa0to express their rejection of a leader's resharing proposal. This does not a priori halt the DKG."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg reject -h\n\nNAME:\n drand dkg reject\n\nUSAGE:\n drand dkg reject [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-execute",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg execute"})})}),"\n",(0,t.jsx)(n.p,{children:"Once nodes have accepted or rejected a proposal, the leader can kick off execution. This will start the actual protocol for distributed key generation or resharing."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg execute -h\n\nNAME:\n drand dkg execute\n\nUSAGE:\n drand dkg execute [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-abort",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg abort"})})}),"\n",(0,t.jsx)(n.p,{children:"Should anything go wrong during the proposal of a DKG, such as incorrect parameters or too many rejections, the leader can abort it. This will cause other nodes to revert their current DKG state to the last successful one (or none if the abort was for an initial DKG). Future proposals will share an epoch identifier with the aborted proposal."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg abort -h\n\nNAME:\n drand dkg abort\n\nUSAGE:\n drand dkg abort [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-dkg-status",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand dkg status"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"status"}),"\xa0command allows operators to track the status of the DKG over time: what state their node is in, what who made a proposal, who has accepted or rejected a proposal, or when a resharing has completed. This can be output as CSV or in a pretty table, the default being pretty."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:'$ drand dkg status -h\n\nNAME:\n drand dkg status\n\nUSAGE:\n drand dkg status [command options] [arguments...]\n\nOPTIONS:\n --id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]\n --control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]\n --format value Set the format of the status output. Valid options are: pretty, csv (default: "pretty") [$DRAND_STATUS_FORMAT]\n --help, -h show help (default: false)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"drand-get",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand get"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"get"}),"\xa0command allows you to fetch public information from a running drand node, including random values and the public distributed key. Note that you do not need to be a node operator or a member of the drand group in order to use\xa0",(0,t.jsx)(n.code,{children:"drand get"}),", but you will need a copy of the group configuration file. You will also need access to the gRPC API endpoint, which may be protected by firewall rules."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-jsx",children:"$ drand get --help\n\nNAME:\n drand get - get allows for public information retrieval from a remote drand node.\n\nUSAGE:\n drand get command [command options] [arguments...]\n\nCOMMANDS:\n public Get the latest public randomness from the drand beacon and verify it against the collective public key as specified in group.toml. Only one node is contacted by default. This command attempts to connect to the drand beacon via TLS and falls back to plaintext communication if the contacted node has not activated TLS in which case it prints a warning.\n\n chain-info Get the binding chain information that this node participates to\n help, h Shows a list of commands or help for one command\n\nOPTIONS:\n --help, -h show help (default: false)\n --version, -v print the version (default: false)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["There are three main subcommands for\xa0",(0,t.jsx)(n.code,{children:"drand get"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand get public "}),"\xa0returns the latest public random value from the group described in\xa0",(0,t.jsx)(n.code,{children:"group.toml"}),". You may fetch a specific round instead of the latest by supplying the\xa0",(0,t.jsx)(n.code,{children:"-round "}),"\xa0flag."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand get chain-info --chain-hash "}),"\xa0returns the binding chain information that this node participates to. In order to choose a network among the running ones on a node, you must provide the chain hash of it."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"drand-show",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand show"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"show"}),"\xa0command returns private information from a local\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0node, including its private cryptographic material."]}),"\n",(0,t.jsxs)(n.p,{children:["There are several subcommands for\xa0",(0,t.jsx)(n.code,{children:"drand show"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand show share"}),"\xa0prints the private distributed key share for the local node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand show group"}),"\xa0prints the group configuration file. If a DKG has been performed, this will include the distributed public key."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand show chain-info"}),"\xa0prints the information for the randomness chain the local node is participating in."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand show private"}),"\xa0prints the long-term private key of the local node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand show public"}),"\xa0prints the long-term public key of the local node."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For full usage information, run\xa0",(0,t.jsx)(n.code,{children:"drand show --help"}),"."]}),"\n",(0,t.jsx)("aside",{children:(0,t.jsxs)(n.p,{children:["\ud83d\udca1 ",(0,t.jsx)(n.strong,{children:"TIP"}),": You must use\xa0",(0,t.jsx)(n.code,{children:"--id"}),"\xa0flag to choose between all running networks on the node."]})}),"\n",(0,t.jsx)(n.h3,{id:"drand-util",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand util"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"util"}),"\xa0command provides several subcommands that are useful for debugging and managing local node state:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util check
"}),"\xa0attempts to contact the node at the given address to see if it's online and responding to requests. This can be used to check that a running network on your local node is reachable at its public address, or to make sure that a remote node can be reached before running\xa0",(0,t.jsx)(n.code,{children:"drand share"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util list-schemes"}),"\xa0lists all scheme the node supports and can be used on share command."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util remote-status"}),"\xa0asks for the statuses of remote networks' nodes indicated by\xa0",(0,t.jsx)(n.code,{children:"ADDRESS1 ADDRESS2 ADDRESS3..."}),", including the network visibility over the rest of the addresses given."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util status"}),"\xa0gets the status of many modules of a running network on the local node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util migrate"}),"\xa0runs the migration required the multi-beacon folder structure on the local node."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util ping"}),"\xa0sends a ping to the local\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon and prints its status."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util backup"}),"\xa0backs up the primary drand database of a running network to a secondary location."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util self-sign"}),"\xa0signs the public identity of a running network. Needed for backward compatibility with previous versions."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util reset"}),"\xa0deletes all distributed information (group file, key share, random beacon state, etc) from a network on the local node. It does NOT delete the long-term keypair."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"drand util del-beacon "}),"\xa0deletes all beacon chain rounds from\xa0",(0,t.jsx)(n.code,{children:""}),"\xa0until the current head of the beacon chain from a running network's database. You MUST restart the running network after issuing this command."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For full usage information, run\xa0",(0,t.jsx)(n.code,{children:"drand util --help"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"supplemental-tools",children:(0,t.jsx)(n.strong,{children:"Supplemental Tools"})}),"\n",(0,t.jsxs)(n.p,{children:["In addition to the main\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0cli app, there are several supplemental tools that can be used to consume randomness from a drand network or help securely scale a drand deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["The following tools do not yet have binary releases and must be installed from source. The basic procedure is the same as ",(0,t.jsx)(n.a,{href:"https://drand.love/operator/drand-cli/#source-code",children:"**"}),(0,t.jsx)(n.a,{href:"./4-5-ops-guide-command-line-tools",children:"4.5 DevOps: Command-line Tools"}),"**, but instead of\xa0",(0,t.jsx)(n.code,{children:"make install"}),"\xa0or\xa0",(0,t.jsx)(n.code,{children:"make build"}),", you'll run one of:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"make client"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"make relay-http"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"make relay-gossip"})}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"drand-client",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand-client"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"drand-client"}),"\xa0command is a standalone drand client that's optimized to fetch randomness from a drand network and provide it over a CDN."]}),"\n",(0,t.jsx)(n.p,{children:"The client is configured with the URL for a drand HTTP endpoint, and may optionally be configured with the addresses of one or more libp2p relay nodes. If libp2p relays are configured, the HTTP endpoint will be used as a fallback if the libp2p relays fail to deliver randomness at the expected interval."}),"\n",(0,t.jsxs)(n.p,{children:["To see full usage information, run\xa0",(0,t.jsx)(n.code,{children:"drand-client help"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"drand-relay-http",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand-relay-http"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"drand-relay-http"}),"\xa0command provides a gRPC to HTTP relay server that can be used to relay requests from the public internet to a drand daemon. This is an alternative to the public HTTP endpoint that runs in the main\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0process when starting\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0with the\xa0",(0,t.jsx)(n.code,{children:"--public-listen"}),"\xa0flag."]}),"\n",(0,t.jsxs)(n.p,{children:["While the\xa0",(0,t.jsx)(n.code,{children:"--public-listen"}),"\xa0flag is convenient, running a separate relay process allows the HTTP communications to be isolated from the main\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0process, which limits the attack surface of the\xa0",(0,t.jsx)(n.code,{children:"drand"}),"\xa0daemon."]}),"\n",(0,t.jsxs)(n.p,{children:["To see full usage information, run\xa0",(0,t.jsx)(n.code,{children:"drand-relay-http help"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"drand-relay-gossip",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"drand-relay-gossip"})})}),"\n",(0,t.jsxs)(n.p,{children:["The\xa0",(0,t.jsx)(n.code,{children:"drand-relay-gossip"}),"\xa0command provides a relay server that connects to a drand node over gRPC and provides randomness to consumers over a\xa0",(0,t.jsx)(n.a,{href:"https://docs.libp2p.io/concepts/publish-subscribe/",children:"libp2p PubSub"}),"\xa0topic. Randomness provided by a gossip relay may be consumed directly over PubSub by libp2p-capable programs, and/or via a CDN which has been configured to listen to a PubSub topic using\xa0",(0,t.jsx)(n.code,{children:"drand-client"}),"."]}),"\n",(0,t.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>a,x:()=>s});var t=o(6540);const d={},r=t.createContext(d);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/6825e205.e96e4ab0.js b/site/assets/js/6825e205.e96e4ab0.js new file mode 100644 index 00000000..dbecdbd1 --- /dev/null +++ b/site/assets/js/6825e205.e96e4ab0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5706],{1622:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=i(4848),t=i(8453);const o={id:"2-3-concepts-specification",title:"2.3 Specification",description:"Outlines the drand protocol specification."},s="2.3 Concepts: Specification",a={id:"concepts/2-3-concepts-specification",title:"2.3 Specification",description:"Outlines the drand protocol specification.",source:"@site/docs/02_concepts/02-03-Concepts_Specification.md",sourceDirName:"02_concepts",slug:"/concepts/2-3-concepts-specification",permalink:"/drand-docs/docs/concepts/2-3-concepts-specification",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/02_concepts/02-03-Concepts_Specification.md",tags:[],version:"current",frontMatter:{id:"2-3-concepts-specification",title:"2.3 Specification",description:"Outlines the drand protocol specification."},sidebar:"docsSidebar",previous:{title:"2.2 Security Model",permalink:"/drand-docs/docs/concepts/2-2-concepts-security-model"},next:{title:"2.4 Timelock Encryption",permalink:"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption"}},d={},c=[{value:"\ud83d\udcd5 Key Terminology",id:"-key-terminology",level:2},{value:"Metadata",id:"metadata",level:2},{value:"Scheme",id:"scheme",level:2},{value:"Group Configuration",id:"group-configuration",level:2},{value:"Group Configuration Hash",id:"group-configuration-hash",level:2},{value:"Wire Format & API",id:"wire-format--api",level:2},{value:"drand Node Operations",id:"drand-node-operations",level:2},{value:"drand Versioning",id:"drand-versioning",level:3},{value:"drand Modules",id:"drand-modules",level:2},{value:"1. Setup Phase",id:"1-setup-phase",level:3},{value:"2. Randomness Generation Phase",id:"2-randomness-generation-phase",level:3},{value:"Randomness Generation Details",id:"randomness-generation-details",level:2},{value:"Randomness Generation Period",id:"randomness-generation-period",level:3},{value:"Chained vs. Unchained Mode",id:"chained-vs-unchained-mode",level:3},{value:"Root of Trust",id:"root-of-trust",level:2},{value:"Catchup Mode",id:"catchup-mode",level:2},{value:"Syncing",id:"syncing",level:2},{value:"Cryptographic Specification",id:"cryptographic-specification",level:2},{value:"drand Curve",id:"drand-curve",level:3},{value:"Distributed Public Key",id:"distributed-public-key",level:3},{value:"Beacon Signature",id:"beacon-signature",level:3},{value:"Partial Beacon Signature",id:"partial-beacon-signature",level:3},{value:"Distributed Key Generation",id:"distributed-key-generation",level:3},{value:"Resharing",id:"resharing",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"23-concepts-specification",children:"2.3 Concepts: Specification"})}),"\n",(0,r.jsx)(n.p,{children:"This document outlines the specifications of the drand protocols."}),"\n",(0,r.jsx)(n.h2,{id:"-key-terminology",children:"\ud83d\udcd5 Key Terminology"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Drand Node"}),": A server that runs the ",(0,r.jsx)(n.a,{href:"https://github.com/drand/drand/",children:"drand code"}),", participating in the distributed key generation (DKG) process and randomness generation. Each node can run multiple independent internal randomness processes, each with its own randomness generation frequency."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Drand Network"}),": A group of nodes running a specific process, acting as an independent beacon generator."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Drand Beacon"}),": The output created by the drand network, containing the signature of the previous beacon, the round of the beacon, and the signature itself."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Beacon ID"}),": A unique identifier for each beacon process running on a drand node. This ID helps each drand node dispatch received messages to the correct internal process."]}),"\n",(0,r.jsx)(n.h2,{id:"metadata",children:"Metadata"}),"\n",(0,r.jsxs)(n.p,{children:["Each request sent by a drand node includes metadata to communicate important message-related data. The ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Protocol_Buffers",children:"protobuf"})," definition for this field is:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-protobuf",children:"message Metadata {\n NodeVersion node_version = 1;\n string beaconID = 2;\n bytes chain_hash = 3;\n}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"scheme",children:"Scheme"}),"\n",(0,r.jsx)(n.p,{children:"A scheme is a network-level configuration set by a coordinator when starting a new network. Available schemes are:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DefaultSchemeID"}),': "pedersen-bls-chained"']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"UnchainedSchemeID"}),': "pedersen-bls-unchained"']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"ShortSigSchemeID"}),': "bls-unchained-on-g1"']}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"group-configuration",children:"Group Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Group Configuration includes all necessary information about a running drand network, such as nodes, threshold, period, ID, scheme, genesis time, genesis seed, distributed public key, and transition time. This configuration is shared internally within drand nodes."}),"\n",(0,r.jsx)(n.h2,{id:"group-configuration-hash",children:"Group Configuration Hash"}),"\n",(0,r.jsxs)(n.p,{children:["The group configuration is uniquely referenced via its canonical hash, derived using the ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/BLAKE_(hash_function)",children:"BLAKE2b"})," hash function."]}),"\n",(0,r.jsx)(n.h2,{id:"wire-format--api",children:"Wire Format & API"}),"\n",(0,r.jsxs)(n.p,{children:["Drand uses ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/GRPC",children:"gRPC"})," as the networking protocol. All exposed services and protobuf definitions are in the ",(0,r.jsx)(n.code,{children:"protocol.proto"})," file for intra-node protocols and in the ",(0,r.jsx)(n.code,{children:"api.proto"})," file."]}),"\n",(0,r.jsx)(n.h2,{id:"drand-node-operations",children:"drand Node Operations"}),"\n",(0,r.jsx)(n.p,{children:"Generating public randomness is the primary function of drand. Each node can run multiple processes, each independent of the others, identified and dispatched using the Beacon ID."}),"\n",(0,r.jsx)(n.h3,{id:"drand-versioning",children:"drand Versioning"}),"\n",(0,r.jsx)(n.p,{children:"Each request sent by a drand node contains the protocol version used. Drand uses semantic versioning, allowing only nodes with the same MAJOR version to communicate."}),"\n",(0,r.jsx)(n.h2,{id:"drand-modules",children:"drand Modules"}),"\n",(0,r.jsx)(n.p,{children:"drand operates in two phases: 1. setup and 2. generation."}),"\n",(0,r.jsx)(n.h3,{id:"1-setup-phase",children:"1. Setup Phase"}),"\n",(0,r.jsx)(n.p,{children:"During the setup phase, nodes perform a DKG protocol to create the collective public key and individual private key shares. This setup uses a coordinator to collect public keys and create the group configuration."}),"\n",(0,r.jsx)(n.h3,{id:"2-randomness-generation-phase",children:"2. Randomness Generation Phase"}),"\n",(0,r.jsx)(n.p,{children:"After setup, nodes switch to randomness generation mode, broadcasting partial signatures periodically. Once enough partial signatures are gathered, a final signature is reconstructed, verified, and hashed to produce the public randomness."}),"\n",(0,r.jsx)(n.h2,{id:"randomness-generation-details",children:"Randomness Generation Details"}),"\n",(0,r.jsx)(n.h3,{id:"randomness-generation-period",children:"Randomness Generation Period"}),"\n",(0,r.jsx)(n.p,{children:'The drand network outputs a new random beacon every period, mapping a beacon "round" to a specific time. The function to determine the current round and time is as follows:'}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-go",children:"func CurrentRound(now, genesis int64, period uint32) (round uint64, time int64) {\n if now < genesis {\n return 0\n }\n fromGenesis := now - genesis\n round = uint64(math.Floor(float64(fromGenesis)/period)) + 1\n time = genesis + int64(nextRound*uint64(period.Seconds()))\n return\n}\n"})}),"\n",(0,r.jsx)(n.h3,{id:"chained-vs-unchained-mode",children:"Chained vs. Unchained Mode"}),"\n",(0,r.jsx)(n.p,{children:"drand can operate in two modes regarding randomness generation: chained or unchained. In chained mode, each beacon builds on the previous one, forming a randomness chain. In unchained mode, each beacon is independent."}),"\n",(0,r.jsx)(n.h2,{id:"root-of-trust",children:"Root of Trust"}),"\n",(0,r.jsxs)(n.p,{children:["drand uniquely identifies a randomness chain via the ",(0,r.jsx)(n.code,{children:"Info"})," structure, which includes public key, ID, period, scheme, genesis time, and group hash."]}),"\n",(0,r.jsx)(n.h2,{id:"catchup-mode",children:"Catchup Mode"}),"\n",(0,r.jsx)(n.p,{children:"Nodes must synchronize with each other to catch up if the network stalls. Nodes enter catchup mode if they detect a discrepancy in the expected round, synchronizing beacons until the current round is reached."}),"\n",(0,r.jsx)(n.h2,{id:"syncing",children:"Syncing"}),"\n",(0,r.jsx)(n.p,{children:"Nodes that are offline or restarted should sync with the network, requesting beacons from the last saved round to the current round."}),"\n",(0,r.jsx)(n.h2,{id:"cryptographic-specification",children:"Cryptographic Specification"}),"\n",(0,r.jsx)(n.h3,{id:"drand-curve",children:"drand Curve"}),"\n",(0,r.jsxs)(n.p,{children:["drand uses the ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/BLS_digital_signature#BLS12-381",children:"BLS12-381"})," pairing curve, with points sent in compressed form. The hash-to-curve algorithm follows ",(0,r.jsx)(n.a,{href:"https://datatracker.ietf.org/doc/rfc9380/",children:"RFC-9380"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"distributed-public-key",children:"Distributed Public Key"}),"\n",(0,r.jsx)(n.p,{children:"The distributed public key is a list of BLS12-381 G1 points, representing the public polynomial created during the DKG protocol."}),"\n",(0,r.jsx)(n.h3,{id:"beacon-signature",children:"Beacon Signature"}),"\n",(0,r.jsx)(n.p,{children:"A beacon signature is a BLS signature over the message, verified using the distributed public key."}),"\n",(0,r.jsx)(n.h3,{id:"partial-beacon-signature",children:"Partial Beacon Signature"}),"\n",(0,r.jsx)(n.p,{children:"A partial beacon signature is created over the same input as the beacon signature, prefixed with the node's index."}),"\n",(0,r.jsx)(n.h3,{id:"distributed-key-generation",children:"Distributed Key Generation"}),"\n",(0,r.jsx)(n.p,{children:"drand implements the Joint Feldman protocol for DKG, ensuring secure and distributed key generation."}),"\n",(0,r.jsx)(n.h3,{id:"resharing",children:"Resharing"}),"\n",(0,r.jsx)(n.p,{children:"Resharing allows an established group to distribute new shares to a new group of nodes, maintaining the same public key for verifying random beacons."}),"\n",(0,r.jsx)(n.hr,{})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var r=i(6540);const t={},o=r.createContext(t);function s(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/6875c492.386ee3df.js b/site/assets/js/6875c492.386ee3df.js new file mode 100644 index 00000000..b3028b1c --- /dev/null +++ b/site/assets/js/6875c492.386ee3df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4813],{7713:(e,t,n)=>{n.d(t,{A:()=>i});n(6540);var s=n(1312),a=n(9022),r=n(4848);function i(e){const{metadata:t}=e,{previousPage:n,nextPage:i}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,r.jsx)(a.A,{permalink:n,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),i&&(0,r.jsx)(a.A,{permalink:i,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},2907:(e,t,n)=>{n.d(t,{A:()=>B});n(6540);var s=n(4164),a=n(4096),r=n(4848);function i(e){let{children:t,className:n}=e;return(0,r.jsx)("article",{className:n,children:t})}var l=n(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:n,isBlogPostPage:i}=(0,a.e7)(),{permalink:c,title:d}=n,u=i?"h1":"h2";return(0,r.jsx)(u,{className:(0,s.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=n(1312),u=n(5846),g=n(6266);const h={container:"container_mt6G"};function m(e){let{readingTime:t}=e;const n=function(){const{selectMessage:e}=(0,u.W)();return t=>{const n=Math.ceil(t);return e(n,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,r.jsx)(r.Fragment,{children:n(t)})}function p(e){let{date:t,formattedDate:n}=e;return(0,r.jsx)("time",{dateTime:t,children:n})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:n}=(0,a.e7)(),{date:i,readingTime:l}=n,o=(0,g.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(p,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(m,{readingTime:l})]})]});var c}var f=n(6913);const b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:n},assets:i}=(0,a.e7)();if(0===n.length)return null;const l=n.every((e=>{let{name:t}=e;return!t})),o=1===n.length;return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:n.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,r.jsx)(f.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function T(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(j,{}),(0,r.jsx)(A,{})]})}var v=n(440),N=n(5533);function w(e){let{children:t,className:n}=e;const{isBlogPostPage:i}=(0,a.e7)();return(0,r.jsx)("div",{id:i?v.LU:void 0,className:(0,s.A)("markdown",n),children:(0,r.jsx)(N.A,{children:t})})}var y=n(7559),P=n(4336),k=n(2053);function U(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function _(e){const{blogPostTitle:t,...n}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,r.jsx)(U,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,a.e7)(),{tags:n,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,u=!t&&o,g=n.length>0;if(!(g||u||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",y.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(k.A,{tags:n})})}),e&&(0,r.jsx)(P.A,{className:(0,s.A)("margin-top--sm",y.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":u}),children:(0,r.jsx)(k.A,{tags:n})}),u&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":g}),children:(0,r.jsx)(_,{blogPostTitle:i,to:e.permalink})})]})}function B(e){let{children:t,className:n}=e;const l=function(){const{isBlogPostPage:e}=(0,a.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,s.A)(l,n),children:[(0,r.jsx)(T,{}),(0,r.jsx)(w,{children:t}),(0,r.jsx)(R,{})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>i});n(6540);var s=n(4096),a=n(2907),r=n(4848);function i(e){let{items:t,component:n=a.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(s.in,{content:t,children:(0,r.jsx)(n,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},3069:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(6540);var s=n(4164),a=n(1312),r=n(1213),i=n(7559),l=n(6461),o=n(8774),c=n(8027),d=n(7713),u=n(1463),g=n(3892),h=n(2234),m=n(1107),p=n(4848);function x(e){let{tag:t}=e;const n=(0,l.ZD)(t);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(r.be,{title:n,description:t.description}),(0,p.jsx)(u.A,{tag:"blog_tags_posts"})]})}function j(e){let{tag:t,items:n,sidebar:s,listMetadata:r}=e;const i=(0,l.ZD)(t);return(0,p.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,p.jsx)(h.A,{}),(0,p.jsxs)("header",{className:"margin-bottom--xl",children:[(0,p.jsx)(m.A,{as:"h1",children:i}),t.description&&(0,p.jsx)("p",{children:t.description}),(0,p.jsx)(o.A,{href:t.allTagsPath,children:(0,p.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,p.jsx)(g.A,{items:n}),(0,p.jsx)(d.A,{metadata:r})]})}function f(e){return(0,p.jsxs)(r.e3,{className:(0,s.A)(i.G.wrapper.blogPages,i.G.page.blogTagPostListPage),children:[(0,p.jsx)(x,{...e}),(0,p.jsx)(j,{...e})]})}},2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(4084),r=n(7559),i=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(i.A,{type:"caution",title:(0,l.jsx)(a.Rc,{}),className:(0,s.A)(t,r.G.common.unlistedBanner),children:(0,l.jsx)(a.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(a.AE,{}),(0,l.jsx)(o,{...e})]})}},6461:(e,t,n)=>{n.d(t,{ZD:()=>l,np:()=>d,uz:()=>c,wI:()=>o});n(6540);var s=n(1312),a=n(5846),r=n(4848);function i(){const{selectMessage:e}=(0,a.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function l(e){const t=i();return(0,s.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function o(e){const t=i();return(0,s.T)({id:"theme.blog.author.pageTitle",description:"The title of the page for a blog author",message:"{authorName} - {nPosts}"},{nPosts:t(e.count),authorName:e.name||e.key})}const c=()=>(0,s.T)({id:"theme.blog.authorsList.pageTitle",message:"Authors",description:"The title of the authors page"});function d(){return(0,r.jsx)(s.A,{id:"theme.blog.authorsList.viewAll",description:"The label of the link targeting the blog authors page",children:"View all authors"})}},4084:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>i,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var s=n(1312),a=n(5260),r=n(4848);function i(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,r.jsx)(a.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/site/assets/js/6905.9c40e72e.js b/site/assets/js/6905.9c40e72e.js new file mode 100644 index 00000000..85982193 --- /dev/null +++ b/site/assets/js/6905.9c40e72e.js @@ -0,0 +1 @@ +(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[6905],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),a=n(4848);function o(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:o.length>0?(0,a.jsx)(a.Fragment,{children:o}):null}}(e.children),o=e.title??t;return{...e,...o&&{title:o},children:n}}var c=n(4164),i=n(1312),r=n(7559);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,a.jsx)("div",{className:(0,c.A)(r.G.common.admonition,r.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,a.jsxs)("div",{className:l.admonitionHeading,children:[(0,a.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,a.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:o,className:c}=e;return(0,a.jsxs)(d,{type:t,className:c,children:[s||n?(0,a.jsx)(u,{title:s,icon:n}):null,(0,a.jsx)(m,{children:o})]})}function p(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("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"})})}const f={icon:(0,a.jsx)(p,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(h,{...f,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function x(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("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"})})}const j={icon:(0,a.jsx)(x,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,a.jsx)(h,{...j,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("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"})})}const N={icon:(0,a.jsx)(v,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,a.jsx)(h,{...N,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("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"})})}const k={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function B(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("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"})})}const C={icon:(0,a.jsx)(B,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const w={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const _={...{note:g,tip:b,info:y,warning:function(e){return(0,a.jsx)(h,{...k,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(h,{...C,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(y,{title:"important",...e}),success:e=>(0,a.jsx)(b,{title:"success",...e}),caution:function(e){return(0,a.jsx)(h,{...w,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=o(e),n=(s=t.type,_[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),_.info));var s;return(0,a.jsx)(n,{...t})}},4336:(e,t,n)=>{"use strict";n.d(t,{A:()=>g});n(6540);var s=n(4164),a=n(1312),o=n(7559),c=n(8774);const i={iconEdit:"iconEdit_Z9Sw"};var r=n(4848);function l(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(i.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("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 d(e){let{editUrl:t}=e;return(0,r.jsxs)(c.A,{to:t,className:o.G.common.editThisPage,children:[(0,r.jsx)(l,{}),(0,r.jsx)(a.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,r.jsx)(a.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,r.jsx)("b",{children:(0,r.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,r.jsx)(a.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,r.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,r.jsxs)("span",{className:o.G.common.lastUpdated,children:[(0,r.jsx)(a.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,r.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,r.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function g(e){let{className:t,editUrl:n,lastUpdatedAt:a,lastUpdatedBy:o}=e;return(0,r.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,r.jsx)("div",{className:"col",children:n&&(0,r.jsx)(d,{editUrl:n})}),(0,r.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(a||o)&&(0,r.jsx)(p,{lastUpdatedAt:a,lastUpdatedBy:o})})]})}},5533:(e,t,n)=>{"use strict";n.d(t,{A:()=>re});var s=n(6540),a=n(8453),o=n(5260),c=n(2303),i=n(4164),r=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,r.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,g={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},x={...g,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},j=Object.keys(g);function b(e,t){const n=e.map((e=>{const{start:n,end:s}=x[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&f.test(o)){const e=o.match(f).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return b(["tex"],t);case"lua":case"haskell":case"sql":return b(["lua"],t);case"wasm":return b(["wasm"],t);case"vb":case"vba":case"visual-basic":return b(["vb","rem"],t);case"vbnet":return b(["vbnet","rem"],t);case"batch":return b(["rem"],t);case"basic":return b(["rem","f90"],t);case"fsharp":return b(["js","ml"],t);case"ocaml":case"sml":return b(["ml"],t);case"fortran":return b(["f90"],t);case"cobol":return b(["cobol"],t);default:return b(j,t)}}(s,a),i=n.split("\n"),r=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<i.length;){const e=i[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?r[l[t]].range+=`${h},`:d[t]?r[d[t]].start=h:u[t]&&(r[u[t]].range+=`${r[u[t]].start}-${h-1},`),i.splice(h,1)}n=i.join("\n");const m={};return Object.entries(r).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const N={codeBlockContainer:"codeBlockContainer_Ckt0"};var y=n(4848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(d());return(0,y.jsx)(t,{...n,style:s,className:(0,i.A)(n.className,N.codeBlockContainer,u.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 B(e){let{children:t,className:n}=e;return(0,y.jsx)(A,{as:"pre",tabIndex:0,className:(0,i.A)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,y.jsx)("code",{className:k.codeBlockLines,children:t})})}var C=n(9532);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function _(e,t){const[n,a]=(0,s.useState)(),o=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{o()}),[o]),function(e,t,n){void 0===n&&(n=w);const a=(0,C._q)(t),o=(0,C.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,o),()=>t.disconnect()}),[e,a,o])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),o())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const E={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function T(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=a({line:t,className:(0,i.A)(n,s&&E.codeLine)}),r=t.map(((e,t)=>(0,y.jsx)("span",{...o({token:e})},t)));return(0,y.jsxs)("span",{...c,children:[s?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)("span",{className:E.codeLineNumber}),(0,y.jsx)("span",{className:E.codeLineContent,children:r})]}):r,(0,y.jsx)("br",{})]})}var S=n(1312);function U(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",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"})})}function M(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),r=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),c=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let i=!1;try{i=document.execCommand("copy")}catch{}s.remove(),c&&(o.removeAllRanges(),o.addRange(c)),a&&a.focus()}(t),o(!0),c.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,y.jsx)("button",{type:"button","aria-label":a?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.A)("clean-btn",n,z.copyButton,a&&z.copyButtonCopied),onClick:r,children:(0,y.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,y.jsx)(U,{className:z.copyButtonIcon}),(0,y.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("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"})})}const R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,y.jsx)("button",{type:"button",onClick:n,className:(0,i.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,y.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function W(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:c,language:r}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(r??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),g=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),i=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return _(o,i),(0,s.useEffect)((()=>{i()}),[e,i]),(0,s.useEffect)((()=>(window.addEventListener("resize",i,{passive:!0}),()=>{window.removeEventListener("resize",i)})),[i]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:c}}(),x=function(e){return e?.match(p)?.groups.title??""}(a)||o,{lineClassNames:j,code:b}=v(t,{metastring:a,language:h,magicComments:m}),N=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,y.jsxs)(A,{as:"div",className:(0,i.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[x&&(0,y.jsx)("div",{className:k.codeBlockTitle,children:x}),(0,y.jsxs)("div",{className:k.codeBlockContent,children:[(0,y.jsx)(L.f4,{theme:f,code:b,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,y.jsx)("pre",{tabIndex:0,ref:g.codeBlockRef,className:(0,i.A)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,y.jsx)("code",{className:(0,i.A)(k.codeBlockLines,N&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,y.jsx)(T,{line:e,getLineProps:a,getTokenProps:o,classNames:j[t],showLineNumbers:N},t)))})})}}),(0,y.jsxs)("div",{className:k.buttonGroup,children:[(g.isEnabled||g.isCodeScrollable)&&(0,y.jsx)(V,{className:k.codeButton,onClick:()=>g.toggle(),isEnabled:g.isEnabled}),(0,y.jsx)(I,{className:k.codeButton,code:b})]})]})]})}function $(e){let{children:t,...n}=e;const a=(0,c.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof o?W:B;return(0,y.jsx)(i,{...n,children:o},String(a))}function D(e){return(0,y.jsx)("code",{...e})}var P=n(8774);var G=n(3427),q=n(1422);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...a}=e;(0,G.A)().collectAnchor(a.id);const o=(0,c.A)(),r=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,q.u)({initialState:!a.open}),[u,m]=(0,s.useState)(a.open),h=s.isValidElement(t)?t:(0,y.jsx)("summary",{children:t??"Details"});return(0,y.jsxs)("details",{...a,ref:r,open:u,"data-collapsed":l,className:(0,i.A)(O.details,o&&O.isBrowser,a.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,r.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,y.jsx)(q.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,y.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,y.jsx)(J,{...t,className:(0,i.A)(K,Y.details,t.className)})}function X(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,y.jsx)(y.Fragment,{children:t.filter((e=>e!==n))});return(0,y.jsx)(Q,{...e,summary:n,children:a})}var ee=n(1107);function te(e){return(0,y.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,i.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const ae={img:"img_ev3q"};var oe=n(7293),ce=n(418);const ie={Head:o.A,details:X,Details:X,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,y.jsx)(D,{...e}):(0,y.jsx)($,{...e})},a:function(e){return(0,y.jsx)(P.A,{...e})},pre:function(e){return(0,y.jsx)(y.Fragment,{children:e.children})},ul:function(e){return(0,y.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,G.A)().collectAnchor(e.id),(0,y.jsx)("li",{...e})},img:function(e){return(0,y.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,i.A)(t,ae.img))});var t},h1:e=>(0,y.jsx)(te,{as:"h1",...e}),h2:e=>(0,y.jsx)(te,{as:"h2",...e}),h3:e=>(0,y.jsx)(te,{as:"h3",...e}),h4:e=>(0,y.jsx)(te,{as:"h4",...e}),h5:e=>(0,y.jsx)(te,{as:"h5",...e}),h6:e=>(0,y.jsx)(te,{as:"h6",...e}),admonition:oe.A,mermaid:ce.A};function re(e){let{children:t}=e;return(0,y.jsx)(a.x,{components:ie,children:t})}},9022:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(8774),o=n(4848);function c(e){const{permalink:t,title:n,subLabel:c,isNext:i}=e;return(0,o.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[c&&(0,o.jsx)("div",{className:"pagination-nav__sublabel",children:c}),(0,o.jsx)("div",{className:"pagination-nav__label",children:n})]})}},6133:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var s=n(4164),a=n(8774);const o={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var c=n(4848);function i(e){let{permalink:t,label:n,count:i,description:r}=e;return(0,c.jsxs)(a.A,{href:t,title:r,className:(0,s.A)(o.tag,i?o.tagWithCount:o.tagRegular),children:[n,i&&(0,c.jsx)("span",{children:i})]})}},2053:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});n(6540);var s=n(4164),a=n(1312),o=n(6133);const c={tags:"tags_jXut",tag:"tag_QGVx"};var i=n(4848);function r(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(c.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:c.tag,children:(0,i.jsx)(o.A,{...e})},e.permalink)))})]})}},6266:(e,t,n)=>{"use strict";n.d(t,{i:()=>a});var s=n(4586);function a(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>c,x:()=>i});var s=n(6540);const a={},o=s.createContext(a);function c(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/6c2aefca.957edc04.js b/site/assets/js/6c2aefca.957edc04.js new file mode 100644 index 00000000..103991a3 --- /dev/null +++ b/site/assets/js/6c2aefca.957edc04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4960],{5662:d=>{d.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"5.0 DRAND COMMUNITY","description":"A list of ways you can connect with the drand community.","slug":"/category/50-drand-community","permalink":"/drand-docs/docs/category/50-drand-community","sidebar":"docsSidebar","navigation":{"previous":{"title":"4.5 Command-line Tools","permalink":"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools"},"next":{"title":"5.0 DRAND COMMUNITY","permalink":"/drand-docs/docs/drand-community/5-0-drand-community"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/6eaa7728.6a525c68.js b/site/assets/js/6eaa7728.6a525c68.js new file mode 100644 index 00000000..d9f4fbd1 --- /dev/null +++ b/site/assets/js/6eaa7728.6a525c68.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3390],{5770:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>l,frontMatter:()=>t,metadata:()=>r,toc:()=>h});var d=s(4848),i=s(8453);const t={id:"3-4-dev-guide-http-api",title:"3.4 HTTP API",description:"A list of public endpoints, instructions how to fetch, explanation of results."},c="3.4 DevGuide: HTTP API",r={id:"dev-guide/3-4-dev-guide-http-api",title:"3.4 HTTP API",description:"A list of public endpoints, instructions how to fetch, explanation of results.",source:"@site/docs/03_dev-guide/03-04-DevGuide_HTTP_API.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-4-dev-guide-http-api",permalink:"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-04-DevGuide_HTTP_API.md",tags:[],version:"current",frontMatter:{id:"3-4-dev-guide-http-api",title:"3.4 HTTP API",description:"A list of public endpoints, instructions how to fetch, explanation of results."},sidebar:"docsSidebar",previous:{title:"3.3 Client Libraries",permalink:"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries"},next:{title:"3.5 PubSub Network",permalink:"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network"}},a={},h=[{value:"<strong>Public endpoints</strong>",id:"public-endpoints",level:2},{value:"<strong>Testnet endpoints</strong>",id:"testnet-endpoints",level:3},{value:"<strong><code>/chains</code></strong>",id:"chains",level:2},{value:"<strong><code>/{chain-hash}/info</code></strong>",id:"chain-hashinfo",level:2},{value:"<strong><code>/{chain-hash}/public/latest</code></strong>",id:"chain-hashpubliclatest",level:2},{value:"<strong><code>/{chain-hash}/public/{round}</code></strong>",id:"chain-hashpublicround",level:2}];function o(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"34-devguide-http-api",children:"3.4 DevGuide: HTTP API"})}),"\n",(0,d.jsxs)(n.p,{children:["Drand provides a JSON HTTP interface that clients can use to fetch randomness from each drand network running on nodes. If you're using drand in an application, it may be easier and\xa0",(0,d.jsx)(n.em,{children:"more secure"}),"\xa0to use one of the\xa0",(0,d.jsx)(n.a,{href:"3-3-dev-guide-client-libraries",children:(0,d.jsx)(n.strong,{children:"client libraries"})}),", which will also perform\xa0",(0,d.jsx)(n.em,{children:"verification"}),"\xa0of randomness rounds and add additional features like failover, racing, aggregation, and caching."]}),"\n",(0,d.jsxs)(n.p,{children:["All that's required is the address of the HTTP interface and way to fetch from HTTP, e.g.\xa0",(0,d.jsx)(n.code,{children:"curl"}),"."]}),"\n",(0,d.jsx)(n.h2,{id:"public-endpoints",children:(0,d.jsx)(n.strong,{children:"Public endpoints"})}),"\n",(0,d.jsxs)(n.p,{children:["The public\xa0",(0,d.jsx)(n.a,{href:"http://leagueofentropy.org",children:(0,d.jsx)(n.strong,{children:"League of Entropy"})})," HTTP APIs are available at:"]}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:["Protocol Labs","\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"https://api.drand.sh/"})})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"https://api2.drand.sh/"})})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"https://api3.drand.sh/"})})}),"\n"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["Cloudflare","\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"https://drand.cloudflare.com/"})})}),"\n"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["StorSwift","\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"https://api.drand.secureweb3.com:6875/"})})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,d.jsxs)(n.p,{children:["The League of Entropy currently runs two networks in mainnet:\xa0",(0,d.jsx)(n.code,{children:"default"}),"\xa0and\xa0",(0,d.jsx)(n.code,{children:"fastnet"}),". They are chained and unchained networks respectively, the details of which can be found in the\xa0",(0,d.jsx)(n.a,{href:"../concepts/2-1-concepts-cryptography",children:(0,d.jsx)(n.strong,{children:"cryptography specification"})}),"."]}),"\n",(0,d.jsxs)(n.p,{children:["The chain hash for the League of Entropy\xa0",(0,d.jsx)(n.code,{children:"default"}),"\xa0chain running at a 30s frequency in chained mode on Mainnet is:"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:"8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce\n"})}),"\n",(0,d.jsxs)(n.p,{children:["It also available at the default context, i.e. omitting the\xa0",(0,d.jsx)(n.code,{children:"/{chain-hash}"}),"\xa0in the API specification below."]}),"\n",(0,d.jsxs)(n.p,{children:["The chain hash for the League of Entropy\xa0",(0,d.jsx)(n.code,{children:"quicknet"}),"\xa0network running at a 3s frequency in unchained mode on Mainnet is:"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971\n"})}),"\n",(0,d.jsxs)(n.p,{children:["Note that\xa0",(0,d.jsxs)(n.a,{href:"https://drand.love/blog/2023/07/03/fastnet-sunset-quicknet-new/",children:["**the\xa0",(0,d.jsx)(n.code,{children:"fastnet"})]}),"\xa0",(0,d.jsx)(n.a,{href:"https://www.notion.so/fastnet-to-be-sunset-long-live-quicknet-5d125025752146b5bc307c834435d49e?pvs=21",children:"network has been deprecated."}),"**"]}),"\n",(0,d.jsx)(n.h3,{id:"testnet-endpoints",children:(0,d.jsx)(n.strong,{children:"Testnet endpoints"})}),"\n",(0,d.jsx)(n.p,{children:'Furthermore, we have "testnet endpoints" which are a completely separate environment for testing our latest changes, potentially helping you detect breaking changes or issues with our latest release before they hit mainnet. We recommend running your CI/CD against our testnet endpoints as well as our mainnet ones, in order to detect issues early.'}),"\n",(0,d.jsx)(n.p,{children:"We currently have three testnet HTTP(S) endpoints being run by:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:["Protocol Labs","\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"https://pl-us.testnet.drand.sh/chains",children:(0,d.jsx)(n.strong,{children:"https://pl-us.testnet.drand.sh/chains"})})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"https://pl-eu.testnet.drand.sh/chains",children:(0,d.jsx)(n.strong,{children:"https://pl-eu.testnet.drand.sh/chains"})})}),"\n"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["Cloudflare","\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"https://testnet-api.drand.cloudflare.com/chains",children:(0,d.jsx)(n.strong,{children:"https://testnet-api.drand.cloudflare.com/chains"})})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,d.jsxs)(n.p,{children:["As you can see, they are currently running various chains as explained below. We are committed to maintaining the\xa0",(0,d.jsx)(n.code,{children:"default"}),", G2 based, chained testnet chain (",(0,d.jsx)(n.code,{children:"84b2234fb34e835dccd048255d7ad3194b81af7d978c3bf157e3469592ae4e02"}),") as well as the faster, G1 based, unchained\xa0",(0,d.jsx)(n.code,{children:"quicknet-t"}),"\xa0testnet chain (",(0,d.jsx)(n.code,{children:"cc9c398442737cbd141526600919edd69f1d6f9b4adb67e4d912fbc64341a9a5"}),") as long as we run the equivalent mainnet networks."]}),"\n",(0,d.jsxs)(n.p,{children:['Other testnet chains, such as our first "unchained" testnet (',(0,d.jsx)(n.code,{children:"7672797f548f3f4748ac4bf3352fc6c6b6468c9ad40ad456a397545c6e2df5bf"}),") or our first G1 based non-RFC compliant chain (",(0,d.jsx)(n.code,{children:"f3827d772c155f95a9fda8901ddd59591a082df5ac6efe3a479ddb1f5eeb202c"}),") may be deprecated in the future."]}),"\n",(0,d.jsx)(n.h2,{id:"chains",children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"/chains"})})}),"\n",(0,d.jsxs)(n.p,{children:["Retrieves the\xa0",(0,d.jsx)(n.em,{children:"chain hash"}),"\xa0of every running network a user can interact with. It returns a JSON object with the following structure:"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:'[\n "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce",\n "859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce",\n "8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84",\n "515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"\n]\n'})}),"\n",(0,d.jsx)(n.h2,{id:"chain-hashinfo",children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"/{chain-hash}/info"})})}),"\n",(0,d.jsx)(n.p,{children:"Retrieves the randomness chain information. It returns a JSON object with the following structure:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:'{\n "public_key": "868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31",\n "period": 30,\n "genesis_time": 1595431050,\n "hash": "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce",\n "groupHash": "176f93498eac9ca337150b46d21dd58673ea4e3581185f869672e59fa4cb390a",\n "schemeID": "pedersen-bls-chained",\n "metadata": {\n "beaconID": "default"\n }\n}\n'})}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"public_key"}),"\xa0is the distributed public key of the drand group"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"period"}),"\xa0is the time in seconds between randomness beacon rounds"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"genesis_time"}),"\xa0is the time in seconds since the Unix Epoch that the group began generating randomness"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"hash"}),"\xa0is the\xa0",(0,d.jsx)(n.em,{children:"chain hash"}),", which uniquely identifies the drand chain. It is used as a root of trust for validation of the first round of randomness."]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"groupHash"}),"\xa0is the hash of a file containing the current set of nodes participating in the network. The group file is updated on every resharing."]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"schemeID"}),"\xa0is the name of the scheme this network uses. The scheme specifies the type of cryptography being used to generate the randomness beacons."]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"metadata"}),"\xa0contains some miscellaneous metadata about the network that is added to most packets during operation."]}),"\n"]}),"\n",(0,d.jsx)(n.h2,{id:"chain-hashpubliclatest",children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"/{chain-hash}/public/latest"})})}),"\n",(0,d.jsx)(n.p,{children:"Retrieves the latest round of randomness. It returns a JSON object with the following structure:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:'{\n "round": 367,\n "randomness": "3439d92d58e47d342131d446a3abe264396dd264717897af30525c98408c834f",\n "signature": "90957ebc0719f8bfb67640aff8ca219bf9f2c5240e60a8711c968d93370d38f87b38ed234a8c63863eb81f234efce55b047478848c0de025527b3d3476dfe860632c1b799550de50a6b9540463e9fb66c8016b89c04a9f52dabdc988e69463c1",\n "previous_signature": "859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"\n}\n'})}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"round"}),"\xa0is a monotonically increasing integer - the randomness round index"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"randomness"}),"\xa0is a SHA-256 hash of the signature"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"signature"}),"\xa0is the\xa0",(0,d.jsx)(n.em,{children:"Boneh-Lynn-Shacham"}),"\xa0(BLS) signature for this round of randomness"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"previous_signature"}),"\xa0is the signature of the previous round of randomness"]}),"\n"]}),"\n",(0,d.jsx)(n.h2,{id:"chain-hashpublicround",children:(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"/{chain-hash}/public/{round}"})})}),"\n",(0,d.jsxs)(n.p,{children:["Retrieves a previous round of randomness identified by the positive integer\xa0",(0,d.jsx)(n.code,{children:"round"}),". Note that specifying\xa0",(0,d.jsx)(n.code,{children:"0"}),"\xa0will retrieve the latest round. It returns a JSON object with the following structure:"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:'{\n "round": 367,\n "randomness": "3439d92d58e47d342131d446a3abe264396dd264717897af30525c98408c834f",\n "signature": "90957ebc0719f8bfb67640aff8ca219bf9f2c5240e60a8711c968d93370d38f87b38ed234a8c63863eb81f234efce55b047478848c0de025527b3d3476dfe860632c1b799550de50a6b9540463e9fb66c8016b89c04a9f52dabdc988e69463c1",\n "previous_signature": "859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"\n}\n'})}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"round"}),"\xa0is a sequentially increasing integer - the randomness round index"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"randomness"}),"\xa0is a SHA-256 hash of the signature"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"signature"}),"\xa0is the\xa0",(0,d.jsx)(n.em,{children:"Boneh-Lynn-Shacham"}),"\xa0(BLS) signature for this round of randomness"]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"previous_signature"}),"\xa0is the signature of the previous round of randomness (note: this will is omitted for\xa0",(0,d.jsx)(n.a,{href:"../concepts/2-1-concepts-cryptography#%EF%B8%8F-chained-and-unchained-modes",children:(0,d.jsx)(n.strong,{children:"unchained networks"})})]}),"\n"]}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Note"}),": For backwards-compatibility reasons, paths without\xa0",(0,d.jsx)(n.code,{children:"chain-hash"}),"\xa0will resort to the the default network in operation."]}),"\n",(0,d.jsx)(n.hr,{})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(o,{...e})}):o(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>r});var d=s(6540);const i={},t=d.createContext(i);function c(e){const n=d.useContext(t);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/72684690.1ef3b384.js b/site/assets/js/72684690.1ef3b384.js new file mode 100644 index 00000000..39d1fe0b --- /dev/null +++ b/site/assets/js/72684690.1ef3b384.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5719],{492:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>l,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var d=s(4848),i=s(8453);const r={id:"3-5-dev-guide-pubsub-network",title:"3.5 PubSub Network",description:"A list of public endpoints with usage instructions."},t="3.5 DevGuide: PubSub Network",o={id:"dev-guide/3-5-dev-guide-pubsub-network",title:"3.5 PubSub Network",description:"A list of public endpoints with usage instructions.",source:"@site/docs/03_dev-guide/03-05-DevGuide_PubSub_Network.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-5-dev-guide-pubsub-network",permalink:"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-05-DevGuide_PubSub_Network.md",tags:[],version:"current",frontMatter:{id:"3-5-dev-guide-pubsub-network",title:"3.5 PubSub Network",description:"A list of public endpoints with usage instructions."},sidebar:"docsSidebar",previous:{title:"3.4 HTTP API",permalink:"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api"},next:{title:"3.6 Code Examples",permalink:"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples"}},c={},u=[{value:"<strong>Public endpoints</strong>",id:"public-endpoints",level:2},{value:"<strong>Usage</strong>",id:"usage",level:2}];function a(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.header,{children:(0,d.jsx)(n.h1,{id:"35-devguide-pubsub-network",children:"3.5 DevGuide: PubSub Network"})}),"\n",(0,d.jsxs)(n.p,{children:["drand is able to publish randomness on a\xa0",(0,d.jsx)(n.a,{href:"https://libp2p.io/",children:(0,d.jsx)(n.strong,{children:"libp2p"})})," PubSub network using the\xa0",(0,d.jsx)(n.a,{href:"https://docs.libp2p.io/concepts/publish-subscribe/",children:(0,d.jsx)(n.strong,{children:"gossipsub protocol"})}),"\xa0, using what is known as a\xa0",(0,d.jsx)(n.em,{children:"gossip relay"}),"."]}),"\n",(0,d.jsx)(n.h2,{id:"public-endpoints",children:(0,d.jsx)(n.strong,{children:"Public endpoints"})}),"\n",(0,d.jsxs)(n.p,{children:["The public\xa0",(0,d.jsx)(n.a,{href:"https://blog.cloudflare.com/league-of-entropy/",children:(0,d.jsx)(n.strong,{children:"League Of Entropy"})}),"\xa0network provides the following 1st-tier gossip relays (all existing gossip relays will form a mesh to distribute randomness around):"]}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"/dnsaddr/api.drand.sh"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"/dnsaddr/api2.drand.sh"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"/dnsaddr/api3.drand.sh"})}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"The pubsub topic on which randomness is published is based to the drand's chain hash as follows:"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:"/drand/pubsub/v0.0.0/<chain_hash>\n"})}),"\n",(0,d.jsxs)(n.p,{children:["for the public network being\xa0",(0,d.jsx)(n.code,{children:"/drand/pubsub/v0.0.0/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce"}),"."]}),"\n",(0,d.jsx)(n.h2,{id:"usage",children:(0,d.jsx)(n.strong,{children:"Usage"})}),"\n",(0,d.jsxs)(n.p,{children:["The published messages are encoded protobufs of type\xa0",(0,d.jsxs)(n.a,{href:"https://github.com/drand/drand/blob/799190bff8e1a2ce46dccfcf4e7f7d75075495b2/protobuf/drand/api.proto#L42-L53",children:[(0,d.jsx)(n.strong,{children:(0,d.jsx)(n.code,{children:"PublicRandResponse"})}),"(RandResponse)"]}),"."]}),"\n",(0,d.jsxs)(n.p,{children:["In order to receive randomness using this method you will need to run an application that creates a libp2p host that can connect to a pubsub relay and subscribe to the PubSub topic. We recommend using drand's\xa0",(0,d.jsx)(n.a,{href:"3-3-dev-guide-client-libraries",children:(0,d.jsx)(n.strong,{children:"client libraries"})}),"\xa0or the\xa0",(0,d.jsx)(n.a,{href:"3-2-dev-guide-drand-client-cli",children:(0,d.jsx)(n.strong,{children:"drand-client"})}),"\xa0tool, which automatically perform\xa0",(0,d.jsx)(n.em,{children:"verification"}),"\xa0for this task."]}),"\n",(0,d.jsxs)(n.p,{children:["As a side note, IPFS can be used to subscribe to PubSub topics (running with\xa0",(0,d.jsx)(n.code,{children:"ipfs daemon --enable-pubsub-experiment"}),"):"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-jsx",children:"ipfs swarm connect /dnsaddr/api.drand.sh\nipfs pubsub sub /drand/pubsub/v0.0.0/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce\n"})}),"\n",(0,d.jsx)("aside",{children:(0,d.jsx)(n.p,{children:"\u2139\ufe0f NOTE: You will only see raw protobuf as the output."})}),"\n",(0,d.jsx)(n.hr,{})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>o});var d=s(6540);const i={},r=d.createContext(i);function t(e){const n=d.useContext(r);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),d.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/73664a40.dd711b8c.js b/site/assets/js/73664a40.dd711b8c.js new file mode 100644 index 00000000..aedc17cb --- /dev/null +++ b/site/assets/js/73664a40.dd711b8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1972],{9581:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>m,contentTitle:()=>r,default:()=>a,frontMatter:()=>n,metadata:()=>u,toc:()=>l});var t=i(4848),o=i(8453);const n={slug:"long-blog-post",title:"Long Blog Post",authors:"yangshun",tags:["hello","docusaurus"]},r=void 0,u={permalink:"/drand-docs/blog/long-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-29-long-blog-post.md",source:"@site/blog/2019-05-29-long-blog-post.md",title:"Long Blog Post",description:"This is the summary of a very long blog post,",date:"2019-05-29T00:00:00.000Z",tags:[{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:2.06,hasTruncateMarker:!0,authors:[{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"long-blog-post",title:"Long Blog Post",authors:"yangshun",tags:["hello","docusaurus"]},unlisted:!1,prevItem:{title:"MDX Blog Post",permalink:"/drand-docs/blog/mdx-blog-post"},nextItem:{title:"First Blog Post",permalink:"/drand-docs/blog/first-blog-post"}},m={authorsImageUrls:[void 0]},l=[];function c(e){const s={code:"code",p:"p",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.p,{children:"This is the summary of a very long blog post,"}),"\n",(0,t.jsxs)(s.p,{children:["Use a ",(0,t.jsx)(s.code,{children:"\x3c!--"})," ",(0,t.jsx)(s.code,{children:"truncate"})," ",(0,t.jsx)(s.code,{children:"--\x3e"})," comment to limit blog post size in the list view."]}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}),"\n",(0,t.jsx)(s.p,{children:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"})]})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>u});var t=i(6540);const o={},n=t.createContext(o);function r(e){const s=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function u(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/7661071f.8296746d.js b/site/assets/js/7661071f.8296746d.js new file mode 100644 index 00000000..9dc4e9c9 --- /dev/null +++ b/site/assets/js/7661071f.8296746d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8737],{4137:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var n=o(4848),s=o(8453);const r={slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},a=void 0,i={permalink:"/drand-docs/blog/welcome",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-26-welcome/index.md",source:"@site/blog/2021-08-26-welcome/index.md",title:"Welcome",description:"Docusaurus blogging features are powered by the blog plugin.",date:"2021-08-26T00:00:00.000Z",tags:[{inline:!1,label:"Facebook",permalink:"/drand-docs/blog/tags/facebook",description:"Facebook tag description"},{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.465,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"},{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},unlisted:!1,prevItem:{title:"Greetings!",permalink:"/drand-docs/blog/drand-greetings"},nextItem:{title:"MDX Blog Post",permalink:"/drand-docs/blog/mdx-blog-post"}},l={authorsImageUrls:[void 0,void 0]},c=[];function u(e){const t={a:"a",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://docusaurus.io/docs/blog",children:"Docusaurus blogging features"})," are powered by the ",(0,n.jsx)(t.a,{href:"https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog",children:"blog plugin"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Here are a few tips you might find useful."})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>i});var n=o(6540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/78fc3e97.fbff7af8.js b/site/assets/js/78fc3e97.fbff7af8.js new file mode 100644 index 00000000..0f861e84 --- /dev/null +++ b/site/assets/js/78fc3e97.fbff7af8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3179],{3763:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>c});var r=d(4848),i=d(8453);const t={id:"3-2-dev-guide-drand-client-cli",title:"3.2 drand-client CLI",description:"Instructions for installation and use of the drand client CLI."},a="3.2 DevGuide: drand-client CLI",s={id:"dev-guide/3-2-dev-guide-drand-client-cli",title:"3.2 drand-client CLI",description:"Instructions for installation and use of the drand client CLI.",source:"@site/docs/03_dev-guide/03-02-DevGuide_drand-client_CLI.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-2-dev-guide-drand-client-cli",permalink:"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-02-DevGuide_drand-client_CLI.md",tags:[],version:"current",frontMatter:{id:"3-2-dev-guide-drand-client-cli",title:"3.2 drand-client CLI",description:"Instructions for installation and use of the drand client CLI."},sidebar:"docsSidebar",previous:{title:"3.1 DevGuide: Organization",permalink:"/drand-docs/docs/dev-guide/3-1-dev-guide-organization"},next:{title:"3.3 Client Libraries",permalink:"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries"}},o={},c=[{value:"<strong>From Source</strong>",id:"from-source",level:2},{value:"<strong>From Docker</strong>",id:"from-docker",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"32-devguide-drand-client-cli",children:"3.2 DevGuide: drand-client CLI"})}),"\n",(0,r.jsxs)(n.p,{children:["The\xa0",(0,r.jsx)(n.code,{children:"drand-client"}),"\xa0command-line interface application can be used to fetch randomness from a drand network. It is a CLI frontend for the\xa0",(0,r.jsx)(n.a,{href:"3-3-dev-guide-client-libraries",children:(0,r.jsx)(n.strong,{children:"drand client libraries"})}),"."]}),"\n",(0,r.jsx)(n.h1,{id:"installation",children:(0,r.jsx)(n.strong,{children:"Installation"})}),"\n",(0,r.jsx)(n.h2,{id:"from-source",children:(0,r.jsx)(n.strong,{children:"From Source"})}),"\n",(0,r.jsxs)(n.p,{children:["This will require a working\xa0",(0,r.jsx)(n.a,{href:"https://golang.org/doc/install",children:(0,r.jsx)(n.strong,{children:"Golang installation"})}),". You'll also need the\xa0",(0,r.jsx)(n.code,{children:"make"}),"\xa0command available."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"git clone https://github.com/drand/drand\ncd drand\nmake drand-client\n"})}),"\n",(0,r.jsx)(n.h2,{id:"from-docker",children:(0,r.jsx)(n.strong,{children:"From Docker"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"docker run drandorg/drand-client\n"})}),"\n",(0,r.jsx)(n.h1,{id:"usage",children:(0,r.jsx)(n.strong,{children:"Usage"})}),"\n",(0,r.jsxs)(n.p,{children:["Run\xa0",(0,r.jsx)(n.code,{children:"drand-client --help"}),"\xa0for a list of supported options."]}),"\n",(0,r.jsxs)(n.p,{children:["As an example, here is how to launch the client in order to read randomness for the current ",(0,r.jsx)(n.a,{href:"https://leagueofentropy.org",children:"League of Entropy"})," mainnet endpoints with automatic verification, failover and fastest-endpoint optimizations:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-jsx",children:"drand-client --watch \\\n--chain-hash 8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce \\\n--url http://api.drand.sh \\\n--url http://api2.drand.sh \\\n--url http://api3.drand.sh \\\n--url https://drand.cloudflare.com \\\n--relay /dnsaddr/api.drand.sh \\\n--relay /dnsaddr/api2.drand.sh \\\n--relay /dnsaddr/api3.drand.sh\n"})}),"\n",(0,r.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,d)=>{d.d(n,{R:()=>a,x:()=>s});var r=d(6540);const i={},t=r.createContext(i);function a(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/7c330c58.6719f53a.js b/site/assets/js/7c330c58.6719f53a.js new file mode 100644 index 00000000..fa5f1640 --- /dev/null +++ b/site/assets/js/7c330c58.6719f53a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2339],{1008:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>a});var n=s(4848),i=s(8453);const r={id:"4-4-ops-guide-metrics-guide",title:"4.4 Metrics Guide",description:"Describes Prometheus instrumentation exposed by drand nodes."},d="4.4 DevOps: Metrics Guide",o={id:"ops-guide/4-4-ops-guide-metrics-guide",title:"4.4 Metrics Guide",description:"Describes Prometheus instrumentation exposed by drand nodes.",source:"@site/docs/04_ops-guide/04-04-DevOps_Metrics_Guide.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-4-ops-guide-metrics-guide",permalink:"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-04-DevOps_Metrics_Guide.md",tags:[],version:"current",frontMatter:{id:"4-4-ops-guide-metrics-guide",title:"4.4 Metrics Guide",description:"Describes Prometheus instrumentation exposed by drand nodes."},sidebar:"docsSidebar",previous:{title:"4.3 Storage Backends",permalink:"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends"},next:{title:"4.5 Command-line Tools",permalink:"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools"}},c={},a=[{value:"<strong>Local Metrics</strong>",id:"local-metrics",level:2},{value:"<strong>Shared Group Metrics</strong>",id:"shared-group-metrics",level:2},{value:"<strong>Client Metrics</strong>",id:"client-metrics",level:2}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"44-devops-metrics-guide",children:"4.4 DevOps: Metrics Guide"})}),"\n",(0,n.jsxs)(t.p,{children:["Drand uses\xa0",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"}),"\xa0instrumentation for helping operators monitor and understand the runtime behavior of system."]}),"\n",(0,n.jsx)(t.h2,{id:"local-metrics",children:(0,n.jsx)(t.strong,{children:"Local Metrics"})}),"\n",(0,n.jsxs)(t.p,{children:["The local drand node exposes metrics on an HTTP server listening as specified by the\xa0",(0,n.jsx)(t.code,{children:"--metrics"}),"\xa0command line flag. You can view the reported metrics in a browser at\xa0",(0,n.jsx)(t.code,{children:"http://localhost:<metrics port>/metrics"}),". This page includes"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The default Golang process metrics collected by Prometheus"}),"\n",(0,n.jsx)(t.li,{children:"Statistics on the drand beacon and group behavior"}),"\n",(0,n.jsx)(t.li,{children:"Statistics on the HTTP public listener request load if enabled."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"shared-group-metrics",children:(0,n.jsx)(t.strong,{children:"Shared Group Metrics"})}),"\n",(0,n.jsxs)(t.p,{children:["In addition to the metrics collected within the local node, the drand GRPC group protocol supports re-export and sharing of group metrics between group members. When a local metrics port is specified, metrics shared by other group members can be accessed at\xa0",(0,n.jsx)(t.code,{children:"http://localhost:<metrics port>/peer/<peer address>/metrics"}),". This will only include the drand beacon statistics shared by the remote peer, and does not include the process or internal health of the node. It is meant to allow better visibility when debugging network issues, and helping operators understand where problems originate."]}),"\n",(0,n.jsx)(t.h2,{id:"client-metrics",children:(0,n.jsx)(t.strong,{children:"Client Metrics"})}),"\n",(0,n.jsx)(t.p,{children:"The drand client is capable of collecting metrics on the health of the sources of randomness that it is connected to."}),"\n",(0,n.jsx)(t.p,{children:'For each HTTP endpoint, every 10 seconds, the client sends "heartbeat" requests for the "current" randomness, wherein the requested "current" randomness round is calculated based on the current time and the genesis time of the drand network. The outcomes of these requests are used to generate the following metrics:'}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.em,{children:"Heartbeat latency"}),": This is the duration, in milliseconds, between the time when the randomness response was received and the time when it was meant to be produced by the drand nodes (based on the genesis time of the network and the round number). The corresponding Prometheus metric is the gauge\xa0",(0,n.jsx)(t.code,{children:"client_http_heartbeat_latency"}),". In normal conditions, when the network latency is sub-second, one expects the heartbeat latency to be roughly evenly distributed between 0 and 30 seconds. This is caused by the fact that there are multiple heartbeats during a single round, which lasts 30 seconds, as well as the fact that each request blocks until the randomness becomes available. This metric is implemented in [",(0,n.jsx)(t.a,{href:"https://github.com/drand/drand/blob/master/client/http/metric.go#L59",children:"https://github.com/drand/drand/blob/master/client/http/metric.go#L59"}),"]."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.em,{children:"Heartbeat success and failure"}),': These are two counters, "success" and "failure", whose Prometheus names are\xa0',(0,n.jsx)(t.code,{children:"client_http_heartbeat_success"}),"\xa0and\xa0",(0,n.jsx)(t.code,{children:"client_http_heartbeat_latency"}),". The success counter is increments after an HTTP request returns a successful response HTTP, otherwise the the failure counter is incremented. This metric is implemented in [",(0,n.jsx)(t.a,{href:"https://github.com/drand/drand/blob/master/client/http/metric.go#L50",children:"https://github.com/drand/drand/blob/master/client/http/metric.go#L50"}),"]."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"In addition, the client maintains a metric on its watch channel for randomness. This channel pushes latest randomness to the client as soon as it is available. The channel is implemented either by connecting to a gossip relay or by polling HTTP endpoints, if a relay is not specified. The relevant metric is:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.em,{children:"Watch latency"}),": This is a Prometheus gauge measuring the duration between when a randomness round was received by the client and the time when it was produced by the drand nodes (as calculated based on round number and genesis time). The metric is implemented in [",(0,n.jsx)(t.a,{href:"https://github.com/drand/drand/blob/master/client/metric.go#L37",children:"https://github.com/drand/drand/blob/master/client/metric.go#L37"}),"]."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"All of the above measurements have two significant labels:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["The label\xa0",(0,n.jsx)(t.code,{children:"http_address"}),"\xa0identifies the HTTP endpoint that is being queried by the client,"]}),"\n",(0,n.jsxs)(t.li,{children:["The label\xa0",(0,n.jsx)(t.code,{children:"client_id"}),"\xa0identifies the client itself."]}),"\n"]}),"\n",(0,n.jsx)(t.hr,{})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>o});var n=s(6540);const i={},r=n.createContext(i);function d(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/814f3328.3e3fb0dc.js b/site/assets/js/814f3328.3e3fb0dc.js new file mode 100644 index 00000000..c00fdfbe --- /dev/null +++ b/site/assets/js/814f3328.3e3fb0dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Greetings!","permalink":"/drand-docs/blog/drand-greetings","unlisted":false,"date":"2024-08-19T00:00:00.000Z"},{"title":"Welcome","permalink":"/drand-docs/blog/welcome","unlisted":false,"date":"2021-08-26T00:00:00.000Z"},{"title":"MDX Blog Post","permalink":"/drand-docs/blog/mdx-blog-post","unlisted":false,"date":"2021-08-01T00:00:00.000Z"},{"title":"Long Blog Post","permalink":"/drand-docs/blog/long-blog-post","unlisted":false,"date":"2019-05-29T00:00:00.000Z"},{"title":"First Blog Post","permalink":"/drand-docs/blog/first-blog-post","unlisted":false,"date":"2019-05-28T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/site/assets/js/8717b14a.e86499f8.js b/site/assets/js/8717b14a.e86499f8.js new file mode 100644 index 00000000..dc41f123 --- /dev/null +++ b/site/assets/js/8717b14a.e86499f8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3694],{1615:(t,o,n)=>{n.r(o),n.d(o,{assets:()=>i,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>a,toc:()=>c});var e=n(4848),s=n(8453);const l={slug:"long-blog-post",title:"Long Blog Post",authors:"yangshun",tags:["hello","docusaurus"]},r=void 0,a={permalink:"/drand-docs/blog/long-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-29-long-blog-post.md",source:"@site/blog/2019-05-29-long-blog-post.md",title:"Long Blog Post",description:"This is the summary of a very long blog post,",date:"2019-05-29T00:00:00.000Z",tags:[{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:2.06,hasTruncateMarker:!0,authors:[{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"long-blog-post",title:"Long Blog Post",authors:"yangshun",tags:["hello","docusaurus"]},unlisted:!1,prevItem:{title:"MDX Blog Post",permalink:"/drand-docs/blog/mdx-blog-post"},nextItem:{title:"First Blog Post",permalink:"/drand-docs/blog/first-blog-post"}},i={authorsImageUrls:[void 0]},c=[];function d(t){const o={code:"code",p:"p",...(0,s.R)(),...t.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(o.p,{children:"This is the summary of a very long blog post,"}),"\n",(0,e.jsxs)(o.p,{children:["Use a ",(0,e.jsx)(o.code,{children:"\x3c!--"})," ",(0,e.jsx)(o.code,{children:"truncate"})," ",(0,e.jsx)(o.code,{children:"--\x3e"})," comment to limit blog post size in the list view."]})]})}function u(t={}){const{wrapper:o}={...(0,s.R)(),...t.components};return o?(0,e.jsx)(o,{...t,children:(0,e.jsx)(d,{...t})}):d(t)}},8453:(t,o,n)=>{n.d(o,{R:()=>r,x:()=>a});var e=n(6540);const s={},l=e.createContext(s);function r(t){const o=e.useContext(l);return e.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function a(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),e.createElement(l.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/8806b065.250ece8d.js b/site/assets/js/8806b065.250ece8d.js new file mode 100644 index 00000000..6569e3f3 --- /dev/null +++ b/site/assets/js/8806b065.250ece8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1800],{3692:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"4.0 OPERATORS GUIDE","description":"A guide for drand node operators.","slug":"/category/40-operators-guide","permalink":"/drand-docs/docs/category/40-operators-guide","sidebar":"docsSidebar","navigation":{"previous":{"title":"3.6 Code Examples","permalink":"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples"},"next":{"title":"4.0 OPERATORS GUIDE","permalink":"/drand-docs/docs/ops-guide/4-0-ops-guide"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/8f578ac3.0fd7b2ea.js b/site/assets/js/8f578ac3.0fd7b2ea.js new file mode 100644 index 00000000..8c502447 --- /dev/null +++ b/site/assets/js/8f578ac3.0fd7b2ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[6574],{8915:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"3.0 DEVELOPERS GUIDE","description":"Help for developers who wish to use drand.","slug":"/category/30-developers-guide","permalink":"/drand-docs/docs/category/30-developers-guide","sidebar":"docsSidebar","navigation":{"previous":{"title":"2.4 Timelock Encryption","permalink":"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption"},"next":{"title":"3.0 Developers Guide","permalink":"/drand-docs/docs/dev-guide/3-0-dev-guide"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/91f57a82.b0048d22.js b/site/assets/js/91f57a82.b0048d22.js new file mode 100644 index 00000000..fbea3527 --- /dev/null +++ b/site/assets/js/91f57a82.b0048d22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9676],{6195:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var i=d(4848),s=d(8453);const r={id:"3-0-dev-guide",title:"3.0 Developers Guide",description:"Help for developers who wish to use drand."},t="3.0 DEVELOPERS GUIDE",o={id:"dev-guide/3-0-dev-guide",title:"3.0 Developers Guide",description:"Help for developers who wish to use drand.",source:"@site/docs/03_dev-guide/03-00-DEVELOPERS_GUIDE.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-0-dev-guide",permalink:"/drand-docs/docs/dev-guide/3-0-dev-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-00-DEVELOPERS_GUIDE.md",tags:[],version:"current",frontMatter:{id:"3-0-dev-guide",title:"3.0 Developers Guide",description:"Help for developers who wish to use drand."},sidebar:"docsSidebar",previous:{title:"3.0 DEVELOPERS GUIDE",permalink:"/drand-docs/docs/category/30-developers-guide"},next:{title:"3.1 DevGuide: Organization",permalink:"/drand-docs/docs/dev-guide/3-1-dev-guide-organization"}},l={},c=[];function a(e){const n={a:"a",code:"code",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"30-developers-guide",children:"3.0 DEVELOPERS GUIDE"})}),"\n",(0,i.jsx)(n.p,{children:"This section helps developers build applications that use drand as a source of randomness. For help running your own drand network, see the\xa0guides under \u201cFor Operators\u201d on the main menu of the site."}),"\n",(0,i.jsxs)(n.p,{children:["The current public ",(0,i.jsx)(n.a,{href:"https://leagueofentropy.org",children:"League of Entropy"})," drand mainnet API endpoints are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"https://api.drand.sh"}),"\xa0(HTTPS endpoint, also available over HTTP)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"https://api2.drand.sh"}),"\xa0(HTTPS endpoint, also available over HTTP)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"https://api3.drand.sh"}),"\xa0(HTTPS endpoint, also available over HTTP)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"https://drand.cloudflare.com"}),"\xa0(HTTPS endpoint)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"https://api.drand.secureweb3.com:6875"}),"\xa0(HTTPS endpoint)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"/dnsaddr/api.drand.sh"}),"\xa0(1st-level libp2p gossipsub relay endpoint)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"/dnsaddr/api2.drand.sh"}),"\xa0(1st-level libp2p gossipsub relay endpoint)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"/dnsaddr/api3.drand.sh"}),"\xa0(1st-level libp2p gossipsub relay endpoint)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are two networks on mainnet:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"default"}),"\xa0which is running the chained scheme with public keys on G1"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"quicknet"}),"\xa0which is running the unchained scheme with public keys on G2"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"default"}),"\xa0network chain hash:\xa0",(0,i.jsx)(n.code,{children:"8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"quicknet"}),"\xa0network chain hash:\xa0",(0,i.jsx)(n.code,{children:"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"})]}),"\n",(0,i.jsx)("aside",{children:(0,i.jsxs)(n.p,{children:["\u26a0\ufe0f Note that\xa0",(0,i.jsxs)(n.a,{href:"https://drand.love/blog/2023/07/03/fastnet-sunset-quicknet-new/",children:["**the\xa0",(0,i.jsx)(n.code,{children:"fastnet"})]}),"\xa0",(0,i.jsx)(n.a,{href:"https://www.notion.so/fastnet-to-be-sunset-long-live-quicknet-5d125025752146b5bc307c834435d49e?pvs=21",children:"network has been deprecated"}),".**"]})}),"\n",(0,i.jsxs)(n.p,{children:["In order to retrieve randomness from a drand network you should\xa0",(0,i.jsxs)(n.strong,{children:["preferentially use the\xa0",(0,i.jsx)(n.a,{href:"3-3-dev-guide-client-libraries",children:"drand client libraries"}),"\xa0or the\xa0",(0,i.jsx)(n.a,{href:"3-2-dev-guide-drand-client-cli",children:"drand-client CLI"})]}),", which support the different mechanisms and perform verification for every value obtained."]}),"\n",(0,i.jsx)(n.p,{children:"Alternatively, you can interact directly with the endpoints. Make sure to manually verify every value:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"3-4-dev-guide-http-api",children:(0,i.jsx)(n.strong,{children:"HTTP API reference"})})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"3-5-dev-guide-pubsub-network",children:"PubSub-based randomness distribution"})}),"\n",(0,i.jsxs)(n.li,{children:["gRPC API: usually not publicly accessible. A gRPC API is supported by the drand client libraries, the\xa0",(0,i.jsx)(n.code,{children:"drand-client"}),"\xa0CLI application and the\xa0",(0,i.jsx)(n.a,{href:"../ops-guide/4-5-ops-guide-command-line-tools",children:(0,i.jsx)(n.strong,{children:"drand application"})}),"\xa0itself (using\xa0",(0,i.jsx)(n.code,{children:"drand get public"}),")."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Finally, for development purposes, we recommend also testing your code against our Testnet endpoints. See\xa0",(0,i.jsx)(n.a,{href:"3-4-dev-guide-http-api",children:(0,i.jsx)(n.strong,{children:"our dedicated documentation entry about testnet endpoints"})}),"."]}),"\n",(0,i.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,n,d)=>{d.d(n,{R:()=>t,x:()=>o});var i=d(6540);const s={},r=i.createContext(s);function t(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/925b3f96.c4b155f0.js b/site/assets/js/925b3f96.c4b155f0.js new file mode 100644 index 00000000..3569f6c1 --- /dev/null +++ b/site/assets/js/925b3f96.c4b155f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8609],{5026:(t,o,s)=>{s.r(o),s.d(o,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>u});var e=s(4848),n=s(8453);const r={slug:"first-blog-post",title:"First Blog Post",authors:["slorber","yangshun"],tags:["hola","docusaurus"]},a=void 0,i={permalink:"/drand-docs/blog/first-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-28-first-blog-post.md",source:"@site/blog/2019-05-28-first-blog-post.md",title:"First Blog Post",description:"Lorem ipsum dolor sit amet...",date:"2019-05-28T00:00:00.000Z",tags:[{inline:!1,label:"Hola",permalink:"/drand-docs/blog/tags/hola",description:"Hola tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.135,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"},{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"first-blog-post",title:"First Blog Post",authors:["slorber","yangshun"],tags:["hola","docusaurus"]},unlisted:!1,prevItem:{title:"Long Blog Post",permalink:"/drand-docs/blog/long-blog-post"}},l={authorsImageUrls:[void 0,void 0]},u=[];function c(t){const o={p:"p",...(0,n.R)(),...t.components};return(0,e.jsx)(o.p,{children:"Lorem ipsum dolor sit amet..."})}function d(t={}){const{wrapper:o}={...(0,n.R)(),...t.components};return o?(0,e.jsx)(o,{...t,children:(0,e.jsx)(c,{...t})}):c(t)}},8453:(t,o,s)=>{s.d(o,{R:()=>a,x:()=>i});var e=s(6540);const n={},r=e.createContext(n);function a(t){const o=e.useContext(r);return e.useMemo((function(){return"function"==typeof t?t(o):{...o,...t}}),[o,t])}function i(t){let o;return o=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:a(t.components),e.createElement(r.Provider,{value:o},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/93a0da4a.3efb7f73.js b/site/assets/js/93a0da4a.3efb7f73.js new file mode 100644 index 00000000..db6b797b --- /dev/null +++ b/site/assets/js/93a0da4a.3efb7f73.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2964],{8702:o=>{o.exports=JSON.parse('{"tags":[{"label":"Hello","permalink":"/drand-docs/blog/tags/hello","description":"Hello tag description","count":3},{"label":"Facebook","permalink":"/drand-docs/blog/tags/facebook","description":"Facebook tag description","count":1},{"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description","count":4},{"label":"Hola","permalink":"/drand-docs/blog/tags/hola","description":"Hola tag description","count":1}]}')}}]); \ No newline at end of file diff --git a/site/assets/js/9c3d38a1.9dbcf339.js b/site/assets/js/9c3d38a1.9dbcf339.js new file mode 100644 index 00000000..b4290b78 --- /dev/null +++ b/site/assets/js/9c3d38a1.9dbcf339.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5081],{1586:(e,d,t)=>{t.r(d),t.d(d,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var n=t(4848),o=t(8453);const s={id:"3-6-dev-guide-code-examples",title:"3.6 Code Examples",description:"Examples of how to integrate drand in various coding languages."},i="3.6 DevGuide: Code Examples",r={id:"dev-guide/3-6-dev-guide-code-examples",title:"3.6 Code Examples",description:"Examples of how to integrate drand in various coding languages.",source:"@site/docs/03_dev-guide/03-06-DevGuide_Code_Examples.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-6-dev-guide-code-examples",permalink:"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-06-DevGuide_Code_Examples.md",tags:[],version:"current",frontMatter:{id:"3-6-dev-guide-code-examples",title:"3.6 Code Examples",description:"Examples of how to integrate drand in various coding languages."},sidebar:"docsSidebar",previous:{title:"3.5 PubSub Network",permalink:"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network"},next:{title:"4.0 OPERATORS GUIDE",permalink:"/drand-docs/docs/category/40-operators-guide"}},a={},c=[];function u(e){const d={h1:"h1",header:"header",hr:"hr",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.header,{children:(0,n.jsx)(d.h1,{id:"36-devguide-code-examples",children:"3.6 DevGuide: Code Examples"})}),"\n",(0,n.jsx)(d.p,{children:"[Note: Currently a stub. Fill this up!]"}),"\n",(0,n.jsx)(d.p,{children:"<Practical code snippets/links to repositories that allow users to demonstrate how to implement and use the service in various environments.>"}),"\n",(0,n.jsx)(d.hr,{})]})}function l(e={}){const{wrapper:d}={...(0,o.R)(),...e.components};return d?(0,n.jsx)(d,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,d,t)=>{t.d(d,{R:()=>i,x:()=>r});var n=t(6540);const o={},s=n.createContext(o);function i(e){const d=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function r(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/9e4087bc.e31a38f4.js b/site/assets/js/9e4087bc.e31a38f4.js new file mode 100644 index 00000000..6bc99350 --- /dev/null +++ b/site/assets/js/9e4087bc.e31a38f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),n=t(1312),s=t(1213),i=t(6266),c=t(781),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(4586);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/site/assets/js/a6aa9e1f.9e397cf8.js b/site/assets/js/a6aa9e1f.9e397cf8.js new file mode 100644 index 00000000..9d87ae9e --- /dev/null +++ b/site/assets/js/a6aa9e1f.9e397cf8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[7643],{5124:(e,t,a)=>{a.r(t),a.d(t,{default:()=>j});a(6540);var s=a(4164),n=a(4586),r=a(1213),i=a(7559),l=a(8027),o=a(7713),c=a(1463),d=a(3892),m=a(5260),g=a(4096),u=a(4848);function h(e){const t=(0,g.kJ)(e);return(0,u.jsx)(m.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,n.A)(),{blogDescription:s,blogTitle:i,permalink:l}=t,o="/"===l?a:i;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:o,description:s}),(0,u.jsx)(c.A,{tag:"blog_posts_list"})]})}function x(e){const{metadata:t,items:a,sidebar:s}=e;return(0,u.jsxs)(l.A,{sidebar:s,children:[(0,u.jsx)(d.A,{items:a}),(0,u.jsx)(o.A,{metadata:t})]})}function j(e){return(0,u.jsxs)(r.e3,{className:(0,s.A)(i.G.wrapper.blogPages,i.G.page.blogListPage),children:[(0,u.jsx)(p,{...e}),(0,u.jsx)(h,{...e}),(0,u.jsx)(x,{...e})]})}},7713:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(1312),n=a(9022),r=a(4848);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(n.A,{permalink:a,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),i&&(0,r.jsx)(n.A,{permalink:i,title:(0,r.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},2907:(e,t,a)=>{a.d(t,{A:()=>C});a(6540);var s=a(4164),n=a(4096),r=a(4848);function i(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var l=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:i}=(0,n.e7)(),{permalink:c,title:d}=a,m=i?"h1":"h2";return(0,r.jsx)(m,{className:(0,s.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=a(1312),m=a(5846),g=a(6266);const u={container:"container_mt6G"};function h(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function p(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:a}=(0,n.e7)(),{date:i,readingTime:l}=a,o=(0,g.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(u.container,"margin-vert--md",t),children:[(0,r.jsx)(p,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(h,{readingTime:l})]})]});var c}var A=a(6913);const b={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function f(e){let{className:t}=e;const{metadata:{authors:a},assets:i}=(0,n.e7)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?b.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!l&&(o?"col col--12":"col col--6"),l?b.imageOnlyAuthorCol:b.authorCol),children:(0,r.jsx)(A.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function v(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(j,{}),(0,r.jsx)(f,{})]})}var N=a(440),T=a(5533);function w(e){let{children:t,className:a}=e;const{isBlogPostPage:i}=(0,n.e7)();return(0,r.jsx)("div",{id:i?N.LU:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(T.A,{children:t})})}var y=a(7559),k=a(4336),P=a(2053);function U(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function _(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(U,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,n.e7)(),{tags:a,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,g=a.length>0;if(!(g||m||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",y.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(P.A,{tags:a})})}),e&&(0,r.jsx)(k.A,{className:(0,s.A)("margin-top--sm",y.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[g&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,r.jsx)(P.A,{tags:a})}),m&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":g}),children:(0,r.jsx)(_,{blogPostTitle:i,to:e.permalink})})]})}function C(e){let{children:t,className:a}=e;const l=function(){const{isBlogPostPage:e}=(0,n.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,s.A)(l,a),children:[(0,r.jsx)(v,{}),(0,r.jsx)(w,{children:t}),(0,r.jsx)(R,{})]})}},3892:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4096),n=a(2907),r=a(4848);function i(e){let{items:t,component:a=n.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(s.in,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/site/assets/js/a7456010.cf5a56fa.js b/site/assets/js/a7456010.cf5a56fa.js new file mode 100644 index 00000000..a53e518d --- /dev/null +++ b/site/assets/js/a7456010.cf5a56fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1235],{8552:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/site/assets/js/a7bd4aaa.12039cfb.js b/site/assets/js/a7bd4aaa.12039cfb.js new file mode 100644 index 00000000..f998611d --- /dev/null +++ b/site/assets/js/a7bd4aaa.12039cfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[7098],{1723:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(6540);var r=s(1213);function o(n,e){return`docs-${n}-${e}`}var t=s(3025),c=s(2831),i=s(1463),d=s(4848);function a(n){const{version:e}=n;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,d.jsx)(r.be,{children:e.noIndex&&(0,d.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function u(n){const{version:e,route:s}=n;return(0,d.jsx)(r.e3,{className:e.className,children:(0,d.jsx)(t.n,{version:e,children:(0,c.v)(s.routes)})})}function l(n){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(a,{...n}),(0,d.jsx)(u,{...n})]})}}}]); \ No newline at end of file diff --git a/site/assets/js/a94703ab.7c376541.js b/site/assets/js/a94703ab.7c376541.js new file mode 100644 index 00000000..20e104f5 --- /dev/null +++ b/site/assets/js/a94703ab.7c376541.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9048],{1377:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(6972),r=n(609),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),v=n(3465);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("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"}),(0,b.jsx)("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 g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(9876);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.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,c.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,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"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/site/assets/js/aa23f094.0b225b8c.js b/site/assets/js/aa23f094.0b225b8c.js new file mode 100644 index 00000000..7f6dddfe --- /dev/null +++ b/site/assets/js/aa23f094.0b225b8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4093],{6944:t=>{t.exports=JSON.parse('{"author":{"name":"Kent Bull","title":"drand Community Manager","url":"https://kentbull.com","page":{"permalink":"/drand-docs/blog/authors/kentbull"},"socials":{"x":"https://x.com/kentopbull","github":"https://github.com/kentbull"},"imageURL":"https://avatars.githubusercontent.com/u/65027257?v=4","key":"kentbull","count":1},"listMetadata":{"permalink":"/drand-docs/blog/authors/kentbull","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/aa909e52.3a7aa99f.js b/site/assets/js/aa909e52.3a7aa99f.js new file mode 100644 index 00000000..3f2fb5f6 --- /dev/null +++ b/site/assets/js/aa909e52.3a7aa99f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3573],{4095:a=>{a.exports=JSON.parse('{"author":{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","page":{"permalink":"/drand-docs/blog/authors/yangshun"},"socials":{"x":"https://x.com/yangshunz","github":"https://github.com/yangshun"},"imageURL":"https://github.com/yangshun.png","key":"yangshun","count":3},"listMetadata":{"permalink":"/drand-docs/blog/authors/yangshun","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/ab32f63b.98faafc7.js b/site/assets/js/ab32f63b.98faafc7.js new file mode 100644 index 00000000..c8ab8eb1 --- /dev/null +++ b/site/assets/js/ab32f63b.98faafc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8082],{1106:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docsSidebar":[{"type":"link","label":"Home","href":"/drand-docs/docs/home","docId":"home","unlisted":false},{"type":"category","label":"1.0 About (What is \\"drand\\"?)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"1.0 About","href":"/drand-docs/docs/about/1-0-about","docId":"about/1-0-about","unlisted":false},{"type":"link","label":"1.1 Governance","href":"/drand-docs/docs/about/1-1-governance","docId":"about/1-1-governance","unlisted":false}],"href":"/drand-docs/docs/category/10-about-what-is-drand"},{"type":"category","label":"2.0 CONCEPTS (Getting Started)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"2.0 Concepts","href":"/drand-docs/docs/concepts/2-0-concepts","docId":"concepts/2-0-concepts","unlisted":false},{"type":"link","label":"2.1 Cryptography","href":"/drand-docs/docs/concepts/2-1-concepts-cryptography","docId":"concepts/2-1-concepts-cryptography","unlisted":false},{"type":"link","label":"2.2 Security Model","href":"/drand-docs/docs/concepts/2-2-concepts-security-model","docId":"concepts/2-2-concepts-security-model","unlisted":false},{"type":"link","label":"2.3 Specification","href":"/drand-docs/docs/concepts/2-3-concepts-specification","docId":"concepts/2-3-concepts-specification","unlisted":false},{"type":"link","label":"2.4 Timelock Encryption","href":"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption","docId":"concepts/2-4-concepts-timelock-encryption","unlisted":false}],"href":"/drand-docs/docs/category/20-concepts-getting-started"},{"type":"category","label":"3.0 DEVELOPERS GUIDE","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.0 Developers Guide","href":"/drand-docs/docs/dev-guide/3-0-dev-guide","docId":"dev-guide/3-0-dev-guide","unlisted":false},{"type":"link","label":"3.1 DevGuide: Organization","href":"/drand-docs/docs/dev-guide/3-1-dev-guide-organization","docId":"dev-guide/3-1-dev-guide-organization","unlisted":false},{"type":"link","label":"3.2 drand-client CLI","href":"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli","docId":"dev-guide/3-2-dev-guide-drand-client-cli","unlisted":false},{"type":"link","label":"3.3 Client Libraries","href":"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries","docId":"dev-guide/3-3-dev-guide-client-libraries","unlisted":false},{"type":"link","label":"3.4 HTTP API","href":"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api","docId":"dev-guide/3-4-dev-guide-http-api","unlisted":false},{"type":"link","label":"3.5 PubSub Network","href":"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network","docId":"dev-guide/3-5-dev-guide-pubsub-network","unlisted":false},{"type":"link","label":"3.6 Code Examples","href":"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples","docId":"dev-guide/3-6-dev-guide-code-examples","unlisted":false}],"href":"/drand-docs/docs/category/30-developers-guide"},{"type":"category","label":"4.0 OPERATORS GUIDE","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"4.0 OPERATORS GUIDE","href":"/drand-docs/docs/ops-guide/4-0-ops-guide","docId":"ops-guide/4-0-ops-guide","unlisted":false},{"type":"link","label":"4.1 Deployment","href":"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment","docId":"ops-guide/4-1-ops-guide-deployment","unlisted":false},{"type":"link","label":"4.2 Docker Install","href":"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install","docId":"ops-guide/4-2-ops-guide-docker-install","unlisted":false},{"type":"link","label":"4.3 Storage Backends","href":"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends","docId":"ops-guide/4-3-ops-guide-storage-backends","unlisted":false},{"type":"link","label":"4.4 Metrics Guide","href":"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide","docId":"ops-guide/4-4-ops-guide-metrics-guide","unlisted":false},{"type":"link","label":"4.5 Command-line Tools","href":"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools","docId":"ops-guide/4-5-ops-guide-command-line-tools","unlisted":false}],"href":"/drand-docs/docs/category/40-operators-guide"},{"type":"category","label":"5.0 DRAND COMMUNITY","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"5.0 DRAND COMMUNITY","href":"/drand-docs/docs/drand-community/5-0-drand-community","docId":"drand-community/5-0-drand-community","unlisted":false},{"type":"link","label":"5.1 Contributing","href":"/drand-docs/docs/drand-community/5-1-drand-community-contributing","docId":"drand-community/5-1-drand-community-contributing","unlisted":false}],"href":"/drand-docs/docs/category/50-drand-community"},{"type":"category","label":"6.0 DRAND FAQ","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"6.0 DRAND FAQ","href":"/drand-docs/docs/drand-faq/6-0-drand-faq","docId":"drand-faq/6-0-drand-faq","unlisted":false}],"href":"/drand-docs/docs/category/60-drand-faq"}]},"docs":{"about/1-0-about":{"id":"about/1-0-about","title":"1.0 About","description":"What is drand?","sidebar":"docsSidebar"},"about/1-1-governance":{"id":"about/1-1-governance","title":"1.1 Governance","description":"Describes how project contributors conduct themselves.","sidebar":"docsSidebar"},"concepts/2-0-concepts":{"id":"concepts/2-0-concepts","title":"2.0 Concepts","description":"A brief introduction to key concepts","sidebar":"docsSidebar"},"concepts/2-1-concepts-cryptography":{"id":"concepts/2-1-concepts-cryptography","title":"2.1 Cryptography","description":"An overview of drand\'s cryptographic building blocks","sidebar":"docsSidebar"},"concepts/2-2-concepts-security-model":{"id":"concepts/2-2-concepts-security-model","title":"2.2 Security Model","description":"Describes drand\u2019s security assumptions.","sidebar":"docsSidebar"},"concepts/2-3-concepts-specification":{"id":"concepts/2-3-concepts-specification","title":"2.3 Specification","description":"Outlines the drand protocol specification.","sidebar":"docsSidebar"},"concepts/2-4-concepts-timelock-encryption":{"id":"concepts/2-4-concepts-timelock-encryption","title":"2.4 Timelock Encryption","description":"Describes timelock encryption and how it works.","sidebar":"docsSidebar"},"dev-guide/3-0-dev-guide":{"id":"dev-guide/3-0-dev-guide","title":"3.0 Developers Guide","description":"Help for developers who wish to use drand.","sidebar":"docsSidebar"},"dev-guide/3-1-dev-guide-organization":{"id":"dev-guide/3-1-dev-guide-organization","title":"3.1 DevGuide: Organization","description":"A table of contents for drand packages and related bits.","sidebar":"docsSidebar"},"dev-guide/3-2-dev-guide-drand-client-cli":{"id":"dev-guide/3-2-dev-guide-drand-client-cli","title":"3.2 drand-client CLI","description":"Instructions for installation and use of the drand client CLI.","sidebar":"docsSidebar"},"dev-guide/3-3-dev-guide-client-libraries":{"id":"dev-guide/3-3-dev-guide-client-libraries","title":"3.3 Client Libraries","description":"Instructions for installing and using client libraries.","sidebar":"docsSidebar"},"dev-guide/3-4-dev-guide-http-api":{"id":"dev-guide/3-4-dev-guide-http-api","title":"3.4 HTTP API","description":"A list of public endpoints, instructions how to fetch, explanation of results.","sidebar":"docsSidebar"},"dev-guide/3-5-dev-guide-pubsub-network":{"id":"dev-guide/3-5-dev-guide-pubsub-network","title":"3.5 PubSub Network","description":"A list of public endpoints with usage instructions.","sidebar":"docsSidebar"},"dev-guide/3-6-dev-guide-code-examples":{"id":"dev-guide/3-6-dev-guide-code-examples","title":"3.6 Code Examples","description":"Examples of how to integrate drand in various coding languages.","sidebar":"docsSidebar"},"drand-community/5-0-drand-community":{"id":"drand-community/5-0-drand-community","title":"5.0 DRAND COMMUNITY","description":"A list of ways you can connect with the drand community.","sidebar":"docsSidebar"},"drand-community/5-1-drand-community-contributing":{"id":"drand-community/5-1-drand-community-contributing","title":"5.1 Contributing","description":"Explains how to contribute your time and talent to the drand project.","sidebar":"docsSidebar"},"drand-faq/6-0-drand-faq":{"id":"drand-faq/6-0-drand-faq","title":"6.0 DRAND FAQ","description":"A list of frequently asked questions and their answers.","sidebar":"docsSidebar"},"home":{"id":"home","title":"Welcome to the drand docs \ud83c\udfb2!","description":"Use this documentation to add secure, high-entropy, verifiable randomness to your application.","sidebar":"docsSidebar"},"ops-guide/4-0-ops-guide":{"id":"ops-guide/4-0-ops-guide","title":"4.0 OPERATORS GUIDE","description":"A guide for drand node operators.","sidebar":"docsSidebar"},"ops-guide/4-1-ops-guide-deployment":{"id":"ops-guide/4-1-ops-guide-deployment","title":"4.1 Deployment","description":"Detailed instructions for how to deploy one or more drand nodes.","sidebar":"docsSidebar"},"ops-guide/4-2-ops-guide-docker-install":{"id":"ops-guide/4-2-ops-guide-docker-install","title":"4.2 Docker Install","description":"Detailed instructions for running a production drand node using Docker.","sidebar":"docsSidebar"},"ops-guide/4-3-ops-guide-storage-backends":{"id":"ops-guide/4-3-ops-guide-storage-backends","title":"4.3 Storage Backends","description":"Describes options available for storage of drand beacon data.","sidebar":"docsSidebar"},"ops-guide/4-4-ops-guide-metrics-guide":{"id":"ops-guide/4-4-ops-guide-metrics-guide","title":"4.4 Metrics Guide","description":"Describes Prometheus instrumentation exposed by drand nodes.","sidebar":"docsSidebar"},"ops-guide/4-5-ops-guide-command-line-tools":{"id":"ops-guide/4-5-ops-guide-command-line-tools","title":"4.5 Command-line Tools","description":"Installing and operating drand from the command line.","sidebar":"docsSidebar"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/aba21aa0.3532aa88.js b/site/assets/js/aba21aa0.3532aa88.js new file mode 100644 index 00000000..31214591 --- /dev/null +++ b/site/assets/js/aba21aa0.3532aa88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5742],{7093:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/site/assets/js/acecf23e.089691d6.js b/site/assets/js/acecf23e.089691d6.js new file mode 100644 index 00000000..906a91ae --- /dev/null +++ b/site/assets/js/acecf23e.089691d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/drand-docs/blog","blogTitle":"Blog","authorsListPath":"/drand-docs/blog/authors"}')}}]); \ No newline at end of file diff --git a/site/assets/js/b0017b1d.b2686800.js b/site/assets/js/b0017b1d.b2686800.js new file mode 100644 index 00000000..d18cfd6c --- /dev/null +++ b/site/assets/js/b0017b1d.b2686800.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2148],{7855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var i=t(4848),o=t(8453);const s={id:"5-0-drand-community",title:"5.0 DRAND COMMUNITY",description:"A list of ways you can connect with the drand community."},r="5.0 DRAND COMMUNITY",d={id:"drand-community/5-0-drand-community",title:"5.0 DRAND COMMUNITY",description:"A list of ways you can connect with the drand community.",source:"@site/docs/05_drand-community/05-00-DRAND_COMMUNITY.md",sourceDirName:"05_drand-community",slug:"/drand-community/5-0-drand-community",permalink:"/drand-docs/docs/drand-community/5-0-drand-community",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/05_drand-community/05-00-DRAND_COMMUNITY.md",tags:[],version:"current",frontMatter:{id:"5-0-drand-community",title:"5.0 DRAND COMMUNITY",description:"A list of ways you can connect with the drand community."},sidebar:"docsSidebar",previous:{title:"5.0 DRAND COMMUNITY",permalink:"/drand-docs/docs/category/50-drand-community"},next:{title:"5.1 Contributing",permalink:"/drand-docs/docs/drand-community/5-1-drand-community-contributing"}},a={},c=[{value:"\ud83d\udc65 Join Our GitHub Community",id:"-join-our-github-community",level:2},{value:"\ud83d\udcac Engage in Discussions on Slack",id:"-engage-in-discussions-on-slack",level:2},{value:"\ud83d\udcec Stay Informed with Our Mailing List",id:"-stay-informed-with-our-mailing-list",level:2},{value:"\ud83c\udfaa Attend one of Our Events",id:"-attend-one-of-our-events",level:2}];function l(n){const e={a:"a",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",ul:"ul",...(0,o.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"50-drand-community",children:"5.0 DRAND COMMUNITY"})}),"\n",(0,i.jsx)(e.p,{children:"Welcome to the drand community! We're always seeking better ways to engage with our members and welcome new participants. Here\u2019s how you can join and stay connected with us:"}),"\n",(0,i.jsx)(e.h2,{id:"-join-our-github-community",children:"\ud83d\udc65 Join Our GitHub Community"}),"\n",(0,i.jsxs)(e.p,{children:["The best way to actively participate and contribute to drand is through ",(0,i.jsx)(e.a,{href:"https://github.com/drand",children:"GitHub"}),". By joining our GitHub community, you can:"]}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"Access and contribute to drand\u2019s source code."}),"\n",(0,i.jsx)(e.li,{children:"Report issues and suggest improvements."}),"\n",(0,i.jsx)(e.li,{children:"Collaborate with other developers and enthusiasts."}),"\n"]}),"\n",(0,i.jsx)(e.h2,{id:"-engage-in-discussions-on-slack",children:"\ud83d\udcac Engage in Discussions on Slack"}),"\n",(0,i.jsxs)(e.p,{children:["For real-time conversations and ongoing discussions, join us on ",(0,i.jsx)(e.a,{href:"http://drandworkspace.slack.com/",children:"drandworkspace.slack.com"}),". On Slack, you can:"]}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"Ask questions and get near-immediate responses."}),"\n",(0,i.jsx)(e.li,{children:"Participate in topic-specific channels."}),"\n",(0,i.jsx)(e.li,{children:"Connect with the drand team and fellow community members."}),"\n"]}),"\n",(0,i.jsx)(e.h2,{id:"-stay-informed-with-our-mailing-list",children:"\ud83d\udcec Stay Informed with Our Mailing List"}),"\n",(0,i.jsxs)(e.p,{children:["Join our announcement mailing list for all ",(0,i.jsx)(e.a,{href:"https://leagueofentropy.org/",children:"League of Entropy"})," members. This mailing list is:"]}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"Used for announcing any changes impacting drand users downstream."}),"\n",(0,i.jsx)(e.li,{children:"Maintained by the League of Entropy Secretariat."}),"\n",(0,i.jsx)(e.li,{children:"An excellent way to stay updated with important news and updates."}),"\n"]}),"\n",(0,i.jsxs)(e.p,{children:["You can join the mailing list by visiting ",(0,i.jsx)(e.a,{href:"https://groups.google.com/g/leagueofentropy-users",children:"groups.google.com/g/leagueofentropy-users"}),"."]}),"\n",(0,i.jsx)(e.h2,{id:"-attend-one-of-our-events",children:"\ud83c\udfaa Attend one of Our Events"}),"\n",(0,i.jsx)(e.p,{children:"Subscribe to our event calendar on Lu.ma."}),"\n",(0,i.jsx)(e.p,{children:(0,i.jsx)(e.a,{href:"https://lu.ma/drand_loe/",children:"drand \xb7 Events Calendar"})}),"\n",(0,i.jsx)(e.hr,{})]})}function u(n={}){const{wrapper:e}={...(0,o.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(l,{...n})}):l(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>r,x:()=>d});var i=t(6540);const o={},s=i.createContext(o);function r(n){const e=i.useContext(s);return i.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function d(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:r(n.components),i.createElement(s.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/bba71062.342fddb8.js b/site/assets/js/bba71062.342fddb8.js new file mode 100644 index 00000000..c44be983 --- /dev/null +++ b/site/assets/js/bba71062.342fddb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3472],{2555:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>a});var i=n(4848),r=n(8453);const o={id:"5-1-drand-community-contributing",title:"5.1 Contributing",description:"Explains how to contribute your time and talent to the drand project."},s="5.1 Community: Contributing",d={id:"drand-community/5-1-drand-community-contributing",title:"5.1 Contributing",description:"Explains how to contribute your time and talent to the drand project.",source:"@site/docs/05_drand-community/05-01-Community_Contributing.md",sourceDirName:"05_drand-community",slug:"/drand-community/5-1-drand-community-contributing",permalink:"/drand-docs/docs/drand-community/5-1-drand-community-contributing",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/05_drand-community/05-01-Community_Contributing.md",tags:[],version:"current",frontMatter:{id:"5-1-drand-community-contributing",title:"5.1 Contributing",description:"Explains how to contribute your time and talent to the drand project."},sidebar:"docsSidebar",previous:{title:"5.0 DRAND COMMUNITY",permalink:"/drand-docs/docs/drand-community/5-0-drand-community"},next:{title:"6.0 DRAND FAQ",permalink:"/drand-docs/docs/category/60-drand-faq"}},u={},a=[{value:"Core Project Contributions",id:"core-project-contributions",level:2},{value:"Improving Documentation",id:"improving-documentation",level:2},{value:"Submitting Issues",id:"submitting-issues",level:2},{value:"How to Submit an Issue",id:"how-to-submit-an-issue",level:3}];function c(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"51-community-contributing",children:"5.1 Community: Contributing"})}),"\n",(0,i.jsx)(t.p,{children:"We welcome contributions to the drand project! Whether you\u2019re interested in submitting code, fixing bugs, or updating documentation, your help is invaluable."}),"\n",(0,i.jsx)(t.h2,{id:"core-project-contributions",children:"Core Project Contributions"}),"\n",(0,i.jsx)(t.p,{children:"drand is constantly evolving, and while not all external contributions can be accepted, your input is highly valued. Here\u2019s how you can contribute:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Submit Bug Reports"}),": Found a bug? ",(0,i.jsx)(t.a,{href:"https://github.com/drand/drand/issues",children:"Report it on GitHub"})," to help us improve drand."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Suggest Improvements"}),": Have ideas for new features or enhancements? Share them with us through GitHub."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Contribute Code"}),": If you have developed a fix or feature, you can submit a pull request for review. Please note that contributions should align with the project\u2019s goals and standards."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"improving-documentation",children:"Improving Documentation"}),"\n",(0,i.jsx)(t.p,{children:"Our documentation is a critical resource for users and developers alike, and we strive to keep it accurate and up-to-date. Here\u2019s how you can help:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Report Issues"}),": If you find any errors or need clarification, ",(0,i.jsx)(t.a,{href:"https://github.com/drand/website/issues",children:"file an issue"})," on GitHub."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Request Features"}),": Have a feature request or need more detailed documentation? Let us know through our documentation repository."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Submit Updates"}),": You can directly contribute by submitting improvements to the documentation via GitHub."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"submitting-issues",children:"Submitting Issues"}),"\n",(0,i.jsxs)(t.p,{children:["If you encounter bugs or have feature requests, we encourage you to submit them ",(0,i.jsx)(t.a,{href:"https://github.com/drand/drand/issues",children:"through GitHub"}),". Clear and detailed reports help us address issues more effectively."]}),"\n",(0,i.jsx)(t.h3,{id:"how-to-submit-an-issue",children:"How to Submit an Issue"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Search for Existing Issues"}),": Before submitting a new issue, check if it has already been reported."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Create a Detailed Report"}),": Provide a clear and concise description of the problem or request. Include steps to reproduce the issue, if applicable."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Submit on GitHub"}),": Use the appropriate GitHub repository to submit your issue."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Your contributions help make drand better for everyone. Thank you for your support!"}),"\n",(0,i.jsx)(t.hr,{})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>d});var i=n(6540);const r={},o=i.createContext(r);function s(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/c6806766.95b6059d.js b/site/assets/js/c6806766.95b6059d.js new file mode 100644 index 00000000..0ccf964b --- /dev/null +++ b/site/assets/js/c6806766.95b6059d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3537],{9569:a=>{a.exports=JSON.parse('{"author":{"name":"Dave Grantham","title":"drand Community Scout Master","url":"https://cryptid.tech","page":{"permalink":"/drand-docs/blog/authors/all-dave-grantham-articles"},"socials":{"github":"https://github.com/dhuseby"},"imageURL":"https://avatars.githubusercontent.com/u/5017470?v=4","key":"dgrantham","count":1},"listMetadata":{"permalink":"/drand-docs/blog/authors/all-dave-grantham-articles","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/c88e9617.089a163c.js b/site/assets/js/c88e9617.089a163c.js new file mode 100644 index 00000000..bbfa2df9 --- /dev/null +++ b/site/assets/js/c88e9617.089a163c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9170],{4659:s=>{s.exports=JSON.parse('{"tag":{"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description","allTagsPath":"/drand-docs/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/drand-docs/blog/tags/docusaurus","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/ccc49370.1d26175e.js b/site/assets/js/ccc49370.1d26175e.js new file mode 100644 index 00000000..4fdc16ab --- /dev/null +++ b/site/assets/js/ccc49370.1d26175e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3249],{2907:(e,t,n)=>{n.d(t,{A:()=>O});n(6540);var a=n(4164),s=n(4096),r=n(4848);function i(e){let{children:t,className:n}=e;return(0,r.jsx)("article",{className:n,children:t})}var l=n(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:n,isBlogPostPage:i}=(0,s.e7)(),{permalink:c,title:d}=n,m=i?"h1":"h2";return(0,r.jsx)(m,{className:(0,a.A)(o.title,t),children:i?d:(0,r.jsx)(l.A,{to:c,children:d})})}var d=n(1312),m=n(5846),u=n(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const n=function(){const{selectMessage:e}=(0,m.W)();return t=>{const n=Math.ceil(t);return e(n,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:n}))}}();return(0,r.jsx)(r.Fragment,{children:n(t)})}function f(e){let{date:t,formattedDate:n}=e;return(0,r.jsx)("time",{dateTime:t,children:n})}function x(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:n}=(0,s.e7)(),{date:i,readingTime:l}=n,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,a.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(f,{date:i,formattedDate:(c=i,o.format(new Date(c)))}),void 0!==l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(x,{}),(0,r.jsx)(g,{readingTime:l})]})]});var c}var v=n(6913);const j={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function b(e){let{className:t}=e;const{metadata:{authors:n},assets:i}=(0,s.e7)();if(0===n.length)return null;const l=n.every((e=>{let{name:t}=e;return!t})),o=1===n.length;return(0,r.jsx)("div",{className:(0,a.A)("margin-top--md margin-bottom--sm",l?j.imageOnlyAuthorRow:"row",t),children:n.map(((e,t)=>(0,r.jsx)("div",{className:(0,a.A)(!l&&(o?"col col--12":"col col--6"),l?j.imageOnlyAuthorCol:j.authorCol),children:(0,r.jsx)(v.A,{author:{...e,imageURL:i.authorsImageUrls[t]??e.imageURL}})},t)))})}function A(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(b,{})]})}var N=n(440),L=n(5533);function y(e){let{children:t,className:n}=e;const{isBlogPostPage:i}=(0,s.e7)();return(0,r.jsx)("div",{id:i?N.LU:void 0,className:(0,a.A)("markdown",n),children:(0,r.jsx)(L.A,{children:t})})}var C=n(7559),T=n(4336),_=n(2053);function H(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function k(e){const{blogPostTitle:t,...n}=e;return(0,r.jsx)(l.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...n,children:(0,r.jsx)(H,{})})}function w(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:n,title:i,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=n.length>0;if(!(u||m||l))return null;if(t){const e=!!(l||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,a.A)("row","margin-top--sm",C.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(_.A,{tags:n})})}),e&&(0,r.jsx)(T.A,{className:(0,a.A)("margin-top--sm",C.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,a.A)("col",{"col--9":m}),children:(0,r.jsx)(_.A,{tags:n})}),m&&(0,r.jsx)("div",{className:(0,a.A)("col text--right",{"col--3":u}),children:(0,r.jsx)(k,{blogPostTitle:i,to:e.permalink})})]})}function O(e){let{children:t,className:n}=e;const l=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(i,{className:(0,a.A)(l,n),children:[(0,r.jsx)(A,{}),(0,r.jsx)(y,{children:t}),(0,r.jsx)(w,{})]})}},3858:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var a=n(4164),s=n(1213),r=n(7559),i=n(4096),l=n(8027),o=n(2907),c=n(1312),d=n(9022),m=n(4848);function u(e){const{nextItem:t,prevItem:n}=e;return(0,m.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,m.jsx)(d.A,{...n,subLabel:(0,m.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),t&&(0,m.jsx)(d.A,{...t,subLabel:(0,m.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:t}=(0,i.e7)(),{title:n,description:a,date:r,tags:l,authors:o,frontMatter:c}=t,{keywords:d}=c,u=e.image??c.image;return(0,m.jsxs)(s.be,{title:n,description:a,keywords:d,image:u,children:[(0,m.jsx)("meta",{property:"og:type",content:"article"}),(0,m.jsx)("meta",{property:"article:published_time",content:r}),o.some((e=>e.url))&&(0,m.jsx)("meta",{property:"article:author",content:o.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,m.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var g=n(5260);function f(){const e=(0,i.J_)();return(0,m.jsx)(g.A,{children:(0,m.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var x=n(7763),p=n(1689);function v(e){let{sidebar:t,children:n}=e;const{metadata:a,toc:s}=(0,i.e7)(),{nextItem:r,prevItem:c,frontMatter:d}=a,{hide_table_of_contents:h,toc_min_heading_level:g,toc_max_heading_level:f}=d;return(0,m.jsxs)(l.A,{sidebar:t,toc:!h&&s.length>0?(0,m.jsx)(x.A,{toc:s,minHeadingLevel:g,maxHeadingLevel:f}):void 0,children:[(0,m.jsx)(p.A,{metadata:a}),(0,m.jsx)(o.A,{children:n}),(r||c)&&(0,m.jsx)(u,{nextItem:r,prevItem:c})]})}function j(e){const t=e.content;return(0,m.jsx)(i.in,{content:e.content,isBlogPostPage:!0,children:(0,m.jsxs)(s.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogPostPage),children:[(0,m.jsx)(h,{}),(0,m.jsx)(f,{}),(0,m.jsx)(v,{sidebar:e.sidebar,children:(0,m.jsx)(t,{})})]})})}},2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var a=n(4164),s=n(4084),r=n(7559),i=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(i.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,a.A)(t,r.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},1689:(e,t,n)=>{n.d(t,{A:()=>d});n(6540);var a=n(4164),s=n(4084),r=n(7559),i=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(i.A,{type:"caution",title:(0,l.jsx)(s.Yh,{}),className:(0,a.A)(t,r.G.common.draftBanner),children:(0,l.jsx)(s.TT,{})})}var c=n(2234);function d(e){let{metadata:t}=e;const{unlisted:n,frontMatter:a}=t;return(0,l.jsxs)(l.Fragment,{children:[(n||a.unlisted)&&(0,l.jsx)(c.A,{}),a.draft&&(0,l.jsx)(o,{})]})}},7763:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var a=n(4164),s=n(5195);const r={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var i=n(4848);const l="table-of-contents__link toc-highlight",o="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,a.A)(r.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(s.A,{...n,linkClassName:l,linkActiveClassName:o})})}},5195:(e,t,n)=>{n.d(t,{A:()=>f});var a=n(6540),s=n(6342);function r(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,...s}=e;n>=0?t[n].children.push(s):a.push(s)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function l(e){const t=e.getBoundingClientRect();return t.top===t.bottom?l(e.parentNode):t}function o(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>l(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(l(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function c(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:t}}=(0,s.p)();return(0,a.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,a.useRef)(void 0),n=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:s,minHeadingLevel:r,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let s=t;s<=n;s+=1)a.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:i}),c=o(l,{anchorTopOffset:n.current}),d=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(s),e.classList.add(s),t.current=e):e.classList.remove(s)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}var m=n(8774),u=n(4848);function h(e){let{toc:t,className:n,linkClassName:a,isChild:s}=e;return t.length?(0,u.jsx)("ul",{className:s?void 0:n,children:t.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(m.A,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:a})]},e.id)))}):null}const g=a.memo(h);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:c,maxHeadingLevel:m,...h}=e;const f=(0,s.p)(),x=c??f.tableOfContents.minHeadingLevel,p=m??f.tableOfContents.maxHeadingLevel,v=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return(0,a.useMemo)((()=>i({toc:r(t),minHeadingLevel:n,maxHeadingLevel:s})),[t,n,s])}({toc:t,minHeadingLevel:x,maxHeadingLevel:p});return d((0,a.useMemo)((()=>{if(l&&o)return{linkClassName:l,linkActiveClassName:o,minHeadingLevel:x,maxHeadingLevel:p}}),[l,o,x,p])),(0,u.jsx)(g,{toc:v,className:n,linkClassName:l,...h})}},4084:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>i,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var a=n(1312),s=n(5260),r=n(4848);function i(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,r.jsx)(s.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,r.jsx)(a.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/site/assets/js/ceb4708b.abf75248.js b/site/assets/js/ceb4708b.abf75248.js new file mode 100644 index 00000000..8346c983 --- /dev/null +++ b/site/assets/js/ceb4708b.abf75248.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4230],{9806:a=>{a.exports=JSON.parse('{"tag":{"label":"Facebook","permalink":"/drand-docs/blog/tags/facebook","description":"Facebook tag description","allTagsPath":"/drand-docs/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/drand-docs/blog/tags/facebook","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/cf1eeb86.2375ecc8.js b/site/assets/js/cf1eeb86.2375ecc8.js new file mode 100644 index 00000000..ceab565b --- /dev/null +++ b/site/assets/js/cf1eeb86.2375ecc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3941],{8497:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>l});var s=r(4848),i=r(8453);const a={id:"1-0-about",title:"1.0 About",description:"What is drand?"},o="1.0 ABOUT (What is \u201cdrand\u201d?)",t={id:"about/1-0-about",title:"1.0 About",description:"What is drand?",source:"@site/docs/01_about/01-00-about.md",sourceDirName:"01_about",slug:"/about/1-0-about",permalink:"/drand-docs/docs/about/1-0-about",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/01_about/01-00-about.md",tags:[],version:"current",frontMatter:{id:"1-0-about",title:"1.0 About",description:"What is drand?"},sidebar:"docsSidebar",previous:{title:'1.0 About (What is "drand"?)',permalink:"/drand-docs/docs/category/10-about-what-is-drand"},next:{title:"1.1 Governance",permalink:"/drand-docs/docs/about/1-1-governance"}},d={},l=[{value:"Current Randomness Generators",id:"current-randomness-generators",level:2},{value:"Features of Good Randomness",id:"features-of-good-randomness",level:2},{value:"How drand Works",id:"how-drand-works",level:2},{value:"Public Randomness",id:"public-randomness",level:2},{value:"Importance of Decentralized Randomness",id:"importance-of-decentralized-randomness",level:2},{value:"Origins of drand",id:"origins-of-drand",level:2},{value:"drand Network and Adoption",id:"drand-network-and-adoption",level:2},{value:"Acknowledgments",id:"acknowledgments",level:2},{value:"\ud83d\udc8c\xa0<em>Get in touch!</em>",id:"get-in-touch",level:3}];function c(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"10-about-what-is-drand",children:"1.0 ABOUT (What is \u201cdrand\u201d?)"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"drand"}),' (lower case, pronounced "DEE-rand") is a distributed randomness beacon daemon written in the ',(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Go_(programming_language)",children:(0,s.jsx)(n.strong,{children:"Go"})})," programming language. It generates collective, publicly verifiable, unbiased, and unpredictable random values at fixed intervals using advanced cryptographic techniques."]}),"\n",(0,s.jsxs)(n.p,{children:["drand serves as a critical Internet-wide infrastructure, providing randomness to applications much like the ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Network_Time_Protocol",children:(0,s.jsx)(n.strong,{children:"Network Time Protocol"})})," (NTP) provides timing information. It ensures randomness is verifiable and decentralized, making it ideal for a wide range of applications, from blockchain systems to anonymity networks."]}),"\n",(0,s.jsx)(n.p,{children:"Randomness plays a crucial role in various aspects of modern life, from voting systems and traffic management to financial services. However, its most critical application is in cryptography."}),"\n",(0,s.jsx)(n.p,{children:"For example, WPA2, the widely used security protocol for Wi-Fi networks, relies on randomness. When a laptop connects to a Wi-Fi network, both the laptop and the Wi-Fi access point generate large random numbers to perform a secure handshake. This ensures that communications cannot be eavesdropped. If these random numbers were predictable, an attacker could intercept the connection."}),"\n",(0,s.jsx)(n.h2,{id:"current-randomness-generators",children:"Current Randomness Generators"}),"\n",(0,s.jsx)(n.p,{children:"Several systems have tried to provide strong randomness, but each has its limitations. As an example:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"NIST Randomness Beacon"}),": The NIST Randomness Beacon provides cryptographic randomness in real-time. However, it is centralized and not verifiable by the public, which poses trust and reliability concerns."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"features-of-good-randomness",children:"Features of Good Randomness"}),"\n",(0,s.jsx)(n.p,{children:"To prevent manipulation, a strong random-number generator should be:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Unpredictable"}),": Impossible to predict the next number."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Publicly Verifiable"}),": Anyone can verify the randomness."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Bias-Resistant"}),": Cannot be influenced to produce specific outcomes."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Decentralized"}),": Produced by a set of independent, unrelated parties."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Always Available"}),": Reliably capable of providing random numbers."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"drand aims to fulfill all these criteria."}),"\n",(0,s.jsx)(n.h2,{id:"how-drand-works",children:"How drand Works"}),"\n",(0,s.jsx)(n.p,{children:"drand generates randomness without allowing any party to predict or bias the output. Here's a simplified overview:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Network Setup"}),": A drand network consists of nodes running the drand protocol. These nodes agree on a threshold parameter and generate partial signatures."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Randomness Generation"}),": Nodes broadcast parts of their signatures, which are collected until they match the threshold. The final signature, a ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/BLS_digital_signature",children:(0,s.jsx)(n.strong,{children:"Boneh\u2013Lynn\u2013Shacham"})})," (BLS) signature, is verified by the network and hashed to produce the random value."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For more details, refer to the ",(0,s.jsx)(n.a,{href:"https://drand.xyz/docs/specification",children:"project specifications"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"public-randomness",children:"Public Randomness"}),"\n",(0,s.jsx)(n.p,{children:"drand's primary function is generating public randomness. The process involves:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Setup Phase"}),": Nodes generate a long-term public/private key pair and perform a ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Distributed_key_generation",children:(0,s.jsx)(n.strong,{children:"distributed key generation"})})," (DKG) protocol to create a collective public key and individual private key shares."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Generation Phase"}),": Nodes initiate randomness generation rounds, sign messages using their private key shares, and reconstruct the full BLS signature. This signature is hashed to ensure no bias, producing the final random value."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This randomness is useful for applications like lotteries, sharding, and consensus protocols."}),"\n",(0,s.jsx)(n.h2,{id:"importance-of-decentralized-randomness",children:"Importance of Decentralized Randomness"}),"\n",(0,s.jsxs)(n.p,{children:["Decentralized randomness is crucial for many systems that rely on fair and unpredictable outcomes. For example, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Proof_of_stake",children:(0,s.jsx)(n.strong,{children:"Proof-of-Stake"})})," (PoS) blockchains use randomness to elect miners, ensuring security and fairness. Unlike centralized solutions, drand offers a verifiable and unbiased source of randomness, enhancing reliability and security."]}),"\n",(0,s.jsx)(n.h2,{id:"origins-of-drand",children:"Origins of drand"}),"\n",(0,s.jsxs)(n.p,{children:["drand was developed in 2017 in the ",(0,s.jsx)(n.a,{href:"https://www.epfl.ch/labs/dedis/",children:"DEDIS"})," Lab at ",(0,s.jsx)(n.a,{href:"https://epfl.ch/",children:"EPFL"}),", spearheaded by ",(0,s.jsx)(n.a,{href:"https://scholar.google.com/citations?user=mnA7Jo4AAAAJ",children:"Nicolas Gailly"}),". The project built upon earlier work in decentralized randomness by researchers at Yale University and EPFL."]}),"\n",(0,s.jsxs)(n.p,{children:["The DEDIS team collaborated with ",(0,s.jsx)(n.a,{href:"https://dfinity.org/",children:"DFINITY"})," to optimize the cryptographic techniques used in drand, resulting in a more efficient and reliable randomness generation protocol."]}),"\n",(0,s.jsx)(n.h2,{id:"drand-network-and-adoption",children:"drand Network and Adoption"}),"\n",(0,s.jsxs)(n.p,{children:["drand gained support from prominent organizations such as ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org/cloudflare",children:"Cloudflare"}),", ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org/kudelski-security",children:"Kudelski Security"}),", ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org/protocol-labs",children:"Protocol Labs"}),", ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org/universidad-de-chile",children:"Universidad de Chile"}),", and ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org/league-partners",children:"many others"}),". These collaborations have helped establish a robust drand network, hosted by a voluntary consortium known as the ",(0,s.jsx)(n.a,{href:"https://leagueofentropy.org",children:"League of Entropy"}),", which launched its production-ready mainnet in 2019."]}),"\n",(0,s.jsx)(n.p,{children:"Today, drand is used in various applications, including leader election in consensus mechanisms, providing randomness for smart contracts, and more."}),"\n",(0,s.jsx)(n.h2,{id:"acknowledgments",children:"Acknowledgments"}),"\n",(0,s.jsxs)(n.p,{children:["Special thanks to contributors and collaborators who have supported drand\u2019s development, including ",(0,s.jsx)(n.a,{href:"https://github.com/paulmillr",children:"@paulmillr"})," and ",(0,s.jsx)(n.a,{href:"https://github.com/herumi",children:"@herumi"})," for cryptographic library support, and teams from the ",(0,s.jsx)(n.a,{href:"https://dedis.ch/",children:"DEDIS lab"})," and from ",(0,s.jsx)(n.a,{href:"https://protocol.ai/",children:"Protocol Labs"}),"."]}),"\n",(0,s.jsxs)(n.h3,{id:"get-in-touch",children:["\ud83d\udc8c\xa0",(0,s.jsx)(n.em,{children:"Get in touch!"})]}),"\n",(0,s.jsxs)(n.p,{children:["If you have any questions or comments, you can reach the drand team at ",(0,s.jsx)(n.a,{href:"mailto:leagueofentropy@googlegroups.com",children:"leagueofentropy@googlegroups.com"})," or join the ",(0,s.jsx)(n.a,{href:"https://join.slack.com/t/drandworkspace/shared_invite/zt-19u4rf6if-bf7lxIvF2zYn4~TrBwfkiA",children:"drand Slack workspace"}),"."]}),"\n",(0,s.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>t});var s=r(6540);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/d1958d43.5026828c.js b/site/assets/js/d1958d43.5026828c.js new file mode 100644 index 00000000..e347e399 --- /dev/null +++ b/site/assets/js/d1958d43.5026828c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[4115],{8288:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>a});var r=s(4848),t=s(8453);const i={id:"4-0-ops-guide",title:"4.0 OPERATORS GUIDE",description:"A guide for drand node operators."},d="4.0 OPERATORS GUIDE",o={id:"ops-guide/4-0-ops-guide",title:"4.0 OPERATORS GUIDE",description:"A guide for drand node operators.",source:"@site/docs/04_ops-guide/04-00-OPERATORS_GUIDE.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-0-ops-guide",permalink:"/drand-docs/docs/ops-guide/4-0-ops-guide",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-00-OPERATORS_GUIDE.md",tags:[],version:"current",frontMatter:{id:"4-0-ops-guide",title:"4.0 OPERATORS GUIDE",description:"A guide for drand node operators."},sidebar:"docsSidebar",previous:{title:"4.0 OPERATORS GUIDE",permalink:"/drand-docs/docs/category/40-operators-guide"},next:{title:"4.1 Deployment",permalink:"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment"}},l={},a=[{value:"Key Objectives for League of Entropy Operators:",id:"key-objectives-for-league-of-entropy-operators",level:2}];function c(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"40-operators-guide",children:"4.0 OPERATORS GUIDE"})}),"\n",(0,r.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(n.p,{children:["A drand ",(0,r.jsx)(n.strong,{children:"Network"})," is composed of individual and independent drand ",(0,r.jsx)(n.strong,{children:"Nodes"})," that generate randomness by networking with other distributed nodes. The randomness is published to the world with the help of drand ",(0,r.jsx)(n.strong,{children:"Relays"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"key-objectives-for-league-of-entropy-operators",children:"Key Objectives for League of Entropy Operators:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Objective"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Security"}),(0,r.jsx)(n.td,{children:"Ensure a secure, DDoS-resistant stack that withstands targeted attacks without compromising private key material."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Performance"}),(0,r.jsx)(n.td,{children:"Provide a fast service that scales to serve hundreds of thousands of clients efficiently."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Diversity"}),(0,r.jsx)(n.td,{children:"Create a diverse setup with multiple endpoints and access methods to ensure reliable randomness consumption, even in degraded network conditions."})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://lh7-us.googleusercontent.com/oJ3VshPm9XDtJqI5qlUuC8cNQ1DOw6RtS-rP9q7JHwJMG8Z6IxgsvDLovQTUhLNIsbtJ-PG7vyoufZOj6DCZ6loOCMHKSbYh0QvRYbY2tVeOfilaewNm12lRoM18TK_OAADq5lsmydz_RRI1epWleyNtaKz4fKw",children:"A high-level view of a simple drand stack"})}),"\n",(0,r.jsx)(n.p,{children:"A high-level view of a simple drand stack"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://lh7-us.googleusercontent.com/0dTQEtQyYTdw8W8kzzKms5o2fx7XlXZIcZXXm7B2N0U7ZfXaHIquajtW4KlOm2Yg28zKcu3aItyAXEegPZ-IML4tR2Wr6vqFdmHqF1NWQL1ML7Bbdi-XQa6FFOnNQchbmkUn8nCX4gJ5SgjHjnjJYbqfiJ_lH8I",children:"https://lh7-us.googleusercontent.com/0dTQEtQyYTdw8W8kzzKms5o2fx7XlXZIcZXXm7B2N0U7ZfXaHIquajtW4KlOm2Yg28zKcu3aItyAXEegPZ-IML4tR2Wr6vqFdmHqF1NWQL1ML7Bbdi-XQa6FFOnNQchbmkUn8nCX4gJ5SgjHjnjJYbqfiJ_lH8I"})}),"\n",(0,r.jsx)(n.h1,{id:"guidelines-for-drand-nodes",children:"Guidelines for drand Nodes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Must be isolated from the public internet."}),"\n",(0,r.jsx)(n.li,{children:"Whitelist incoming TLS-encrypted connections from other drand Nodes using a dedicated firewall instance, which can also perform TLS termination as needed."}),"\n",(0,r.jsx)(n.li,{children:"Outgoing connections should originate from static IP(s) that other operators can whitelist."}),"\n",(0,r.jsx)(n.li,{children:"drand nodes do not offer API service publicly; rely on drand Relays and CDNs."}),"\n",(0,r.jsx)(n.li,{children:"Whitelist or authenticate access from Relays and CDN endpoints."}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"guidelines-for-drand-relays",children:"Guidelines for drand Relays"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Encourage the use of Relays to distribute randomness."}),"\n",(0,r.jsx)(n.li,{children:"Relays can provide an HTTP endpoint or use a libp2p-based PubSub system for distribution."}),"\n",(0,r.jsx)(n.li,{children:"Relays should be independent of the drand Node and not co-located on the same machine."}),"\n",(0,r.jsx)(n.li,{children:"PubSub-enabled relays should maintain a unique libp2p Peer ID."}),"\n",(0,r.jsx)(n.li,{children:"HTTP-enabled relays are stateless and can be horizontally scaled."}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"use-of-content-distribution-networks-cdns",children:"Use of Content Distribution Networks (CDNs)"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Provide HTTP(S) API access to randomness using a CDN linked to Nodes. ",(0,r.jsx)(n.em,{children:"Note: Do not use CDNs operated by other LoE members. (i.e. Cloudflare)"})]}),"\n",(0,r.jsx)(n.li,{children:"Configure CDN to cache drand HTTP endpoints, as drand produces immutable values periodically."}),"\n",(0,r.jsx)(n.li,{children:"Use dedicated HTTP-enabled Relays for CDN requests to minimize direct access to drand Nodes."}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"operation-of-a-drand-stack",children:"Operation of a drand Stack"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Ensure a known set of node operators are responsible and reachable."}),"\n",(0,r.jsx)(n.li,{children:"Monitor infrastructure with extracted logs and pushed monitoring information."}),"\n",(0,r.jsx)(n.li,{children:"Ensure logs are collected externally and ensure both system level metrics as well as applications level metrics are monitored."}),"\n",(0,r.jsx)(n.li,{children:"Additionally, follow security recommendations below:"}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"security-recommendations",children:"Security Recommendations"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Area"}),(0,r.jsx)(n.th,{children:"Recommendations"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"SSH Access"}),(0,r.jsx)(n.td,{children:"- Use a bastion node for SSH access, whitelisting operator IPs or VPN endpoints."})]})})]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Disable sudo and root access on bastion nodes."}),"\n",(0,r.jsx)(n.li,{children:"Enforce key-based SSH login and disable password authentication."}),"\n",(0,r.jsx)(n.li,{children:"Enable 2FA for all machine logins."}),"\n",(0,r.jsx)(n.li,{children:"Use a pin-protected physical device (e.g. Yubikey) for SSH key storage. |\n| Firewall Configuration | - Thoroughly test allowlist enforcement, allowing only incoming connections on the drand-grpc port."}),"\n",(0,r.jsx)(n.li,{children:"Use dedicated reverse-proxy/firewall machines without exposing SSH access."}),"\n",(0,r.jsx)(n.li,{children:"Ensure reverse proxies for HTTP-relays are on separate machines. |\n| External Services | - Enable MFA for all infrastructure/cloud provider logins."}),"\n",(0,r.jsx)(n.li,{children:"Rotate API keys frequently."}),"\n",(0,r.jsx)(n.li,{children:"Limit user permissions and avoid shared logins."}),"\n",(0,r.jsx)(n.li,{children:"Use an email list for main account notifications. |\n| Drand Machines | - Ensure operating system is up-to-date with latest security patches."}),"\n",(0,r.jsx)(n.li,{children:"Run the drand node in isolation with dedicated system users."}),"\n",(0,r.jsx)(n.li,{children:"Encrypt disks containing drand configuration files."}),"\n",(0,r.jsx)(n.li,{children:"Limit external access strictly to operators."}),"\n",(0,r.jsx)(n.li,{children:"Inform network partners immediately in case of compromise. |"}),"\n"]}),"\n",(0,r.jsx)(n.h1,{id:"resource-recommendations",children:"Resource Recommendations"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Resource"}),(0,r.jsx)(n.th,{children:"For a drand node"}),(0,r.jsx)(n.th,{children:"For a Publicly-accessible HTTP Relay"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Compute"}),(0,r.jsx)(n.td,{children:"Comparable to x86-64 at the AWS \u2018micro\u2019 tier"}),(0,r.jsx)(n.td,{children:"Comparable to x86-64 at the AWS \u2018micro\u2019 tier"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Storage"}),(0,r.jsx)(n.td,{children:"At least 64GB of persistent storage"}),(0,r.jsx)(n.td,{children:"N/A"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Storage I/O"}),(0,r.jsx)(n.td,{children:"No special provisioning required"}),(0,r.jsx)(n.td,{children:"N/A"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Network Bandwidth"}),(0,r.jsx)(n.td,{children:"Minimum 1Mbps of dedicated bandwidth"}),(0,r.jsx)(n.td,{children:"100Mbps of network traffic"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"32GB"}),(0,r.jsx)(n.td,{children:"32GB to keep all rounds cached in memory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Hosting Capacity"}),(0,r.jsx)(n.td,{children:"At least 100Gbps of available peered or transit bandwidth"}),(0,r.jsx)(n.td,{children:"N/A"})]})]})]}),"\n",(0,r.jsx)(n.h1,{id:"monitoring-recommendations",children:"Monitoring Recommendations"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Area"}),(0,r.jsx)(n.th,{children:"Recommendations"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Logs"}),(0,r.jsx)(n.td,{children:"\u2022 Collect and ship logs to an external service."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Monitor log collection and notify operators if logs are not received."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Enable pam_tty_audit for logging user actions."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Collect and monitor load balancer/firewall/CDN logs."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Metrics"}),(0,r.jsx)(n.td,{children:"\u2022 Monitor common machine metrics (CPU, Disk usage, Memory, Bandwidth)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Enable Prometheus metrics endpoints for drand applications."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Scrape metrics locally and push to a remote service."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"API Monitoring"}),(0,r.jsx)(n.td,{children:"\u2022 Monitor /health and /public/latest endpoints for node and relay health."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Use /info endpoint for load-balancer health checks."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Alerts"}),(0,r.jsx)(n.td,{children:"Set up alerts for increased error log entries, failed metric pushes, panic lines, successful and failed SSH logins, CPU usage spikes, reboots, and application restarts."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Dashboards"}),(0,r.jsx)(n.td,{children:"Create dashboards for metrics like CPU, load, uptime, connections, memory usage, disk usage, API requests, beacon discrepancy, and process details."})]})]})]}),"\n",(0,r.jsx)(n.h1,{id:"operation-recommendations",children:"Operation Recommendations"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Area"}),(0,r.jsx)(n.th,{children:"Recommendations"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Deployments and Maintenance"}),(0,r.jsx)(n.td,{children:"\u2022 Communicate maintenance to partners and users."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Avoid maintenance overlaps."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Monitor log messages and dashboards during deployments."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Backups"}),(0,r.jsx)(n.td,{children:"\u2022 Securely back up key and group folders before network events."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Regularly back up node configurations to prevent data loss."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CDN and HTTP Relays"}),(0,r.jsx)(n.td,{children:"\u2022 Never co-locate HTTP relays with the drand node."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Use CDNs to cache responses and prevent direct DDoS attacks on the drand daemon."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Limit HTTP relay traffic to CDN only."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Gossip Relays"}),(0,r.jsx)(n.td,{children:"\u2022 Ensure gossip relays are not co-located with drand nodes or HTTP relays."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Configure dnsaddr entries for gossip relays."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Protect gossip relay identities and monitor their performance."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Status Monitoring"}),(0,r.jsx)(n.td,{children:"\u2022 Monitor nodes using appropriate tools and report their status to the collective status page."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"\u2022 Ensure latency monitoring is enabled and accessible by the League of Entropy. This refers to making GRPC exposed Prometheus metrics available for latency monitoring. Ensure your metrics are publicly accessible to enable comprehensive monitoring by the League of Entropy."}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>o});var r=s(6540);const t={},i=r.createContext(t);function d(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/d954c059.7a3d7eb4.js b/site/assets/js/d954c059.7a3d7eb4.js new file mode 100644 index 00000000..9c1bfb99 --- /dev/null +++ b/site/assets/js/d954c059.7a3d7eb4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5858],{1255:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var a=n(4848),o=n(8453);const r={slug:"drand-greetings",title:"Greetings!",authors:["kentbull","dgrantham"],tags:["hello"]},s=void 0,l={permalink:"/drand-docs/blog/drand-greetings",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2024-08-19-greetings.md",source:"@site/blog/2024-08-19-greetings.md",title:"Greetings!",description:"Congratulations, you have made your first post!",date:"2024-08-19T00:00:00.000Z",tags:[{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"}],readingTime:.345,hasTruncateMarker:!0,authors:[{name:"Kent Bull",title:"drand Community Manager",url:"https://kentbull.com",page:{permalink:"/drand-docs/blog/authors/kentbull"},socials:{x:"https://x.com/kentopbull",github:"https://github.com/kentbull"},imageURL:"https://avatars.githubusercontent.com/u/65027257?v=4",key:"kentbull"},{name:"Dave Grantham",title:"drand Community Scout Master",url:"https://cryptid.tech",page:{permalink:"/drand-docs/blog/authors/all-dave-grantham-articles"},socials:{github:"https://github.com/dhuseby"},imageURL:"https://avatars.githubusercontent.com/u/5017470?v=4",key:"dgrantham"}],frontMatter:{slug:"drand-greetings",title:"Greetings!",authors:["kentbull","dgrantham"],tags:["hello"]},unlisted:!1,nextItem:{title:"Welcome",permalink:"/drand-docs/blog/welcome"}},i={authorsImageUrls:[void 0,void 0]},d=[];function u(t){const e={p:"p",...(0,o.R)(),...t.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.p,{children:"Congratulations, you have made your first post!"}),"\n",(0,a.jsx)(e.p,{children:"Feel free to play around and edit this post as much as you like."})]})}function c(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,a.jsx)(e,{...t,children:(0,a.jsx)(u,{...t})}):u(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>l});var a=n(6540);const o={},r=a.createContext(o);function s(t){const e=a.useContext(r);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function l(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),a.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/d9f32620.d09d65df.js b/site/assets/js/d9f32620.d09d65df.js new file mode 100644 index 00000000..0a5d9547 --- /dev/null +++ b/site/assets/js/d9f32620.d09d65df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[5557],{7447:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>i,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=o(4848),t=o(8453);const r={slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},l=void 0,a={permalink:"/drand-docs/blog/welcome",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-26-welcome/index.md",source:"@site/blog/2021-08-26-welcome/index.md",title:"Welcome",description:"Docusaurus blogging features are powered by the blog plugin.",date:"2021-08-26T00:00:00.000Z",tags:[{inline:!1,label:"Facebook",permalink:"/drand-docs/blog/tags/facebook",description:"Facebook tag description"},{inline:!1,label:"Hello",permalink:"/drand-docs/blog/tags/hello",description:"Hello tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.465,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"},{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"welcome",title:"Welcome",authors:["slorber","yangshun"],tags:["facebook","hello","docusaurus"]},unlisted:!1,prevItem:{title:"Greetings!",permalink:"/drand-docs/blog/drand-greetings"},nextItem:{title:"MDX Blog Post",permalink:"/drand-docs/blog/mdx-blog-post"}},i={authorsImageUrls:[void 0,void 0]},c=[];function d(e){const s={a:"a",code:"code",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://docusaurus.io/docs/blog",children:"Docusaurus blogging features"})," are powered by the ",(0,n.jsx)(s.a,{href:"https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog",children:"blog plugin"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"Here are a few tips you might find useful."}),"\n",(0,n.jsxs)(s.p,{children:["Simply add Markdown files (or folders) to the ",(0,n.jsx)(s.code,{children:"blog"})," directory."]}),"\n",(0,n.jsxs)(s.p,{children:["Regular blog authors can be added to ",(0,n.jsx)(s.code,{children:"authors.yml"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"The blog post date can be extracted from filenames, such as:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.code,{children:"2019-05-30-welcome.md"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.code,{children:"2019-05-30-welcome/index.md"})}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"A blog post folder can be convenient to co-locate blog post images:"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Docusaurus Plushie",src:o(3306).A+"",width:"1500",height:"500"})}),"\n",(0,n.jsx)(s.p,{children:"The blog supports tags as well!"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"And if you don't want a blog"}),": just delete this directory, and use ",(0,n.jsx)(s.code,{children:"blog: false"})," in your Docusaurus config."]})]})}function u(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},3306:(e,s,o)=>{o.d(s,{A:()=>n});const n=o.p+"assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg"},8453:(e,s,o)=>{o.d(s,{R:()=>l,x:()=>a});var n=o(6540);const t={},r=n.createContext(t);function l(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/da23e8d3.05f6318d.js b/site/assets/js/da23e8d3.05f6318d.js new file mode 100644 index 00000000..1c65bb98 --- /dev/null +++ b/site/assets/js/da23e8d3.05f6318d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1447],{9762:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>i,contentTitle:()=>t,default:()=>h,frontMatter:()=>d,metadata:()=>a,toc:()=>l});var o=s(4848),r=s(8453);const d={id:"4-3-ops-guide-storage-backends",title:"4.3 Storage Backends",description:"Describes options available for storage of drand beacon data."},t="4.3 DevOps: Storage Backends",a={id:"ops-guide/4-3-ops-guide-storage-backends",title:"4.3 Storage Backends",description:"Describes options available for storage of drand beacon data.",source:"@site/docs/04_ops-guide/04-03-DevOps_Storage_Backends.md",sourceDirName:"04_ops-guide",slug:"/ops-guide/4-3-ops-guide-storage-backends",permalink:"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/04_ops-guide/04-03-DevOps_Storage_Backends.md",tags:[],version:"current",frontMatter:{id:"4-3-ops-guide-storage-backends",title:"4.3 Storage Backends",description:"Describes options available for storage of drand beacon data."},sidebar:"docsSidebar",previous:{title:"4.2 Docker Install",permalink:"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install"},next:{title:"4.4 Metrics Guide",permalink:"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide"}},i={},l=[{value:"<strong>BoltDB</strong>",id:"boltdb",level:2},{value:"<strong>Usage Example:</strong>",id:"usage-example",level:3},{value:"\ud83d\udc18 <strong>PostgreSQL</strong>",id:"-postgresql",level:2},{value:"<strong>Usage Example:</strong>",id:"usage-example-1",level:3},{value:"<strong>Supported Options:</strong>",id:"supported-options",level:3},{value:"<strong>In-memory (memDB)</strong>",id:"in-memory-memdb",level:2},{value:"<strong>Usage Example:</strong>",id:"usage-example-2",level:3},{value:"<strong>Supported Options:</strong>",id:"supported-options-1",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"43-devops-storage-backends",children:"4.3 DevOps: Storage Backends"})}),"\n",(0,o.jsx)(n.p,{children:"drand supports multiple storage backends: BoltDB, PostgreSQL, in-memory storage, aka. MemDB."}),"\n",(0,o.jsxs)(n.p,{children:["To launch drand with a specific backend, you need to provide the\xa0",(0,o.jsx)(n.code,{children:"--db"}),"\xa0flag."]}),"\n",(0,o.jsxs)(n.p,{children:["The supported values are:\xa0",(0,o.jsx)(n.code,{children:"bolt"}),"\xa0for BoltDB,\xa0",(0,o.jsx)(n.code,{children:"postgres"}),"\xa0for PostgreSQL,\xa0",(0,o.jsx)(n.code,{children:"memdb"}),"\xa0for the in-memory backend."]}),"\n",(0,o.jsx)(n.h2,{id:"boltdb",children:(0,o.jsx)(n.strong,{children:"BoltDB"})}),"\n",(0,o.jsx)(n.p,{children:"The BoltDB backend allows drand to store beacon data under a local filesystem."}),"\n",(0,o.jsxs)(n.p,{children:["The database can be found under the\xa0",(0,o.jsx)(n.code,{children:"<storage-path>/multibeacon/<beacon-id>/db/drand.db"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This is the\xa0",(0,o.jsx)(n.em,{children:"default"}),"\xa0storage backend."]}),"\n",(0,o.jsx)(n.h3,{id:"usage-example",children:(0,o.jsx)(n.strong,{children:"Usage Example:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-jsx",children:'drand start \\\n -db boltdb \\\n <other "start" options here>\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can also omit the\xa0",(0,o.jsx)(n.code,{children:"-db"}),"\xa0flag."]}),"\n",(0,o.jsx)(n.p,{children:"At the moment, there are no configurable options for this backend."}),"\n",(0,o.jsxs)(n.h2,{id:"-postgresql",children:["\ud83d\udc18 ",(0,o.jsx)(n.strong,{children:"PostgreSQL"})]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:(0,o.jsx)(n.strong,{children:"This backend is supported since drand v1.5+."})})}),"\n",(0,o.jsx)(n.p,{children:"The PostgreSQL backend allows drand to store beacons in a database."}),"\n",(0,o.jsxs)(n.p,{children:["The database connection will use\xa0",(0,o.jsx)(n.code,{children:"UTC"}),"\xa0as default timezone. This parameter is not currently configurable."]}),"\n",(0,o.jsx)(n.h3,{id:"usage-example-1",children:(0,o.jsx)(n.strong,{children:"Usage Example:"})}),"\n",(0,o.jsx)(n.p,{children:"Before using this backend, you'll need to create a user that can read/write into the database you want the beacons to be stored in."}),"\n",(0,o.jsxs)(n.p,{children:["You'll also need to manually apply the migration schema\xa0",(0,o.jsx)(n.a,{href:"https://github.com/drand/drand/blob/f18ccee8e57babb635742f7f73d4289a943b533a/chain/postgresdb/schema/schema.sql",children:"chain/postgresdb/schema/schema.sql"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.em,{children:"Note"}),": You should always apply the schema corresponding to your code version."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-jsx",children:"drand start \\\n -db postgres \\\n -pg-dsn 'postgres://drand:drand@services.local.rodb.ro:45432/drand?sslmode=disable&connect_timeout=5' \\\n <other \"start\" options here>\n"})}),"\n",(0,o.jsx)(n.h3,{id:"supported-options",children:(0,o.jsx)(n.strong,{children:"Supported Options:"})}),"\n",(0,o.jsxs)(n.p,{children:["You can customize the PostgreSQL backend using the\xa0",(0,o.jsx)(n.code,{children:"-pg-dsn"}),"\xa0option. This allows you to control various connection properties."]}),"\n",(0,o.jsx)(n.p,{children:"The available options are:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"sslmode"}),"\xa0- If the SSL mode is disabled or not. Supports:\xa0",(0,o.jsx)(n.code,{children:"required"}),"\xa0or\xa0",(0,o.jsx)(n.code,{children:"disabled"}),". Default\xa0",(0,o.jsx)(n.code,{children:"disabled"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"connect_timeout"}),"\xa0- How many seconds to wait until the connection attempt times out. Default: 5 seconds."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"max-idle"}),"\xa0- The number of maximum idle connections to the database. Default: 2."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"max-open"}),"\xa0- The number of maximum open connections to the database. Default: 0 - unlimited.","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["If\xa0",(0,o.jsx)(n.code,{children:"max-idle"}),"\xa0is greater than 0 and\xa0",(0,o.jsx)(n.code,{children:"max-open"}),"\xa0is less than\xa0",(0,o.jsx)(n.code,{children:"max-idle"}),", then\xa0",(0,o.jsx)(n.code,{children:"max-idle"}),"\xa0will be capped to\xa0",(0,o.jsx)(n.code,{children:"max-open"}),"\xa0limit."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"in-memory-memdb",children:(0,o.jsx)(n.strong,{children:"In-memory (memDB)"})}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.em,{children:(0,o.jsx)(n.strong,{children:"This backend is supported since drand v1.5+."})})}),"\n",(0,o.jsx)(n.p,{children:"The in-memory backend, also referred to as memdb, allows the node to store all beacons in-memory."}),"\n",(0,o.jsx)(n.p,{children:"This backend will lose all the contents on node restart/stop."}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Warning:"}),"\xa0Using this backend on a threshold amount of nodes can cause catastrophic network disruptions if all nodes reboot/fail at the same time."]}),"\n",(0,o.jsx)(n.h3,{id:"usage-example-2",children:(0,o.jsx)(n.strong,{children:"Usage Example:"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-jsx",children:'drand start \\\n -db memdb \\\n -memdb-size 2000 \\\n <other "start" options here>\n'})}),"\n",(0,o.jsx)(n.h3,{id:"supported-options-1",children:(0,o.jsx)(n.strong,{children:"Supported Options:"})}),"\n",(0,o.jsx)(n.p,{children:"You can customize the in-memory backend by specifying the following options:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"memdb-size"}),"\xa0- The number of beacons that each network will store before purging."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Note, the\xa0",(0,o.jsx)(n.code,{children:"memdb-size"}),"\xa0applies to individually to all the networks. E.g., for a\xa0",(0,o.jsx)(n.code,{children:"-memdb-size=2000"}),":"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"If you plan to run a single network, then the total number of beacons in memory will be 2000."}),"\n",(0,o.jsx)(n.li,{children:"If you plan to run two networks, then the total number of beacons in memory will be 4000."}),"\n",(0,o.jsx)(n.li,{children:"If you plan to run N networks, then the total number of beacons in memory will be N * 2000."}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"To help you estimate the memory size required to operate an in-memory node, you can use a size of about 200 bytes for each beacon value stored."}),"\n",(0,o.jsx)(n.p,{children:"Besides the memory constraints, you'll also have to keep in mind the frequency of the network:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"For a 30 seconds period, 2000 beacons will cover the last ~16 hours of values."}),"\n",(0,o.jsx)(n.li,{children:"For a 3 seconds period, 2000 beacons will cover the last ~1 hour of values."}),"\n",(0,o.jsx)(n.li,{children:"For a 1 second period, 2000 beacons will cover the last ~30 minutes of values"}),"\n"]}),"\n",(0,o.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var o=s(6540);const r={},d=o.createContext(r);function t(e){const n=o.useContext(d);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),o.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/e273c56f.84e147cb.js b/site/assets/js/e273c56f.84e147cb.js new file mode 100644 index 00000000..d2cad481 --- /dev/null +++ b/site/assets/js/e273c56f.84e147cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[9328],{4014:(t,s,e)=>{e.r(s),e.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>u});var o=e(4848),n=e(8453);const r={slug:"first-blog-post",title:"First Blog Post",authors:["slorber","yangshun"],tags:["hola","docusaurus"]},i=void 0,a={permalink:"/drand-docs/blog/first-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-28-first-blog-post.md",source:"@site/blog/2019-05-28-first-blog-post.md",title:"First Blog Post",description:"Lorem ipsum dolor sit amet...",date:"2019-05-28T00:00:00.000Z",tags:[{inline:!1,label:"Hola",permalink:"/drand-docs/blog/tags/hola",description:"Hola tag description"},{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.135,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"},{name:"Yangshun Tay",title:"Front End Engineer @ Facebook",url:"https://github.com/yangshun",page:{permalink:"/drand-docs/blog/authors/yangshun"},socials:{x:"https://x.com/yangshunz",github:"https://github.com/yangshun"},imageURL:"https://github.com/yangshun.png",key:"yangshun"}],frontMatter:{slug:"first-blog-post",title:"First Blog Post",authors:["slorber","yangshun"],tags:["hola","docusaurus"]},unlisted:!1,prevItem:{title:"Long Blog Post",permalink:"/drand-docs/blog/long-blog-post"}},l={authorsImageUrls:[void 0,void 0]},u=[];function c(t){const s={p:"p",...(0,n.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:"Lorem ipsum dolor sit amet..."}),"\n",(0,o.jsx)(s.p,{children:"...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"})]})}function d(t={}){const{wrapper:s}={...(0,n.R)(),...t.components};return s?(0,o.jsx)(s,{...t,children:(0,o.jsx)(c,{...t})}):c(t)}},8453:(t,s,e)=>{e.d(s,{R:()=>i,x:()=>a});var o=e(6540);const n={},r=o.createContext(n);function i(t){const s=o.useContext(r);return o.useMemo((function(){return"function"==typeof t?t(s):{...s,...t}}),[s,t])}function a(t){let s;return s=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:i(t.components),o.createElement(r.Provider,{value:s},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/e4fffcf9.db2fbd7c.js b/site/assets/js/e4fffcf9.db2fbd7c.js new file mode 100644 index 00000000..fab5507b --- /dev/null +++ b/site/assets/js/e4fffcf9.db2fbd7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2542],{2843:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"2.0 CONCEPTS (Getting Started)","description":"A brief introduction to key concepts.","slug":"/category/20-concepts-getting-started","permalink":"/drand-docs/docs/category/20-concepts-getting-started","sidebar":"docsSidebar","navigation":{"previous":{"title":"1.1 Governance","permalink":"/drand-docs/docs/about/1-1-governance"},"next":{"title":"2.0 Concepts","permalink":"/drand-docs/docs/concepts/2-0-concepts"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/e50fef06.efa026e2.js b/site/assets/js/e50fef06.efa026e2.js new file mode 100644 index 00000000..dead2b25 --- /dev/null +++ b/site/assets/js/e50fef06.efa026e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1548],{8011:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var t=i(4848),o=i(8453);const s={id:"1-1-governance",title:"1.1 Governance",description:"Describes how project contributors conduct themselves."},r="1.1 About: Governance",a={id:"about/1-1-governance",title:"1.1 Governance",description:"Describes how project contributors conduct themselves.",source:"@site/docs/01_about/01-01-Governance.md",sourceDirName:"01_about",slug:"/about/1-1-governance",permalink:"/drand-docs/docs/about/1-1-governance",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/01_about/01-01-Governance.md",tags:[],version:"current",frontMatter:{id:"1-1-governance",title:"1.1 Governance",description:"Describes how project contributors conduct themselves."},sidebar:"docsSidebar",previous:{title:"1.0 About",permalink:"/drand-docs/docs/about/1-0-about"},next:{title:"2.0 CONCEPTS (Getting Started)",permalink:"/drand-docs/docs/category/20-concepts-getting-started"}},c={},d=[{value:"Key Points",id:"key-points",level:2},{value:"Scope",id:"scope",level:2},{value:"Creating a Harassment-Free Space",id:"creating-a-harassment-free-space",level:2},{value:"Reporting Violations",id:"reporting-violations",level:2},{value:"Consequences",id:"consequences",level:2},{value:"Addressing Grievances",id:"addressing-grievances",level:2},{value:"Contact Information",id:"contact-information",level:2},{value:"Updates",id:"updates",level:2},{value:"Credit and License",id:"credit-and-license",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"11-about-governance",children:"1.1 About: Governance"})}),"\n",(0,t.jsx)(n.p,{children:"Our mission thrives in an environment that is friendly, safe, accepting, and free from intimidation or harassment. Certain behaviors will not be tolerated to ensure this atmosphere."}),"\n",(0,t.jsx)(n.h2,{id:"key-points",children:"Key Points"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Be respectful."}),"\n",(0,t.jsxs)(n.li,{children:["Need help? Contact: ",(0,t.jsx)(n.a,{href:"mailto:abuse@ipfs.io",children:"abuse@ipfs.io"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Abusive behavior is never tolerated."}),"\n",(0,t.jsx)(n.li,{children:"Violations may result in immediate and permanent expulsion."}),"\n",(0,t.jsx)(n.li,{children:"Ignorance of this document is not an excuse."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"scope",children:"Scope"}),"\n",(0,t.jsx)(n.p,{children:"This Code of Conduct applies to all community members at all times, in all community venues, online and in person, and in one-on-one communications related to the project. It covers the use of our public infrastructure, including the drand network, events, and services."}),"\n",(0,t.jsx)(n.h2,{id:"creating-a-harassment-free-space",children:"Creating a Harassment-Free Space"}),"\n",(0,t.jsx)(n.p,{children:"We are committed to a friendly, safe, and welcoming environment for everyone, regardless of gender identity, sexual orientation, disability, ethnicity, religion, age, physical appearance, or any other personal characteristic."}),"\n",(0,t.jsx)(n.p,{children:"Respect differing opinions and understand that disagreement is not an excuse for rudeness. Disruptive behaviors like spamming, trolling, or flaming are not tolerated."}),"\n",(0,t.jsx)(n.p,{children:"Harassment includes:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Threatening or demeaning behavior"}),"\n",(0,t.jsx)(n.li,{children:"Harmful comments related to personal characteristics"}),"\n",(0,t.jsx)(n.li,{children:"Inappropriate use of nudity, sexual images, or explicit language in public spaces"}),"\n",(0,t.jsx)(n.li,{children:"Threats of harm"}),"\n",(0,t.jsx)(n.li,{children:"Intimidation, stalking, or following"}),"\n",(0,t.jsx)(n.li,{children:"Harassing photography or recording"}),"\n",(0,t.jsx)(n.li,{children:"Disrupting talks or events"}),"\n",(0,t.jsx)(n.li,{children:"Inappropriate physical contact"}),"\n",(0,t.jsx)(n.li,{children:"Unwelcome sexual attention"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"reporting-violations",children:"Reporting Violations"}),"\n",(0,t.jsxs)(n.p,{children:["If you believe someone is harassing you or violating this Code of Conduct, ",(0,t.jsx)(n.a,{href:"https://github.com/ipfs/community/blob/master/code-of-conduct.md#contact-info",children:"contact us"})," with an abuse report. Provide as much detail as possible to help us address the issue effectively."]}),"\n",(0,t.jsx)(n.h2,{id:"consequences",children:"Consequences"}),"\n",(0,t.jsx)(n.p,{children:"Unacceptable behavior will not be tolerated. Anyone asked to stop such behavior must comply immediately. The team may take any action deemed appropriate, including temporary bans or permanent expulsion without warning."}),"\n",(0,t.jsx)(n.h2,{id:"addressing-grievances",children:"Addressing Grievances"}),"\n",(0,t.jsx)(n.p,{children:"If you feel falsely or unfairly accused of violating this Code of Conduct, notify the team. We will handle your grievance appropriately to foster a safe and friendly community."}),"\n",(0,t.jsx)(n.h2,{id:"contact-information",children:"Contact Information"}),"\n",(0,t.jsxs)(n.p,{children:["As our community remains small, the ",(0,t.jsx)(n.a,{href:"https://github.com/ipfs/community/blob/master/code-of-conduct.md#contact-info",children:"IPFS abuse team"})," acts as a neutral arbiter for Code of Conduct and abuse issues within drand."]}),"\n",(0,t.jsx)(n.p,{children:"Contact us if you are unsure about content appropriateness. We are happy to provide guidance."}),"\n",(0,t.jsx)(n.h2,{id:"updates",children:"Updates"}),"\n",(0,t.jsx)(n.p,{children:"This document may be updated periodically. Refer to the git history for changes."}),"\n",(0,t.jsx)(n.h2,{id:"credit-and-license",children:"Credit and License"}),"\n",(0,t.jsxs)(n.p,{children:["This Code of Conduct is based on the ",(0,t.jsx)(n.a,{href:"https://github.com/ipfs/community/blob/master/code-of-conduct.md",children:"IPFS Code of Conduct"}),", the ",(0,t.jsx)(n.a,{href:"https://www.npmjs.com/policies/conduct",children:"npm Code of Conduct"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/code4lib/code-of-conduct/blob/master/code_of_conduct.md",children:"CodeOfConduct4Lib"}),", and the ",(0,t.jsx)(n.a,{href:"http://geekfeminism.wikia.com/",children:"Geek Feminism wiki"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This document may be reused under a ",(0,t.jsx)(n.a,{href:"http://creativecommons.org/licenses/by-sa/4.0/",children:"Creative Commons Attribution-ShareAlike License"}),"."]}),"\n",(0,t.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(6540);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/e6415a3f.992d6845.js b/site/assets/js/e6415a3f.992d6845.js new file mode 100644 index 00000000..a4099433 --- /dev/null +++ b/site/assets/js/e6415a3f.992d6845.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2066],{6877:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>d,metadata:()=>l,toc:()=>t});var r=i(4848),s=i(8453);const d={id:"3-1-dev-guide-organization",title:"3.1 DevGuide: Organization",description:"A table of contents for drand packages and related bits."},c="3.1 DevGuide: Organization",l={id:"dev-guide/3-1-dev-guide-organization",title:"3.1 DevGuide: Organization",description:"A table of contents for drand packages and related bits.",source:"@site/docs/03_dev-guide/03-01-DevGuide_Organization.md",sourceDirName:"03_dev-guide",slug:"/dev-guide/3-1-dev-guide-organization",permalink:"/drand-docs/docs/dev-guide/3-1-dev-guide-organization",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/03_dev-guide/03-01-DevGuide_Organization.md",tags:[],version:"current",frontMatter:{id:"3-1-dev-guide-organization",title:"3.1 DevGuide: Organization",description:"A table of contents for drand packages and related bits."},sidebar:"docsSidebar",previous:{title:"3.0 Developers Guide",permalink:"/drand-docs/docs/dev-guide/3-0-dev-guide"},next:{title:"3.2 drand-client CLI",permalink:"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli"}},o={},t=[{value:"<strong>Top-level Packages</strong>",id:"top-level-packages",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"31-devguide-organization",children:"3.1 DevGuide: Organization"})}),"\n",(0,r.jsx)(n.h2,{id:"top-level-packages",children:(0,r.jsx)(n.strong,{children:"Top-level Packages"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"chain"}),"\xa0- Code for generating the sequence of beacons (implementation of which is in\xa0",(0,r.jsx)(n.code,{children:"chain/beacon"}),") after setup."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"boltdb"}),"\xa0- BoltDB storage backend."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"errors"}),"\xa0- common errors for the chain package."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"memdb"}),"\xa0- in-memory storage backend."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postgresdb"}),"\xa0- PostgreSQL storage backend."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"client"}),"\xa0- The drand client library - composition utilities for fail-over and reliable abstraction."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"client/grpc"}),"\xa0- The concrete gRPC client implementation."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"client/http"}),"\xa0- The concrete HTTP client implementation."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"client/test"}),"\xa0- Mock client implementations for testing."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"cmd"}),"\xa0- Binary entry points."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cmd/client"}),"\xa0- A client for fetching randomness."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cmd/client/lib"}),"\xa0- A common library for creating a client shared by\xa0",(0,r.jsx)(n.code,{children:"cmd/client"}),"\xa0and\xa0",(0,r.jsx)(n.code,{children:"cmd/relay"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cmd/drand-cli"}),"\xa0- The main drand group member binary."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cmd/relay"}),"\xa0- A relay that pulls randomness from a drand group member and exposes an HTTP server interface."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cmd/relay-gossip"}),"\xa0- A relay that pulls randomness from a group member and publishes it over a libp2p gossipsub topic."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"crypto"}),"\xa0- Holds the schemes supported by drand."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"core"}),"\xa0- The primary Service interface of drand commands."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"core/migration"}),"\xa0- A library for migrating drand files from single-beacon to multi-beacon version."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"demo"}),"\xa0- A framework for integration testing."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"deploy"}),"\xa0- Records of previous drand deployments."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"docker"}),"\xa0- Helpers for docker image packaging."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"docs"}),"\xa0- Here."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"entropy"}),"\xa0- A common abstraction for ingesting randomness."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"fs"}),"\xa0- Utilities for durable state storage."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"hooks"}),"\xa0- Docker helper entry point."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"http"}),"\xa0- The publicly exposed HTTP server for exposing randomness."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"key"}),"\xa0- Validation of signatures."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"log"}),"\xa0- Common logging library."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lp2p"}),"\xa0- Utilities for constructing a\xa0",(0,r.jsx)(n.a,{href:"https://libp2p.io/",children:"libp2p"}),"\xa0host."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"lp2p/client"}),"\xa0- The concrete gossip client implementation."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"metrics"}),"\xa0- The Prometheus metrics server."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"net"}),"\xa0- gRPC service handlers for inter-node communication."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"protobuf/drand"}),"\xa0- Definitions for the wire format interface of inter-node communication."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"test"}),"\xa0- Testing helper utilities."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"test/docker"}),"\xa0- Files and related scripts for testing drand networks on docker."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.hr,{})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>l});var r=i(6540);const s={},d=r.createContext(s);function c(e){const n=r.useContext(d);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/e9a994e3.81a04118.js b/site/assets/js/e9a994e3.81a04118.js new file mode 100644 index 00000000..88ffd324 --- /dev/null +++ b/site/assets/js/e9a994e3.81a04118.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[1788],{761:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"drand-greetings","metadata":{"permalink":"/drand-docs/blog/drand-greetings","editUrl":"https://github.com/kentbull/drand-docs/tree/main/blog/2024-08-19-greetings.md","source":"@site/blog/2024-08-19-greetings.md","title":"Greetings!","description":"Congratulations, you have made your first post!","date":"2024-08-19T00:00:00.000Z","tags":[{"inline":false,"label":"Hello","permalink":"/drand-docs/blog/tags/hello","description":"Hello tag description"}],"readingTime":0.345,"hasTruncateMarker":true,"authors":[{"name":"Kent Bull","title":"drand Community Manager","url":"https://kentbull.com","page":{"permalink":"/drand-docs/blog/authors/kentbull"},"socials":{"x":"https://x.com/kentopbull","github":"https://github.com/kentbull"},"imageURL":"https://avatars.githubusercontent.com/u/65027257?v=4","key":"kentbull"},{"name":"Dave Grantham","title":"drand Community Scout Master","url":"https://cryptid.tech","page":{"permalink":"/drand-docs/blog/authors/all-dave-grantham-articles"},"socials":{"github":"https://github.com/dhuseby"},"imageURL":"https://avatars.githubusercontent.com/u/5017470?v=4","key":"dgrantham"}],"frontMatter":{"slug":"drand-greetings","title":"Greetings!","authors":["kentbull","dgrantham"],"tags":["hello"]},"unlisted":false,"nextItem":{"title":"Welcome","permalink":"/drand-docs/blog/welcome"}},"content":"Congratulations, you have made your first post!\\n\\nFeel free to play around and edit this post as much as you like.\\n\\n\x3c!-- truncate --\x3e\\n\\nWe are building a replacement for the drand community docs.\\n\\nOnce we are done then all of the docs will be done with docusaurus.\\n\\nHow is line six?\\n\\n:::tip[Or eight?]\\n\\nOr eight lines?\\n\\n:::\\n\\n:::danger[Or ten?]\\n\\nOr even ten? Oh no!\\n\\n:::\\n\\nHow about twenty?"},{"id":"welcome","metadata":{"permalink":"/drand-docs/blog/welcome","editUrl":"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-26-welcome/index.md","source":"@site/blog/2021-08-26-welcome/index.md","title":"Welcome","description":"Docusaurus blogging features are powered by the blog plugin.","date":"2021-08-26T00:00:00.000Z","tags":[{"inline":false,"label":"Facebook","permalink":"/drand-docs/blog/tags/facebook","description":"Facebook tag description"},{"inline":false,"label":"Hello","permalink":"/drand-docs/blog/tags/hello","description":"Hello tag description"},{"inline":false,"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description"}],"readingTime":0.465,"hasTruncateMarker":true,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","page":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles"},"socials":{"x":"https://x.com/sebastienlorber","linkedin":"https://www.linkedin.com/in/sebastienlorber/","github":"https://github.com/slorber","newsletter":"https://thisweekinreact.com"},"imageURL":"https://github.com/slorber.png","key":"slorber"},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","page":{"permalink":"/drand-docs/blog/authors/yangshun"},"socials":{"x":"https://x.com/yangshunz","github":"https://github.com/yangshun"},"imageURL":"https://github.com/yangshun.png","key":"yangshun"}],"frontMatter":{"slug":"welcome","title":"Welcome","authors":["slorber","yangshun"],"tags":["facebook","hello","docusaurus"]},"unlisted":false,"prevItem":{"title":"Greetings!","permalink":"/drand-docs/blog/drand-greetings"},"nextItem":{"title":"MDX Blog Post","permalink":"/drand-docs/blog/mdx-blog-post"}},"content":"[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).\\n\\nHere are a few tips you might find useful.\\n\\n\x3c!-- truncate --\x3e\\n\\nSimply add Markdown files (or folders) to the `blog` directory.\\n\\nRegular blog authors can be added to `authors.yml`.\\n\\nThe blog post date can be extracted from filenames, such as:\\n\\n- `2019-05-30-welcome.md`\\n- `2019-05-30-welcome/index.md`\\n\\nA blog post folder can be convenient to co-locate blog post images:\\n\\n![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)\\n\\nThe blog supports tags as well!\\n\\n**And if you don\'t want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config."},{"id":"mdx-blog-post","metadata":{"permalink":"/drand-docs/blog/mdx-blog-post","editUrl":"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-01-mdx-blog-post.mdx","source":"@site/blog/2021-08-01-mdx-blog-post.mdx","title":"MDX Blog Post","description":"Blog posts support Docusaurus Markdown features, such as MDX.","date":"2021-08-01T00:00:00.000Z","tags":[{"inline":false,"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description"}],"readingTime":0.235,"hasTruncateMarker":true,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","page":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles"},"socials":{"x":"https://x.com/sebastienlorber","linkedin":"https://www.linkedin.com/in/sebastienlorber/","github":"https://github.com/slorber","newsletter":"https://thisweekinreact.com"},"imageURL":"https://github.com/slorber.png","key":"slorber"}],"frontMatter":{"slug":"mdx-blog-post","title":"MDX Blog Post","authors":["slorber"],"tags":["docusaurus"]},"unlisted":false,"prevItem":{"title":"Welcome","permalink":"/drand-docs/blog/welcome"},"nextItem":{"title":"Long Blog Post","permalink":"/drand-docs/blog/long-blog-post"}},"content":"Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).\\n\\n:::tip\\n\\nUse the power of React to create interactive blog posts.\\n\\n:::\\n\\n{/* truncate */}\\n\\nFor example, use JSX to create an interactive button:\\n\\n```js\\n<button onClick={() => alert(\'button clicked!\')}>Click me!</button>\\n```\\n\\n<button onClick={() => alert(\'button clicked!\')}>Click me!</button>"},{"id":"long-blog-post","metadata":{"permalink":"/drand-docs/blog/long-blog-post","editUrl":"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-29-long-blog-post.md","source":"@site/blog/2019-05-29-long-blog-post.md","title":"Long Blog Post","description":"This is the summary of a very long blog post,","date":"2019-05-29T00:00:00.000Z","tags":[{"inline":false,"label":"Hello","permalink":"/drand-docs/blog/tags/hello","description":"Hello tag description"},{"inline":false,"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description"}],"readingTime":2.06,"hasTruncateMarker":true,"authors":[{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","page":{"permalink":"/drand-docs/blog/authors/yangshun"},"socials":{"x":"https://x.com/yangshunz","github":"https://github.com/yangshun"},"imageURL":"https://github.com/yangshun.png","key":"yangshun"}],"frontMatter":{"slug":"long-blog-post","title":"Long Blog Post","authors":"yangshun","tags":["hello","docusaurus"]},"unlisted":false,"prevItem":{"title":"MDX Blog Post","permalink":"/drand-docs/blog/mdx-blog-post"},"nextItem":{"title":"First Blog Post","permalink":"/drand-docs/blog/first-blog-post"}},"content":"This is the summary of a very long blog post,\\n\\nUse a `\x3c!--` `truncate` `--\x3e` comment to limit blog post size in the list view.\\n\\n\x3c!-- truncate --\x3e\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\\n\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"},{"id":"first-blog-post","metadata":{"permalink":"/drand-docs/blog/first-blog-post","editUrl":"https://github.com/kentbull/drand-docs/tree/main/blog/2019-05-28-first-blog-post.md","source":"@site/blog/2019-05-28-first-blog-post.md","title":"First Blog Post","description":"Lorem ipsum dolor sit amet...","date":"2019-05-28T00:00:00.000Z","tags":[{"inline":false,"label":"Hola","permalink":"/drand-docs/blog/tags/hola","description":"Hola tag description"},{"inline":false,"label":"Docusaurus","permalink":"/drand-docs/blog/tags/docusaurus","description":"Docusaurus tag description"}],"readingTime":0.135,"hasTruncateMarker":true,"authors":[{"name":"S\xe9bastien Lorber","title":"Docusaurus maintainer","url":"https://sebastienlorber.com","page":{"permalink":"/drand-docs/blog/authors/all-sebastien-lorber-articles"},"socials":{"x":"https://x.com/sebastienlorber","linkedin":"https://www.linkedin.com/in/sebastienlorber/","github":"https://github.com/slorber","newsletter":"https://thisweekinreact.com"},"imageURL":"https://github.com/slorber.png","key":"slorber"},{"name":"Yangshun Tay","title":"Front End Engineer @ Facebook","url":"https://github.com/yangshun","page":{"permalink":"/drand-docs/blog/authors/yangshun"},"socials":{"x":"https://x.com/yangshunz","github":"https://github.com/yangshun"},"imageURL":"https://github.com/yangshun.png","key":"yangshun"}],"frontMatter":{"slug":"first-blog-post","title":"First Blog Post","authors":["slorber","yangshun"],"tags":["hola","docusaurus"]},"unlisted":false,"prevItem":{"title":"Long Blog Post","permalink":"/drand-docs/blog/long-blog-post"}},"content":"Lorem ipsum dolor sit amet...\\n\\n\x3c!-- truncate --\x3e\\n\\n...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet"}]}}')}}]); \ No newline at end of file diff --git a/site/assets/js/f132e997.dafb65b3.js b/site/assets/js/f132e997.dafb65b3.js new file mode 100644 index 00000000..f7851963 --- /dev/null +++ b/site/assets/js/f132e997.dafb65b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[453],{5542:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>a});var o=t(4848),r=t(8453);const s={id:"2-0-concepts",title:"2.0 Concepts",description:"A brief introduction to key concepts"},c="2.0 CONCEPTS (Getting Started)",i={id:"concepts/2-0-concepts",title:"2.0 Concepts",description:"A brief introduction to key concepts",source:"@site/docs/02_concepts/02-00-CONCEPTS-Getting-Started.md",sourceDirName:"02_concepts",slug:"/concepts/2-0-concepts",permalink:"/drand-docs/docs/concepts/2-0-concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/kentbull/drand-docs/tree/main/docs/02_concepts/02-00-CONCEPTS-Getting-Started.md",tags:[],version:"current",frontMatter:{id:"2-0-concepts",title:"2.0 Concepts",description:"A brief introduction to key concepts"},sidebar:"docsSidebar",previous:{title:"2.0 CONCEPTS (Getting Started)",permalink:"/drand-docs/docs/category/20-concepts-getting-started"},next:{title:"2.1 Cryptography",permalink:"/drand-docs/docs/concepts/2-1-concepts-cryptography"}},d={},a=[];function l(e){const n={a:"a",h1:"h1",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"20-concepts-getting-started",children:"2.0 CONCEPTS (Getting Started)"})}),"\n",(0,o.jsxs)(n.p,{children:["This section introduces the key concepts behind drand. For information about consuming randomness from a drand network, see the\xa0",(0,o.jsx)(n.a,{href:"../dev-guide/3-0-dev-guide",children:"**Developer's Guide"}),". F**or help running a drand network, see the entries under the \u201cFor Operators\u201d section. To run node(s) or relay(s) for the ",(0,o.jsx)(n.a,{href:"https://leagueofentropy.org",children:"League of Entropy"}),", please ",(0,o.jsx)(n.a,{href:"https://docs.google.com/forms/d/e/1FAIpQLSfGwiSz2_gq6NHo3MGyJyH4_GKv_TcY1YmbwkctKlCh5aVToA/viewform?usp=sf_link",children:"apply to the League"})," to be considered for membership."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Read the ",(0,o.jsx)(n.a,{href:"../about/1-0-about",children:(0,o.jsx)(n.strong,{children:'What is "drand"?'})})," section to learn more about drand\u2019s main goals. It gives an overview of the challenges drand aims to address."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"2-1-concepts-cryptography",children:(0,o.jsx)(n.strong,{children:"Cryptography"})}),"\xa0provides an overview of the cryptographic building blocks that drand uses to generate publicly-verifiable, unbiased, and unpredictable randomness in a distributed manner."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"2-2-concepts-security-model",children:(0,o.jsx)(n.strong,{children:"Security Model"})}),"\xa0describes the security considerations taken into account when designing and building drand."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"2-3-concepts-specification",children:(0,o.jsx)(n.strong,{children:"Specification"})}),"\xa0is a formal description of the drand protocols."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"2-4-concepts-timelock-encryption",children:(0,o.jsx)(n.strong,{children:"Timelock Encryption"})}),"\xa0gives all the information on our Timelock Encryption scheme, and links on where to find the tools to use it."]}),"\n"]}),"\n",(0,o.jsx)(n.hr,{})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>i});var o=t(6540);const r={},s=o.createContext(r);function c(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/f25a3067.d1d556b0.js b/site/assets/js/f25a3067.d1d556b0.js new file mode 100644 index 00000000..3893d3d6 --- /dev/null +++ b/site/assets/js/f25a3067.d1d556b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[6121],{7449:l=>{l.exports=JSON.parse('{"tag":{"label":"Hello","permalink":"/drand-docs/blog/tags/hello","description":"Hello tag description","allTagsPath":"/drand-docs/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/drand-docs/blog/tags/hello","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/site/assets/js/f4f34a3a.7300eb64.js b/site/assets/js/f4f34a3a.7300eb64.js new file mode 100644 index 00000000..4579cf6f --- /dev/null +++ b/site/assets/js/f4f34a3a.7300eb64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[3637],{5512:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>c});var s=o(4848),r=o(8453);const n={slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},a=void 0,i={permalink:"/drand-docs/blog/mdx-blog-post",editUrl:"https://github.com/kentbull/drand-docs/tree/main/blog/2021-08-01-mdx-blog-post.mdx",source:"@site/blog/2021-08-01-mdx-blog-post.mdx",title:"MDX Blog Post",description:"Blog posts support Docusaurus Markdown features, such as MDX.",date:"2021-08-01T00:00:00.000Z",tags:[{inline:!1,label:"Docusaurus",permalink:"/drand-docs/blog/tags/docusaurus",description:"Docusaurus tag description"}],readingTime:.235,hasTruncateMarker:!0,authors:[{name:"S\xe9bastien Lorber",title:"Docusaurus maintainer",url:"https://sebastienlorber.com",page:{permalink:"/drand-docs/blog/authors/all-sebastien-lorber-articles"},socials:{x:"https://x.com/sebastienlorber",linkedin:"https://www.linkedin.com/in/sebastienlorber/",github:"https://github.com/slorber",newsletter:"https://thisweekinreact.com"},imageURL:"https://github.com/slorber.png",key:"slorber"}],frontMatter:{slug:"mdx-blog-post",title:"MDX Blog Post",authors:["slorber"],tags:["docusaurus"]},unlisted:!1,prevItem:{title:"Welcome",permalink:"/drand-docs/blog/welcome"},nextItem:{title:"Long Blog Post",permalink:"/drand-docs/blog/long-blog-post"}},l={authorsImageUrls:[void 0]},c=[];function u(t){const e={a:"a",admonition:"admonition",p:"p",...(0,r.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(e.p,{children:["Blog posts support ",(0,s.jsx)(e.a,{href:"https://docusaurus.io/docs/markdown-features",children:"Docusaurus Markdown features"}),", such as ",(0,s.jsx)(e.a,{href:"https://mdxjs.com/",children:"MDX"}),"."]}),"\n",(0,s.jsx)(e.admonition,{type:"tip",children:(0,s.jsx)(e.p,{children:"Use the power of React to create interactive blog posts."})})]})}function d(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(u,{...t})}):u(t)}},8453:(t,e,o)=>{o.d(e,{R:()=>a,x:()=>i});var s=o(6540);const r={},n=s.createContext(r);function a(t){const e=s.useContext(n);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:a(t.components),s.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/site/assets/js/ff1a36d1.29f290f7.js b/site/assets/js/ff1a36d1.29f290f7.js new file mode 100644 index 00000000..c1e371a2 --- /dev/null +++ b/site/assets/js/ff1a36d1.29f290f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[2239],{2326:a=>{a.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"1.0 About (What is \\"drand\\"?)","description":"A brief explanation of drand","slug":"/category/10-about-what-is-drand","permalink":"/drand-docs/docs/category/10-about-what-is-drand","sidebar":"docsSidebar","navigation":{"previous":{"title":"Home","permalink":"/drand-docs/docs/home"},"next":{"title":"1.0 About","permalink":"/drand-docs/docs/about/1-0-about"}}}}')}}]); \ No newline at end of file diff --git a/site/assets/js/main.a4869a1a.js b/site/assets/js/main.a4869a1a.js new file mode 100644 index 00000000..c14adc3e --- /dev/null +++ b/site/assets/js/main.a4869a1a.js @@ -0,0 +1,2 @@ +/*! For license information please see main.a4869a1a.js.LICENSE.txt */ +(self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"0a40e68b":[()=>n.e(9517).then(n.bind(n,8008)),"@site/docs/home.mdx",8008],"0f048bff":[()=>n.e(8551).then(n.bind(n,1516)),"@site/docs/02_concepts/02-02-Concepts_Security_Model.md",1516],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,4136)),"@theme/DocCategoryGeneratedIndexPage",4136],17896441:[()=>Promise.all([n.e(1869),n.e(6905),n.e(8401)]).then(n.bind(n,833)),"@theme/DocItem",833],"1ab32222":[()=>n.e(4532).then(n.bind(n,8716)),"@site/docs/04_ops-guide/04-01-DevOps_Deployment.md",8716],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,5579)),"@site/src/pages/index.tsx",5579],"2080a1aa":[()=>n.e(3833).then(n.t.bind(n,6705,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-tags-hola-d74.json",6705],"24f06274":[()=>n.e(4318).then(n.t.bind(n,9202,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-60-drand-faq-61e.json",9202],"2a9db486":[()=>n.e(2691).then(n.t.bind(n,57,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-authors-6ab.json",57],"2acb4dcc":[()=>n.e(9025).then(n.bind(n,5645)),"@site/docs/06_drand-faq/06-00-DRAND_FAQ.md",5645],"2b46ab97":[()=>n.e(580).then(n.t.bind(n,2405,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-53d.json",2405],"33fc5bb8":[()=>Promise.all([n.e(1869),n.e(6905),n.e(3347),n.e(867)]).then(n.bind(n,778)),"@theme/Blog/Pages/BlogAuthorsPostsPage",778],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"3e814fbd":[()=>n.e(1502).then(n.t.bind(n,1026,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-authors-all-sebastien-lorber-articles-347.json",1026],"4c7240d8":[()=>n.e(3655).then(n.bind(n,3823)),"@site/docs/03_dev-guide/03-03-DevGuide_Client_Libraries.mdx",3823],"4e0eb3dc":[()=>n.e(1245).then(n.bind(n,101)),"@site/blog/2024-08-19-greetings.md",101],"52a7705f":[()=>n.e(5218).then(n.bind(n,3027)),"@site/docs/02_concepts/02-01-Concepts_Cryptography.md",3027],"5589aa37":[()=>n.e(2268).then(n.bind(n,3018)),"@site/docs/04_ops-guide/04-02-DevOps_Docker_Install.md",3018],"56aab574":[()=>n.e(4342).then(n.bind(n,8818)),"@site/docs/02_concepts/02-04-Concepts_Timelock_Encryption.md",8818],59362658:[()=>n.e(9325).then(n.bind(n,1180)),"@site/blog/2021-08-01-mdx-blog-post.mdx",1180],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"621db11d":[()=>Promise.all([n.e(1869),n.e(3347),n.e(4212)]).then(n.bind(n,3250)),"@theme/Blog/Pages/BlogAuthorsListPage",3250],"6412f335":[()=>n.e(4205).then(n.bind(n,8169)),"@site/docs/04_ops-guide/04-05-DevOps_Command-line_Tools.md",8169],"6825e205":[()=>n.e(5706).then(n.bind(n,1622)),"@site/docs/02_concepts/02-03-Concepts_Specification.md",1622],"6875c492":[()=>Promise.all([n.e(1869),n.e(6905),n.e(3347),n.e(4813)]).then(n.bind(n,3069)),"@theme/BlogTagsPostsPage",3069],"6c2aefca":[()=>n.e(4960).then(n.t.bind(n,5662,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-50-drand-community-4e1.json",5662],"6eaa7728":[()=>n.e(3390).then(n.bind(n,5770)),"@site/docs/03_dev-guide/03-04-DevGuide_HTTP_API.md",5770],72684690:[()=>n.e(5719).then(n.bind(n,492)),"@site/docs/03_dev-guide/03-05-DevGuide_PubSub_Network.md",492],"73664a40":[()=>n.e(1972).then(n.bind(n,9581)),"@site/blog/2019-05-29-long-blog-post.md",9581],"7661071f":[()=>n.e(8737).then(n.bind(n,4137)),"@site/blog/2021-08-26-welcome/index.md?truncated=true",4137],"78fc3e97":[()=>n.e(3179).then(n.bind(n,3763)),"@site/docs/03_dev-guide/03-02-DevGuide_drand-client_CLI.md",3763],"7c330c58":[()=>n.e(2339).then(n.bind(n,1008)),"@site/docs/04_ops-guide/04-04-DevOps_Metrics_Guide.md",1008],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"8717b14a":[()=>n.e(3694).then(n.bind(n,1615)),"@site/blog/2019-05-29-long-blog-post.md?truncated=true",1615],"8806b065":[()=>n.e(1800).then(n.t.bind(n,3692,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-40-operators-guide-b53.json",3692],"8f578ac3":[()=>n.e(6574).then(n.t.bind(n,8915,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-30-developers-guide-ddd.json",8915],"91f57a82":[()=>n.e(9676).then(n.bind(n,6195)),"@site/docs/03_dev-guide/03-00-DEVELOPERS_GUIDE.md",6195],"925b3f96":[()=>n.e(8609).then(n.bind(n,5026)),"@site/blog/2019-05-28-first-blog-post.md?truncated=true",5026],"93a0da4a":[()=>n.e(2964).then(n.t.bind(n,8702,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-tags-e8f.json",8702],"9c3d38a1":[()=>n.e(5081).then(n.bind(n,1586)),"@site/docs/03_dev-guide/03-06-DevGuide_Code_Examples.md",1586],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(6905),n.e(3347),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,1723)),"@theme/DocVersionRoot",1723],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aa23f094:[()=>n.e(4093).then(n.t.bind(n,6944,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-authors-kentbull-8aa.json",6944],aa909e52:[()=>n.e(3573).then(n.t.bind(n,4095,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-authors-yangshun-2f9.json",4095],ab32f63b:[()=>n.e(8082).then(n.t.bind(n,1106,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-540.json",1106],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],b0017b1d:[()=>n.e(2148).then(n.bind(n,7855)),"@site/docs/05_drand-community/05-00-DRAND_COMMUNITY.md",7855],bba71062:[()=>n.e(3472).then(n.bind(n,2555)),"@site/docs/05_drand-community/05-01-Community_Contributing.md",2555],c6806766:[()=>n.e(3537).then(n.t.bind(n,9569,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-authors-all-dave-grantham-articles-6e2.json",9569],c88e9617:[()=>n.e(9170).then(n.t.bind(n,4659,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-tags-docusaurus-843.json",4659],ccc49370:[()=>Promise.all([n.e(1869),n.e(6905),n.e(3347),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],ceb4708b:[()=>n.e(4230).then(n.t.bind(n,9806,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-tags-facebook-3cd.json",9806],cf1eeb86:[()=>n.e(3941).then(n.bind(n,8497)),"@site/docs/01_about/01-00-about.md",8497],d1958d43:[()=>n.e(4115).then(n.bind(n,8288)),"@site/docs/04_ops-guide/04-00-OPERATORS_GUIDE.md",8288],d954c059:[()=>n.e(5858).then(n.bind(n,1255)),"@site/blog/2024-08-19-greetings.md?truncated=true",1255],d9f32620:[()=>n.e(5557).then(n.bind(n,7447)),"@site/blog/2021-08-26-welcome/index.md",7447],da23e8d3:[()=>n.e(1447).then(n.bind(n,9762)),"@site/docs/04_ops-guide/04-03-DevOps_Storage_Backends.md",9762],e273c56f:[()=>n.e(9328).then(n.bind(n,4014)),"@site/blog/2019-05-28-first-blog-post.md",4014],e4fffcf9:[()=>n.e(2542).then(n.t.bind(n,2843,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-20-concepts-getting-started-0e4.json",2843],e50fef06:[()=>n.e(1548).then(n.bind(n,8011)),"@site/docs/01_about/01-01-Governance.md",8011],e6415a3f:[()=>n.e(2066).then(n.bind(n,6877)),"@site/docs/03_dev-guide/03-01-DevGuide_Organization.md",6877],e9a994e3:[()=>n.e(1788).then(n.t.bind(n,761,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-archive-009.json",761],f132e997:[()=>n.e(453).then(n.bind(n,5542)),"@site/docs/02_concepts/02-00-CONCEPTS-Getting-Started.md",5542],f25a3067:[()=>n.e(6121).then(n.t.bind(n,7449,19)),"@generated/docusaurus-plugin-content-blog/default/p/drand-docs-blog-tags-hello-e13.json",7449],f4f34a3a:[()=>n.e(3637).then(n.bind(n,5512)),"@site/blog/2021-08-01-mdx-blog-post.mdx?truncated=true",5512],ff1a36d1:[()=>n.e(2239).then(n.t.bind(n,2326,19)),"@generated/docusaurus-plugin-content-docs/default/p/drand-docs-docs-category-10-about-what-is-drand-7c4.json",2326]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("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%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("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",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("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),u=n(3102);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));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 i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const s=o.__props;return delete o.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(a,{...o,...s,...n})})}})}const p=[{path:"/drand-docs/blog",component:d("/drand-docs/blog","81b"),exact:!0},{path:"/drand-docs/blog/archive",component:d("/drand-docs/blog/archive","29a"),exact:!0},{path:"/drand-docs/blog/authors",component:d("/drand-docs/blog/authors","c57"),exact:!0},{path:"/drand-docs/blog/authors/all-dave-grantham-articles",component:d("/drand-docs/blog/authors/all-dave-grantham-articles","02f"),exact:!0},{path:"/drand-docs/blog/authors/all-sebastien-lorber-articles",component:d("/drand-docs/blog/authors/all-sebastien-lorber-articles","864"),exact:!0},{path:"/drand-docs/blog/authors/kentbull",component:d("/drand-docs/blog/authors/kentbull","26f"),exact:!0},{path:"/drand-docs/blog/authors/yangshun",component:d("/drand-docs/blog/authors/yangshun","7f8"),exact:!0},{path:"/drand-docs/blog/drand-greetings",component:d("/drand-docs/blog/drand-greetings","3bc"),exact:!0},{path:"/drand-docs/blog/first-blog-post",component:d("/drand-docs/blog/first-blog-post","b37"),exact:!0},{path:"/drand-docs/blog/long-blog-post",component:d("/drand-docs/blog/long-blog-post","abc"),exact:!0},{path:"/drand-docs/blog/mdx-blog-post",component:d("/drand-docs/blog/mdx-blog-post","eeb"),exact:!0},{path:"/drand-docs/blog/tags",component:d("/drand-docs/blog/tags","8e0"),exact:!0},{path:"/drand-docs/blog/tags/docusaurus",component:d("/drand-docs/blog/tags/docusaurus","630"),exact:!0},{path:"/drand-docs/blog/tags/facebook",component:d("/drand-docs/blog/tags/facebook","a48"),exact:!0},{path:"/drand-docs/blog/tags/hello",component:d("/drand-docs/blog/tags/hello","2e7"),exact:!0},{path:"/drand-docs/blog/tags/hola",component:d("/drand-docs/blog/tags/hola","6c2"),exact:!0},{path:"/drand-docs/blog/welcome",component:d("/drand-docs/blog/welcome","0e9"),exact:!0},{path:"/drand-docs/docs",component:d("/drand-docs/docs","adf"),routes:[{path:"/drand-docs/docs",component:d("/drand-docs/docs","912"),routes:[{path:"/drand-docs/docs",component:d("/drand-docs/docs","5c4"),routes:[{path:"/drand-docs/docs/about/1-0-about",component:d("/drand-docs/docs/about/1-0-about","819"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/about/1-1-governance",component:d("/drand-docs/docs/about/1-1-governance","b7d"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/10-about-what-is-drand",component:d("/drand-docs/docs/category/10-about-what-is-drand","a69"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/20-concepts-getting-started",component:d("/drand-docs/docs/category/20-concepts-getting-started","f86"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/30-developers-guide",component:d("/drand-docs/docs/category/30-developers-guide","409"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/40-operators-guide",component:d("/drand-docs/docs/category/40-operators-guide","89a"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/50-drand-community",component:d("/drand-docs/docs/category/50-drand-community","f63"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/category/60-drand-faq",component:d("/drand-docs/docs/category/60-drand-faq","c0a"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/concepts/2-0-concepts",component:d("/drand-docs/docs/concepts/2-0-concepts","8aa"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/concepts/2-1-concepts-cryptography",component:d("/drand-docs/docs/concepts/2-1-concepts-cryptography","360"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/concepts/2-2-concepts-security-model",component:d("/drand-docs/docs/concepts/2-2-concepts-security-model","1b3"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/concepts/2-3-concepts-specification",component:d("/drand-docs/docs/concepts/2-3-concepts-specification","662"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption",component:d("/drand-docs/docs/concepts/2-4-concepts-timelock-encryption","519"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-0-dev-guide",component:d("/drand-docs/docs/dev-guide/3-0-dev-guide","41d"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-1-dev-guide-organization",component:d("/drand-docs/docs/dev-guide/3-1-dev-guide-organization","6ff"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli",component:d("/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli","da0"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries",component:d("/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries","89e"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api",component:d("/drand-docs/docs/dev-guide/3-4-dev-guide-http-api","f5e"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network",component:d("/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network","693"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples",component:d("/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples","5c6"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/drand-community/5-0-drand-community",component:d("/drand-docs/docs/drand-community/5-0-drand-community","279"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/drand-community/5-1-drand-community-contributing",component:d("/drand-docs/docs/drand-community/5-1-drand-community-contributing","42a"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/drand-faq/6-0-drand-faq",component:d("/drand-docs/docs/drand-faq/6-0-drand-faq","ceb"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/home",component:d("/drand-docs/docs/home","652"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-0-ops-guide",component:d("/drand-docs/docs/ops-guide/4-0-ops-guide","7f8"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment",component:d("/drand-docs/docs/ops-guide/4-1-ops-guide-deployment","8c4"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install",component:d("/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install","e5c"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends",component:d("/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends","584"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide",component:d("/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide","c97"),exact:!0,sidebar:"docsSidebar"},{path:"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools",component:d("/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools","2e5"),exact:!0,sidebar:"docsSidebar"}]}]}]},{path:"/drand-docs/",component:d("/drand-docs/","56f"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),l=n(4784),s=n(8193);const c=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5260),h=n(4586),b=n(6025),y=n(6342),v=n(1213),w=n(2131),k=n(4090);const x="default";var S=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function A(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.A,{tag:x,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var j=n(6125),P=n(6988),N=n(205);function R(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 o=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const L=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?R("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=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(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(0,f.jsx)(L,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" 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="${z}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${z}');\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,h.A)();return(0,f.jsx)(f.Fragment,{children:!s.A.canUseDOM&&(0,f.jsx)(m.A,{children:(0,f.jsx)("script",{children:B(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,f.jsx)($,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,h.A)(),a=(0,b.Ay)(e),{htmlLang:i,direction:l}=o[r];return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("html",{lang:i,dir:l}),(0,f.jsx)("title",{children:t}),(0,f.jsx)("meta",{property:"og:title",content:t}),(0,f.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,f.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,f.jsx)("link",{rel:"icon",href:a})]})}var H=n(7489),G=n(2303);function V(){const e=(0,G.A)();return(0,f.jsx)(m.A,{children:(0,f.jsx)("html",{"data-has-hydrated":e})})}const W=(0,p.v)(u.A);function Q(){const e=function(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,p.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(I,{location:e,children:W})}function K(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(P.l,{children:(0,f.jsxs)(j.x,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(A,{}),(0,f.jsx)(U,{}),(0,f.jsx)(Q,{})]}),(0,f.jsx)(V,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}: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 X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),O(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};O(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/drand-docs/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/drand-docs/docs","mainDocId":"home","docs":[{"id":"about/1-0-about","path":"/drand-docs/docs/about/1-0-about","sidebar":"docsSidebar"},{"id":"about/1-1-governance","path":"/drand-docs/docs/about/1-1-governance","sidebar":"docsSidebar"},{"id":"concepts/2-0-concepts","path":"/drand-docs/docs/concepts/2-0-concepts","sidebar":"docsSidebar"},{"id":"concepts/2-1-concepts-cryptography","path":"/drand-docs/docs/concepts/2-1-concepts-cryptography","sidebar":"docsSidebar"},{"id":"concepts/2-2-concepts-security-model","path":"/drand-docs/docs/concepts/2-2-concepts-security-model","sidebar":"docsSidebar"},{"id":"concepts/2-3-concepts-specification","path":"/drand-docs/docs/concepts/2-3-concepts-specification","sidebar":"docsSidebar"},{"id":"concepts/2-4-concepts-timelock-encryption","path":"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption","sidebar":"docsSidebar"},{"id":"dev-guide/3-0-dev-guide","path":"/drand-docs/docs/dev-guide/3-0-dev-guide","sidebar":"docsSidebar"},{"id":"dev-guide/3-1-dev-guide-organization","path":"/drand-docs/docs/dev-guide/3-1-dev-guide-organization","sidebar":"docsSidebar"},{"id":"dev-guide/3-2-dev-guide-drand-client-cli","path":"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli","sidebar":"docsSidebar"},{"id":"dev-guide/3-3-dev-guide-client-libraries","path":"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries","sidebar":"docsSidebar"},{"id":"dev-guide/3-4-dev-guide-http-api","path":"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api","sidebar":"docsSidebar"},{"id":"dev-guide/3-5-dev-guide-pubsub-network","path":"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network","sidebar":"docsSidebar"},{"id":"dev-guide/3-6-dev-guide-code-examples","path":"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples","sidebar":"docsSidebar"},{"id":"drand-community/5-0-drand-community","path":"/drand-docs/docs/drand-community/5-0-drand-community","sidebar":"docsSidebar"},{"id":"drand-community/5-1-drand-community-contributing","path":"/drand-docs/docs/drand-community/5-1-drand-community-contributing","sidebar":"docsSidebar"},{"id":"drand-faq/6-0-drand-faq","path":"/drand-docs/docs/drand-faq/6-0-drand-faq","sidebar":"docsSidebar"},{"id":"home","path":"/drand-docs/docs/home","sidebar":"docsSidebar"},{"id":"ops-guide/4-0-ops-guide","path":"/drand-docs/docs/ops-guide/4-0-ops-guide","sidebar":"docsSidebar"},{"id":"ops-guide/4-1-ops-guide-deployment","path":"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment","sidebar":"docsSidebar"},{"id":"ops-guide/4-2-ops-guide-docker-install","path":"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install","sidebar":"docsSidebar"},{"id":"ops-guide/4-3-ops-guide-storage-backends","path":"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends","sidebar":"docsSidebar"},{"id":"ops-guide/4-4-ops-guide-metrics-guide","path":"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide","sidebar":"docsSidebar"},{"id":"ops-guide/4-5-ops-guide-command-line-tools","path":"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools","sidebar":"docsSidebar"},{"id":"/category/10-about-what-is-drand","path":"/drand-docs/docs/category/10-about-what-is-drand","sidebar":"docsSidebar"},{"id":"/category/20-concepts-getting-started","path":"/drand-docs/docs/category/20-concepts-getting-started","sidebar":"docsSidebar"},{"id":"/category/30-developers-guide","path":"/drand-docs/docs/category/30-developers-guide","sidebar":"docsSidebar"},{"id":"/category/40-operators-guide","path":"/drand-docs/docs/category/40-operators-guide","sidebar":"docsSidebar"},{"id":"/category/50-drand-community","path":"/drand-docs/docs/category/50-drand-community","sidebar":"docsSidebar"},{"id":"/category/60-drand-faq","path":"/drand-docs/docs/category/60-drand-faq","sidebar":"docsSidebar"}],"draftIds":[],"sidebars":{"docsSidebar":{"link":{"path":"/drand-docs/docs/home","label":"Home"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.1","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),l=n(781),s=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.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??g)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),_=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const A=(0,l.A)(C),T=C?.replace("pathname://","");let j=void 0!==T?(P=T,b&&(e=>e.startsWith("/"))(P)?S(P):P):void 0;var P;"hash"===x&&j?.startsWith("./")&&(j=j?.slice(1)),j&&A&&(j=(0,a.Ks)(j,{trailingSlash:w,baseUrl:k}));const N=(0,r.useRef)(!1),R=n?o.k2:o.N_,L=s.A.canUseIntersectionObserver,O=(0,r.useRef)(),D=()=>{N.current||null==j||(window.docusaurus.preload(j),N.current=!0)};(0,r.useEffect)((()=>(!L&&A&&s.A.canUseDOM&&null!=j&&window.docusaurus.prefetch(j),()=>{L&&O.current&&O.current.disconnect()})),[O,j,L,A]);const I=j?.startsWith("#")??!1,M=!y.target||"_self"===y.target,F=!j||!A||!M||I&&"hash"!==x;h||!I&&F||_.collectLink(j),y.id&&_.collectAnchor(y.id);const z={};return F?(0,d.jsx)("a",{ref:E,href:j,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y,...z}):(0,d.jsx)(R,{...y,onMouseEnter:D,onTouchStart:D,innerRef:e=>{E.current=e,L&&e&&A&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),O.current.observe(e))},to:j,...n&&{isActive:m,activeClassName:g},...z})}const f=r.forwardRef(p)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=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 i=n(2654);function l(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 i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=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 i=l({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},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 o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?`${o}.${a}`:a;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),l=(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,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:l,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>h,g1:()=>y});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),l=n(679),s=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,l.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(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,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,c.jsx)(f.Provider,{value:n,children:t})}function h(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.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])}}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{$S:()=>g,B5:()=>E,Nr:()=>f,OF:()=>k,QB:()=>_,Vd:()=>x,Y:()=>v,cC:()=>p,d1:()=>C,fW:()=>S,w8:()=>b});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),l=n(9169),s=n(1682),c=n(3886),u=n(3025),d=n(609);function p(e){const t=(0,u.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,l.ys)(e,t),h=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,l.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,l.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function k(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,s.sb)([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=x(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(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function _(e,t){const n=x(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(`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,s.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,l=i.find((e=>(0,o.B6)(n.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?r.docsSidebars[s]:void 0;return{docElement:(0,a.v)(i),sidebarName:s,sidebarItems:c}}function C(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!f(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>p,Gy:()=>u,HW:()=>h,ht:()=>d,r7:()=>g,jh:()=>f});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.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){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=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})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&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 a}(t,n,e)}function f(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function m(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)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("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"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>ft});var r=n(6540),o=n(4164),a=n(7489),i=n(1213),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.T)({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",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var j=n(9876),P=n(3104);var N=n(9532),R=n(5600);const L=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,R.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,N.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(L.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(L);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,R.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("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 $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),l=(0,s.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"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var W=n(3465);function Q(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,j.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Q,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:s?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.A)("navbar__link",a),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ee,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ee,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(2131);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("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 he="iconLanguage_nlXk";var be=n(418);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,ye.navbarSearchContainer),children:t})}var we=n(4070),ke=n(6972);var xe=n(3886);function Se(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const _e={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),p=(0,ge.o)(),{search:f,hash:g}=(0,l.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ve,{className:n,children:(0,u.jsx)(be.A,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=a?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>l||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ke.Vd)(r)[0],i=t??a.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,l.zy)(),p=(0,we.zK)(n),f=(0,we.jh)(n),{savePreferredVersionName:g}=(0,xe.g1)(n),m=[...o,...f.map((function(e){const t=Se(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ke.Vd)(n)[0],b=t&&m.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:Se(h,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function Ee(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=_e[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ce(){const e=(0,j.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ee,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.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)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function je(){const e=(0,j.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?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ce,{}),secondaryMenu:(0,u.jsx)(Te,{})}):null}const Pe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,j.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,P.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-a.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Pe.navbarHideable,!d&&Pe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ne,{onClick:i.toggle}),(0,u.jsx)(je,{})]})}var Le=n(440);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function De(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ie(e){let{error:t}=e;const n=(0,Le.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function ze(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,j.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Me,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ee,{...e})},t)))})}function qe(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,j.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(qe,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Be,{}),(0,u.jsx)(Q,{}),(0,u.jsx)(Ue,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ue,{items:r}),(0,u.jsx)(V,{className:$e.colorModeToggle}),!o&&(0,u.jsx)(ve,{children:(0,u.jsx)(be.A,{})})]})})}function Ge(){return(0,u.jsx)(Re,{children:(0,u.jsx)(He,{})})}function Ve(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function We(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ve,{item:t})},t.href??t.to)}function Qe(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(We,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qe,{column:e},t)))})}function Ye(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ve,{item:t})}function Xe(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Ze,{item:e}),t.length!==n+1&&(0,u.jsx)(Ye,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ke,{columns:t}):(0,u.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(et.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function ot(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(at,{style:o,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(ot,{copyright:t})})}const lt=r.memo(it),st=(0,N.fM)([F.a,k.o,P.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(R.y_,{children:(0,u.jsx)(j.e,{children:(0,u.jsx)(O,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(ut.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(De,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ie,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(Ge,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(h.G.wrapper.main,pt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(l?.href||"/"),g=n?"":t,m=l?.alt??g;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:m,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,l.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:s,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,l.jsx)(m,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>g});var r=n(6540),o=n(2303),a=n(679),i=n(9532),l=n(6342),s=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!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&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children: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:()=>b,a:()=>h});var r=n(6540),o=n(8193),a=n(9532),i=n(679),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.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:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>g});var r=n(6540),o=n(5600),a=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6342),u=n(4848);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},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",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-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",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",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:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1682:(e,t,n)=>{"use strict";function r(e){return Array.from(new Set(e))}function o(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>o,sb:()=>r})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),o=n(4164),a=n(5260),i=n(6803),l=n(6025),s=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,s.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:l,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.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 o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(6540),o=n(8193),a=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function c(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(0,l.jsx)(s.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.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 o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"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,l||(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),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;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,listen:t}}(n);const o=i(t?.persistence);return null===o?s:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,o.zy)(),c=(0,a.Ks)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(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:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,c=n,c?o(s):a(s));var s,c;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;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&&o(e),s=t&&o(t),c=l||s;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=i.length;p>=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(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 p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!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 m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),m||(0,l.A)(!1);var t,n=window.history,o=(-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,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,x=void 0===k?h:k,S=i.keyLength,_=void 0===S?6:S,E=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return E&&(a=u(a,E)),f(a,r,n)}function A(){return Math.random().toString(36).substr(2,_)}var T=g();function j(e){(0,r.A)($,e),$.length=n.length,T.notifyListeners($.location,$.action)}function P(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||L(C(e.state))}function N(){L(C(v()))}var R=!1;function L(e){if(R)R=!1,j();else{T.confirmTransitionTo(e,"POP",x,(function(t){t?j({action:"POP",location:e}):function(e){var t=$.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(R=!0,M(o))}(e)}))}}var O=C(v()),D=[O.key];function I(e){return E+p(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,P),a&&window.addEventListener(y,N)):0===F&&(window.removeEventListener(b,P),a&&window.removeEventListener(y,N))}var B=!1;var $={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",a=f(e,t,A(),$.location);T.confirmTransitionTo(a,r,x,(function(e){if(e){var t=I(a),i=a.key,l=a.state;if(o)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=D.indexOf($.location.key),c=D.slice(0,s+1);c.push(a.key),D=c,j({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,A(),$.location);T.confirmTransitionTo(a,r,x,(function(e){if(e){var t=I(a),i=a.key,l=a.state;if(o)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=D.indexOf($.location.key);-1!==s&&(D[s]=a.key),j({action:r,location:a})}else window.location.replace(t)}}))},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||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var k="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function E(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),m||(0,l.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?h:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",y=x[c],v=y.encodePath,w=y.decodePath;function C(){var e=w(_());return b&&(e=u(e,b)),f(e)}var A=g();function T(e){(0,r.A)(B,e),B.length=t.length,A.notifyListeners(B.location,B.action)}var j=!1,P=null;function N(){var e,t,n=_(),r=v(n);if(n!==r)E(r);else{var o=C(),i=B.location;if(!j&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(P===p(o))return;P=null,function(e){if(j)j=!1,T();else{var t="POP";A.confirmTransitionTo(e,t,a,(function(n){n?T({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var r=D.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(j=!0,I(o))}(e)}))}}(o)}}var R=_(),L=v(R);R!==L&&E(L);var O=C(),D=[p(O)];function I(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(k,N):0===M&&window.removeEventListener(k,N)}var z=!1;var B={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);A.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=v(b+t);if(_()!==o){P=t,function(e){window.location.hash=e}(o);var a=D.lastIndexOf(p(B.location)),i=D.slice(0,a+1);i.push(t),D=i,T({action:n,location:r})}else T()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);A.confirmTransitionTo(r,n,a,(function(e){if(e){var t=p(r),o=v(b+t);_()!==o&&(P=t,E(o));var a=D.indexOf(p(B.location));-1!==a&&(D[a]=t),T({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function A(e,t,n){return Math.min(Math.max(e,t),n)}function T(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=g();function d(e){(0,r.A)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function m(){return Math.random().toString(36).substr(2,c)}var h=A(l,0,a.length-1),b=a.map((function(e){return f(e,void 0,"string"==typeof e?m():e.key||m())})),y=p;function v(e){var t=A(w.index+e,0,w.entries.length-1),r=w.entries[t];u.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:y,push:function(e,t){var r="PUSH",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,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,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(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),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={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]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),h=0;h<i.length;++h){var b=i[h];if(!(a[b]||r&&r[b]||m&&m[b]||l&&l[b])){var y=p(n,b);try{c(t,b,y)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,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 c=[n,r,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).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)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;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 o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}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=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),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)*o(Math.random()*t,.1,.95)),t=o(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");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.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&&f(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,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=m&&null!=g&&g!==m,x="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||u,E=b||y;r.push({name:h||a++,prefix:m||"",delimiter:_,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:E?c(E):w?".*":"[^"+s(_)+"]+?"})}}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),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",l=t||{},s=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=l[u.name];if(null==p){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(p)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=s(p[f]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===f?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(p),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var p=s(c.prefix),f="(?:"+c.pattern+")";t.push(c),c.repeat&&(f+="(?:"+p+f+")*"),i+=f=c.optional?c.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var g=s(n.delimiter||"/"),m=i.slice(-g.length)===g;return o||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=a?"$":o&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function f(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 u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(f(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(a(e,n),t,n)}(e,t,n)}},6969: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:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},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"},bqn:{title:"BQN",owner:"yewscion"},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"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},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"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},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"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},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"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},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"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(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(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(o>=a.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380: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 o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),g=u;o(g);){for(var m in p={},g){var h=s[m];t(h&&h.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in f(b))if(y in u){p[b]=!0;break}for(var v in g=p)u[v]=!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,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return l[e]=o}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,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:a,resetWarningCache:o};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),o=n(9982);function a(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 i=new Set,l={};function s(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[: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]*$/,f={},g={};function m(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var h={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){h[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];h[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){h[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){h[e]=new m(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){h[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){h[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){h[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){h[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){h[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function v(e,t,n,r){var o=h.hasOwnProperty(t)?h[t]:null;(null!==o?0!==o.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,o,r)&&(n=null),r||null===o?function(e){return!!d.call(g,e)||!d.call(f,e)&&(p.test(e)?g[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!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);h[t]=new m(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);h[t]=new m(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);h[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=Symbol.for("react.element"),x=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),A=Symbol.for("react.context"),T=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),P=Symbol.for("react.suspense_list"),N=Symbol.for("react.memo"),R=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var L=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var I,M=Object.assign;function F(e){if(void 0===I)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);I=t&&t[1]||""}return"\n"+I+e}var z=!1;function B(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(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,l=a.length-1;1<=i&&0<=l&&o[i]!==a[l];)l--;for(;1<=i&&0<=l;i--,l--)if(o[i]!==a[l]){if(1!==i||1!==l)do{if(i--,0>--l||o[i]!==a[l]){var s="\n"+o[i].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=i&&0<=l);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function $(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function U(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 S:return"Fragment";case x:return"Portal";case E:return"Profiler";case _:return"StrictMode";case j:return"Suspense";case P:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case N:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case R:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===_?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function V(e){e._valueTracker||(e._valueTracker=function(e){var t=G(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 o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.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 W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(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 K(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(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 Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=H(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")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(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 ee(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(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 ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(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 se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.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 ue(e,t)}))}:ue);function pe(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 fe={animationIterationCount:!0,aspectRatio:!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},ge=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function he(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(fe).forEach((function(e){ge.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=M({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 ye(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(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}}var we=null;function ke(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var xe=null,Se=null,_e=null;function Ee(e){if(e=wo(e)){if("function"!=typeof xe)throw Error(a(280));var t=e.stateNode;t&&(t=xo(t),xe(e.stateNode,e.type,t))}}function Ce(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Ae(){if(Se){var e=Se,t=_e;if(_e=Se=null,Ee(e),t)for(e=0;e<t.length;e++)Ee(t[e])}}function Te(e,t){return e(t)}function je(){}var Pe=!1;function Ne(e,t,n){if(Pe)return e(t,n);Pe=!0;try{return Te(e,t,n)}finally{Pe=!1,(null!==Se||null!==_e)&&(je(),Ae())}}function Re(e,t){var n=e.stateNode;if(null===n)return null;var r=xo(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(a(231,t,typeof n));return n}var Le=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Le=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Le=!1}function De(e,t,n,r,o,a,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Ie=!0,Me=e}};function $e(e,t,n,r,o,a,i,l,s){Ie=!1,Me=null,De.apply(Be,arguments)}function Ue(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(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 He(e){if(Ue(e)!==e)throw Error(a(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var l=!1,s=o.child;s;){if(s===n){l=!0,n=o,r=i;break}if(s===r){l=!0,r=o,n=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===n){l=!0,n=i,r=o;break}if(s===r){l=!0,r=i,n=o;break}s=s.sibling}if(!l)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ve(e):null}function Ve(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ve(e);if(null!==t)return t;e=e.sibling}return null}var We=o.unstable_scheduleCallback,Qe=o.unstable_cancelCallback,Ke=o.unstable_shouldYield,Ye=o.unstable_requestPaint,Ze=o.unstable_now,Xe=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var l=i&~o;0!==l?r=dt(l):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&4194240&a))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function ft(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function gt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ct;return!(4194240&(ct<<=1))&&(ct=64),e}function ht(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var kt,xt,St,_t,Et,Ct=!1,At=[],Tt=null,jt=null,Pt=null,Nt=new Map,Rt=new Map,Lt=[],Ot="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 Dt(e,t){switch(e){case"focusin":case"focusout":Tt=null;break;case"dragenter":case"dragleave":jt=null;break;case"mouseover":case"mouseout":Pt=null;break;case"pointerover":case"pointerout":Nt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Rt.delete(t.pointerId)}}function It(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=wo(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=vo(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void Et(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&xt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==Tt&&Ft(Tt)&&(Tt=null),null!==jt&&Ft(jt)&&(jt=null),null!==Pt&&Ft(Pt)&&(Pt=null),Nt.forEach(zt),Rt.forEach(zt)}function $t(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function Ut(e){function t(t){return $t(t,e)}if(0<At.length){$t(At[0],e);for(var n=1;n<At.length;n++){var r=At[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Tt&&$t(Tt,e),null!==jt&&$t(jt,e),null!==Pt&&$t(Pt,e),Nt.forEach(t),Rt.forEach(t),n=0;n<Lt.length;n++)(r=Lt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Lt.length&&null===(n=Lt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Lt.shift()}var qt=w.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=1,Wt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Vt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=4,Wt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Wt(e,t,n,r){if(Ht){var o=Kt(e,t,n,r);if(null===o)Hr(e,t,r,Qt,n),Dt(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return Tt=It(Tt,e,t,n,r,o),!0;case"dragenter":return jt=It(jt,e,t,n,r,o),!0;case"mouseover":return Pt=It(Pt,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Nt.set(a,It(Nt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Rt.set(a,It(Rt.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==o;){var a=wo(o);if(null!==a&&kt(a),null===(a=Kt(e,t,n,r))&&Hr(e,t,r,Qt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Qt=null;function Kt(e,t,n,r){if(Qt=null,null!==(e=vo(e=ke(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Qt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,o="value"in Zt?Zt.value:Zt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(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 nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(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=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,sn,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),pn=on(dn),fn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:En,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!==sn&&(sn&&"mousemove"===e.type?(an=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=an=0,sn=e),an)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),gn=on(fn),mn=on(M({},fn,{dataTransfer:0})),hn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=on(yn),wn=on(M({},cn,{data:0})),kn={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"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _n(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function En(){return _n}var Cn=M({},dn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(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:En,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),An=on(Cn),Tn=on(M({},fn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),jn=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:En})),Pn=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Nn=M({},fn,{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}),Rn=on(Nn),Ln=[9,13,27,32],On=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var In=u&&"TextEvent"in window&&!Dn,Mn=u&&(!On||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Ln.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var qn={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 Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Gn(e,t,n,r){Ce(r),0<(t=Vr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Vn=null,Wn=null;function Qn(e){Fr(e,0)}function Kn(e){if(W(ko(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Vn&&(Vn.detachEvent("onpropertychange",nr),Wn=Vn=null)}function nr(e){if("value"===e.propertyName&&Kn(Wn)){var t=[];Gn(t,Wn,e,ke(e)),Ne(Qn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Vn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(Wn)}function ar(e,t){if("click"===e)return Kn(t)}function ir(e,t){if("input"===e||"change"===e)return Kn(t)}var lr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function sr(e,t){if(lr(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++){var o=n[r];if(!d.call(t,o)||!lr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(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=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){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 fr(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)}function gr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var mr=u&&"documentMode"in document&&11>=document.documentMode,hr=null,br=null,yr=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==hr||hr!==Q(r)||("selectionStart"in(r=hr)&&fr(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},yr&&sr(yr,r)||(yr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=hr)))}function kr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xr={animationend:kr("Animation","AnimationEnd"),animationiteration:kr("Animation","AnimationIteration"),animationstart:kr("Animation","AnimationStart"),transitionend:kr("Transition","TransitionEnd")},Sr={},_r={};function Er(e){if(Sr[e])return Sr[e];if(!xr[e])return e;var t,n=xr[e];for(t in n)if(n.hasOwnProperty(t)&&t in _r)return Sr[e]=n[t];return e}u&&(_r=document.createElement("div").style,"AnimationEvent"in window||(delete xr.animationend.animation,delete xr.animationiteration.animation,delete xr.animationstart.animation),"TransitionEvent"in window||delete xr.transitionend.transition);var Cr=Er("animationend"),Ar=Er("animationiteration"),Tr=Er("animationstart"),jr=Er("transitionend"),Pr=new Map,Nr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Rr(e,t){Pr.set(e,t),s(t,[e])}for(var Lr=0;Lr<Nr.length;Lr++){var Or=Nr[Lr];Rr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Rr(Cr,"onAnimationEnd"),Rr(Ar,"onAnimationIteration"),Rr(Tr,"onAnimationStart"),Rr("dblclick","onDoubleClick"),Rr("focusin","onFocus"),Rr("focusout","onBlur"),Rr(jr,"onTransitionEnd"),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 Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ir=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,l,s,c){if($e.apply(this,arguments),Ie){if(!Ie)throw Error(a(198));var u=Me;Ie=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==a&&o.isPropagationStopped())break e;Mr(o,l,c),a=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==a&&o.isPropagationStopped())break e;Mr(o,l,c),a=s}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ho];void 0===n&&(n=t[ho]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var $r="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[$r]){e[$r]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[$r]||(t[$r]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Yt(t)){case 1:var o=Gt;break;case 4:o=Vt;break;default:o=Wt}n=o.bind(null,t,n,e),o=void 0,!Le||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=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===o||8===l.nodeType&&l.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===o||8===s.nodeType&&s.parentNode===o))return;i=i.return}for(;null!==l;){if(null===(i=vo(l)))return;if(5===(s=i.tag)||6===s){r=a=i;continue e}l=l.parentNode}}r=r.return}Ne((function(){var r=a,o=ke(n),i=[];e:{var l=Pr.get(e);if(void 0!==l){var s=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=An;break;case"focusin":c="focus",s=hn;break;case"focusout":c="blur",s=hn;break;case"beforeblur":case"afterblur":s=hn;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=gn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=jn;break;case Cr:case Ar:case Tr:s=bn;break;case jr:s=Pn;break;case"scroll":s=pn;break;case"wheel":s=Rn;break;case"copy":case"cut":case"paste":s=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Tn}var u=!!(4&t),d=!u&&"scroll"===e,p=u?null!==l?l+"Capture":null:l;u=[];for(var f,g=r;null!==g;){var m=(f=g).stateNode;if(5===f.tag&&null!==m&&(f=m,null!==p&&(null!=(m=Re(g,p))&&u.push(Gr(g,m,f)))),d)break;g=g.return}0<u.length&&(l=new s(l,c,null,n,o),i.push({event:l,listeners:u}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!vo(c)&&!c[mo])&&(s||l)&&(l=o.window===o?o:(l=o.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?vo(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=gn,m="onMouseLeave",p="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=Tn,m="onPointerLeave",p="onPointerEnter",g="pointer"),d=null==s?l:ko(s),f=null==c?l:ko(c),(l=new u(m,g+"leave",s,n,o)).target=d,l.relatedTarget=f,m=null,vo(o)===r&&((u=new u(p,g+"enter",c,n,o)).target=f,u.relatedTarget=d,m=u),d=m,s&&c)e:{for(p=c,g=0,f=u=s;f;f=Wr(f))g++;for(f=0,m=p;m;m=Wr(m))f++;for(;0<g-f;)u=Wr(u),g--;for(;0<f-g;)p=Wr(p),f--;for(;g--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==s&&Qr(i,l,s,u,!1),null!==c&&null!==d&&Qr(i,d,c,u,!0)}if("select"===(s=(l=r?ko(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Yn;else if(Hn(l))if(Zn)h=ir;else{h=or;var b=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=ar);switch(h&&(h=h(e,r))?Gn(i,h,n,o):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ee(l,"number",l.value)),b=r?ko(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(hr=b,br=r,yr=null);break;case"focusout":yr=br=hr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,o);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":wr(i,n,o)}var y;if(On)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else Un?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==v?"onCompositionEnd"===v&&Un&&(y=en()):(Xt="value"in(Zt=o)?Zt.value:Zt.textContent,Un=!0)),0<(b=Vr(r,v)).length&&(v=new wn(v,e,null,n,o),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=$n(n))&&(v.data=y))),(y=In?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!On&&Bn(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!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 Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Vr(r,"onBeforeInput")).length&&(o=new wn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=y))}Fr(i,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Vr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Re(e,n))&&r.unshift(Gr(e,a,o)),null!=(a=Re(e,t))&&r.push(Gr(e,a,o))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Qr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==c&&(l=c,o?null!=(s=Re(n,a))&&i.unshift(Gr(n,s,l)):o||null!=(s=Re(n,a))&&i.push(Gr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Kr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replace(Yr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(a(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(lo)}:ro;function lo(e){setTimeout((function(){throw e}))}function so(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);Ut(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(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 po=Math.random().toString(36).slice(2),fo="__reactFiber$"+po,go="__reactProps$"+po,mo="__reactContainer$"+po,ho="__reactEvents$"+po,bo="__reactListeners$"+po,yo="__reactHandles$"+po;function vo(e){var t=e[fo];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mo]||n[fo]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[fo])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[fo]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ko(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function xo(e){return e[go]||null}var So=[],_o=-1;function Eo(e){return{current:e}}function Co(e){0>_o||(e.current=So[_o],So[_o]=null,_o--)}function Ao(e,t){_o++,So[_o]=e.current,e.current=t}var To={},jo=Eo(To),Po=Eo(!1),No=To;function Ro(e,t){var n=e.type.contextTypes;if(!n)return To;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Lo(e){return null!=(e=e.childContextTypes)}function Oo(){Co(Po),Co(jo)}function Do(e,t,n){if(jo.current!==To)throw Error(a(168));Ao(jo,t),Ao(Po,n)}function Io(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,q(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||To,No=jo.current,Ao(jo,e),Ao(Po,Po.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Io(e,t,No),r.__reactInternalMemoizedMergedChildContext=e,Co(Po),Co(jo),Ao(jo,e)):Co(Po),Ao(Po,n)}var zo=null,Bo=!1,$o=!1;function Uo(e){null===zo?zo=[e]:zo.push(e)}function qo(){if(!$o&&null!==zo){$o=!0;var e=0,t=vt;try{var n=zo;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),We(Je,qo),o}finally{vt=t,$o=!1}}return null}var Ho=[],Go=0,Vo=null,Wo=0,Qo=[],Ko=0,Yo=null,Zo=1,Xo="";function Jo(e,t){Ho[Go++]=Wo,Ho[Go++]=Vo,Vo=e,Wo=t}function ea(e,t,n){Qo[Ko++]=Zo,Qo[Ko++]=Xo,Qo[Ko++]=Yo,Yo=e;var r=Zo;e=Xo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Zo=1<<32-it(t)+o|n<<o|r,Xo=a+e}else Zo=1<<a|n<<o|r,Xo=e}function ta(e){null!==e.return&&(Jo(e,1),ea(e,1,0))}function na(e){for(;e===Vo;)Vo=Ho[--Go],Ho[Go]=null,Wo=Ho[--Go],Ho[Go]=null;for(;e===Yo;)Yo=Qo[--Ko],Qo[Ko]=null,Xo=Qo[--Ko],Qo[Ko]=null,Zo=Qo[--Ko],Qo[Ko]=null}var ra=null,oa=null,aa=!1,ia=null;function la(e,t){var n=Nc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function sa(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,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Yo?{id:Zo,overflow:Xo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Nc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return!(!(1&e.mode)||128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!sa(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&sa(e,t)?la(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function pa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw fa(),Error(a(418));for(;t;)la(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function fa(){for(var e=oa;e;)e=co(e.nextSibling)}function ga(){oa=ra=null,aa=!1}function ma(e){null===ia?ia=[e]:ia.push(e)}var ha=w.ReactCurrentBatchConfig;function ba(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(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function ya(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function va(e){return(0,e._init)(e._payload)}function wa(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}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 o(e,t){return(e=Lc(e,t)).index=0,e.sibling=null,e}function i(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):(t.flags|=1048576,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=Mc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===R&&va(a)===t.type)?((r=o(t,n.props)).ref=ba(e,t,n),r.return=e,r):((r=Oc(n.type,n.key,n.props,null,e.mode,r)).ref=ba(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Mc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Oc(t.type,t.key,t.props,null,e.mode,n)).ref=ba(e,null,t),n.return=e,n;case x:return(t=Fc(t,e.mode,n)).return=e,t;case R:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Dc(t,e.mode,n,null)).return=e,t;ya(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?c(e,t,n,r):null;case x:return n.key===o?u(e,t,n,r):null;case R:return f(e,t,(o=n._init)(n._payload),r)}if(te(n)||D(n))return null!==o?null:d(e,t,n,r,null);ya(e,n)}return null}function g(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case R:return g(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,o,null);ya(t,r)}return null}function m(o,a,l,s){for(var c=null,u=null,d=a,m=a=0,h=null;null!==d&&m<l.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=f(o,d,l[m],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===l.length)return n(o,d),aa&&Jo(o,m),c;if(null===d){for(;m<l.length;m++)null!==(d=p(o,l[m],s))&&(a=i(d,a,m),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,m),c}for(d=r(o,d);m<l.length;m++)null!==(h=g(d,o,m,l[m],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),a=i(h,a,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,m),c}function h(o,l,s,c){var u=D(s);if("function"!=typeof u)throw Error(a(150));if(null==(s=u.call(s)))throw Error(a(151));for(var d=u=null,m=l,h=l=0,b=null,y=s.next();null!==m&&!y.done;h++,y=s.next()){m.index>h?(b=m,m=null):b=m.sibling;var v=f(o,m,y.value,c);if(null===v){null===m&&(m=b);break}e&&m&&null===v.alternate&&t(o,m),l=i(v,l,h),null===d?u=v:d.sibling=v,d=v,m=b}if(y.done)return n(o,m),aa&&Jo(o,h),u;if(null===m){for(;!y.done;h++,y=s.next())null!==(y=p(o,y.value,c))&&(l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return aa&&Jo(o,h),u}for(m=r(o,m);!y.done;h++,y=s.next())null!==(y=g(m,o,h,y.value,c))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),l=i(y,l,h),null===d?u=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),u}return function e(r,a,i,s){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case k:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===R&&va(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=ba(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Dc(i.props.children,r.mode,s,i.key)).return=r,r=a):((s=Oc(i.type,i.key,i.props,null,r.mode,s)).ref=ba(r,a,i),s.return=r,r=s)}return l(r);case x:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Fc(i,r.mode,s)).return=r,r=a}return l(r);case R:return e(r,a,(u=i._init)(i._payload),s)}if(te(i))return m(r,a,i,s);if(D(i))return h(r,a,i,s);ya(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Mc(i,r.mode,s)).return=r,r=a),l(r)):n(r,a)}}var ka=wa(!0),xa=wa(!1),Sa=Eo(null),_a=null,Ea=null,Ca=null;function Aa(){Ca=Ea=_a=null}function Ta(e){var t=Sa.current;Co(Sa),e._currentValue=t}function ja(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Pa(e,t){_a=e,Ca=Ea=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(vl=!0),e.firstContext=null)}function Na(e){var t=e._currentValue;if(Ca!==e)if(e={context:e,memoizedValue:t,next:null},null===Ea){if(null===_a)throw Error(a(308));Ea=e,_a.dependencies={lanes:0,firstContext:e}}else Ea=Ea.next=e;return t}var Ra=null;function La(e){null===Ra?Ra=[e]:Ra.push(e)}function Oa(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,La(t)):(n.next=o.next,o.next=n),t.interleaved=n,Da(e,r)}function Da(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}var Ia=!1;function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fa(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 za(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ba(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Ts){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Da(e,n)}return null===(o=r.interleaved)?(t.next=t,La(r)):(t.next=o.next,o.next=t),r.interleaved=t,Da(e,n)}function $a(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Ua(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=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===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function qa(e,t,n,r){var o=e.updateQueue;Ia=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var s=l,c=s.next;s.next=null,null===i?a=c:i.next=c,i=s;var u=e.alternate;null!==u&&((l=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===l?u.firstBaseUpdate=c:l.next=c,u.lastBaseUpdate=s))}if(null!==a){var d=o.baseState;for(i=0,u=c=s=null,l=a;;){var p=l.lane,f=l.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var g=e,m=l;switch(p=t,f=n,m.tag){case 1:if("function"==typeof(g=m.payload)){d=g.call(f,d,p);break e}d=g;break e;case 3:g.flags=-65537&g.flags|128;case 0:if(null==(p="function"==typeof(g=m.payload)?g.call(f,d,p):g))break e;d=M({},d,p);break e;case 2:Ia=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(p=o.effects)?o.effects=[l]:p.push(l))}else f={eventTime:f,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===u?(c=u=f,s=d):u=u.next=f,i|=p;if(null===(l=l.next)){if(null===(l=o.shared.pending))break;l=(p=l).next,p.next=null,o.lastBaseUpdate=p,o.shared.pending=null}}if(null===u&&(s=d),o.baseState=s,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Is|=i,e.lanes=i,e.memoizedState=d}}function Ha(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Ga={},Va=Eo(Ga),Wa=Eo(Ga),Qa=Eo(Ga);function Ka(e){if(e===Ga)throw Error(a(174));return e}function Ya(e,t){switch(Ao(Qa,t),Ao(Wa,e),Ao(Va,Ga),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Co(Va),Ao(Va,t)}function Za(){Co(Va),Co(Wa),Co(Qa)}function Xa(e){Ka(Qa.current);var t=Ka(Va.current),n=se(t,e.type);t!==n&&(Ao(Wa,e),Ao(Va,n))}function Ja(e){Wa.current===e&&(Co(Va),Co(Wa))}var ei=Eo(0);function ti(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(128&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 ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var oi=w.ReactCurrentDispatcher,ai=w.ReactCurrentBatchConfig,ii=0,li=null,si=null,ci=null,ui=!1,di=!1,pi=0,fi=0;function gi(){throw Error(a(321))}function mi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function hi(e,t,n,r,o,i){if(ii=i,li=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,oi.current=null===e||null===e.memoizedState?Ji:el,e=n(r,o),di){i=0;do{if(di=!1,pi=0,25<=i)throw Error(a(301));i+=1,ci=si=null,t.updateQueue=null,oi.current=tl,e=n(r,o)}while(di)}if(oi.current=Xi,t=null!==si&&null!==si.next,ii=0,ci=si=li=null,ui=!1,t)throw Error(a(300));return e}function bi(){var e=0!==pi;return pi=0,e}function yi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?li.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===si){var e=li.alternate;e=null!==e?e.memoizedState:null}else e=si.next;var t=null===ci?li.memoizedState:ci.next;if(null!==t)ci=t,si=e;else{if(null===e)throw Error(a(310));e={memoizedState:(si=e).memoizedState,baseState:si.baseState,baseQueue:si.baseQueue,queue:si.queue,next:null},null===ci?li.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=si,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var l=o.next;o.next=i.next,i.next=l}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var s=l=null,c=null,u=i;do{var d=u.lane;if((ii&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var p={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(s=c=p,l=r):c=c.next=p,li.lanes|=d,Is|=d}u=u.next}while(null!==u&&u!==i);null===c?l=r:c.next=s,lr(r,t.memoizedState)||(vl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,li.lanes|=i,Is|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function xi(e){var t=vi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{i=e(i,l.action),l=l.next}while(l!==o);lr(i,t.memoizedState)||(vl=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Si(){}function _i(e,t){var n=li,r=vi(),o=t(),i=!lr(r.memoizedState,o);if(i&&(r.memoizedState=o,vl=!0),r=r.queue,Ii(Ai.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Ni(9,Ci.bind(null,n,r,o,t),void 0,null),null===js)throw Error(a(349));30&ii||Ei(n,t,o)}return o}function Ei(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ci(e,t,n,r){t.value=n,t.getSnapshot=r,Ti(t)&&ji(e)}function Ai(e,t,n){return n((function(){Ti(t)&&ji(e)}))}function Ti(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function ji(e){var t=Da(e,1);null!==t&&nc(t,e,1,-1)}function Pi(e){var t=yi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Qi.bind(null,li,e),[t.memoizedState,e]}function Ni(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.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 Ri(){return vi().memoizedState}function Li(e,t,n,r){var o=yi();li.flags|=e,o.memoizedState=Ni(1|t,n,void 0,void 0===r?null:r)}function Oi(e,t,n,r){var o=vi();r=void 0===r?null:r;var a=void 0;if(null!==si){var i=si.memoizedState;if(a=i.destroy,null!==r&&mi(r,i.deps))return void(o.memoizedState=Ni(t,n,a,r))}li.flags|=e,o.memoizedState=Ni(1|t,n,a,r)}function Di(e,t){return Li(8390656,8,e,t)}function Ii(e,t){return Oi(2048,8,e,t)}function Mi(e,t){return Oi(4,2,e,t)}function Fi(e,t){return Oi(4,4,e,t)}function zi(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 Bi(e,t,n){return n=null!=n?n.concat([e]):null,Oi(4,4,zi.bind(null,t,e),n)}function $i(){}function Ui(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&mi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function qi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&mi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Hi(e,t,n){return 21&ii?(lr(n,t)||(n=mt(),li.lanes|=n,Is|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,vl=!0),e.memoizedState=n)}function Gi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=ai.transition;ai.transition={};try{e(!1),t()}finally{vt=n,ai.transition=r}}function Vi(){return vi().memoizedState}function Wi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ki(e))Yi(t,n);else if(null!==(n=Oa(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Qi(e,t,n){var r=tc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ki(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=a(i,n);if(o.hasEagerState=!0,o.eagerState=l,lr(l,i)){var s=t.interleaved;return null===s?(o.next=o,La(t)):(o.next=s.next,s.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=Oa(e,t,o,r))&&(nc(n,e,r,o=ec()),Zi(n,t,r))}}function Ki(e){var t=e.alternate;return e===li||null!==t&&t===li}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var Xi={readContext:Na,useCallback:gi,useContext:gi,useEffect:gi,useImperativeHandle:gi,useInsertionEffect:gi,useLayoutEffect:gi,useMemo:gi,useReducer:gi,useRef:gi,useState:gi,useDebugValue:gi,useDeferredValue:gi,useTransition:gi,useMutableSource:gi,useSyncExternalStore:gi,useId:gi,unstable_isNewReconciler:!1},Ji={readContext:Na,useCallback:function(e,t){return yi().memoizedState=[e,void 0===t?null:t],e},useContext:Na,useEffect:Di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Li(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Li(4194308,4,e,t)},useInsertionEffect:function(e,t){return Li(4,2,e,t)},useMemo:function(e,t){var n=yi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=yi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Wi.bind(null,li,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},yi().memoizedState=e},useState:Pi,useDebugValue:$i,useDeferredValue:function(e){return yi().memoizedState=e},useTransition:function(){var e=Pi(!1),t=e[0];return e=Gi.bind(null,e[1]),yi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=li,o=yi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===js)throw Error(a(349));30&ii||Ei(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Di(Ai.bind(null,r,i,e),[e]),r.flags|=2048,Ni(9,Ci.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=yi(),t=js.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=pi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=fi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},el={readContext:Na,useCallback:Ui,useContext:Na,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:ki,useRef:Ri,useState:function(){return ki(wi)},useDebugValue:$i,useDeferredValue:function(e){return Hi(vi(),si.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Vi,unstable_isNewReconciler:!1},tl={readContext:Na,useCallback:Ui,useContext:Na,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:xi,useRef:Ri,useState:function(){return xi(wi)},useDebugValue:$i,useDeferredValue:function(e){var t=vi();return null===si?t.memoizedState=e:Hi(t,si.memoizedState,e)},useTransition:function(){return[xi(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:_i,useId:Vi,unstable_isNewReconciler:!1};function nl(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var ol={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=za(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Ba(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),o=za(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ba(e,o,r))&&(nc(t,e,r,n),$a(t,e,r))}};function al(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(o,a))}function il(e,t,n){var r=!1,o=To,a=t.contextType;return"object"==typeof a&&null!==a?a=Na(a):(o=Lo(t)?No:jo.current,a=(r=null!=(r=t.contextTypes))?Ro(e,o):To),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=ol,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function ll(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&&ol.enqueueReplaceState(t,t.state,null)}function sl(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs={},Ma(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Na(a):(a=Lo(t)?No:jo.current,o.context=Ro(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(rl(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&ol.enqueueReplaceState(o,o.state,null),qa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function cl(e,t){try{var n="",r=t;do{n+=$(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function ul(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function dl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var pl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=za(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hs||(Hs=!0,Gs=r),dl(0,t)},n}function gl(e,t,n){(n=za(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){dl(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){dl(0,t),"function"!=typeof r&&(null===Vs?Vs=new Set([this]):Vs.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function ml(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new pl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Ec.bind(null,e,t,n),t.then(e,e))}function hl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function bl(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=za(-1,1)).tag=2,Ba(n,t,1))),n.lanes|=1),e)}var yl=w.ReactCurrentOwner,vl=!1;function wl(e,t,n,r){t.child=null===e?xa(t,null,n,r):ka(t,e.child,n,r)}function kl(e,t,n,r,o){n=n.render;var a=t.ref;return Pa(t,o),r=hi(e,t,n,r,a,o),n=bi(),null===e||vl?(aa&&n&&ta(t),t.flags|=1,wl(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function xl(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Rc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Oc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Sl(e,t,a,r,o))}if(a=e.child,!(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(i,r)&&e.ref===t.ref)return Hl(e,t,o)}return t.flags|=1,(e=Lc(a,r)).ref=t.ref,e.return=t,t.child=e}function Sl(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(sr(a,r)&&e.ref===t.ref){if(vl=!1,t.pendingProps=r=a,!(e.lanes&o))return t.lanes=e.lanes,Hl(e,t,o);131072&e.flags&&(vl=!0)}}return Cl(e,t,n,r,o)}function _l(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Ao(Ls,Rs),Rs|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,Ao(Ls,Rs),Rs|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Ao(Ls,Rs),Rs|=n;else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,Ao(Ls,Rs),Rs|=r;return wl(e,t,o,n),t.child}function El(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Cl(e,t,n,r,o){var a=Lo(n)?No:jo.current;return a=Ro(t,a),Pa(t,o),n=hi(e,t,n,r,a,o),r=bi(),null===e||vl?(aa&&r&&ta(t),t.flags|=1,wl(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function Al(e,t,n,r,o){if(Lo(n)){var a=!0;Mo(t)}else a=!1;if(Pa(t,o),null===t.stateNode)ql(e,t),il(t,n,r),sl(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Na(c):c=Ro(t,c=Lo(n)?No:jo.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==c)&&ll(t,i,r,c),Ia=!1;var p=t.memoizedState;i.state=p,qa(t,r,i,o),s=t.memoizedState,l!==r||p!==s||Po.current||Ia?("function"==typeof u&&(rl(t,n,u,r),s=t.memoizedState),(l=Ia||al(t,n,l,r,p,s,c))?(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|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=c,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Fa(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:nl(t.type,l),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=Na(s):s=Ro(t,s=Lo(n)?No:jo.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||p!==s)&&ll(t,i,r,s),Ia=!1,p=t.memoizedState,i.state=p,qa(t,r,i,o);var g=t.memoizedState;l!==d||p!==g||Po.current||Ia?("function"==typeof f&&(rl(t,n,f,r),g=t.memoizedState),(c=Ia||al(t,n,c,r,p,g,s)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=s,r=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Tl(e,t,n,r,a,o)}function Tl(e,t,n,r,o,a){El(e,t);var i=!!(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Hl(e,t,a);r=t.stateNode,yl.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=ka(t,e.child,null,a),t.child=ka(t,null,l,a)):wl(e,t,l,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function jl(e){var t=e.stateNode;t.pendingContext?Do(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(0,t.context,!1),Ya(e,t.containerInfo)}function Pl(e,t,n,r,o){return ga(),ma(o),t.flags|=256,wl(e,t,n,r),t.child}var Nl,Rl,Ll,Ol,Dl={dehydrated:null,treeContext:null,retryLane:0};function Il(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ml(e,t,n){var r,o=t.pendingProps,i=ei.current,l=!1,s=!!(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),Ao(ei,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=o.children,e=o.fallback,l?(o=t.mode,l=t.child,s={mode:"hidden",children:s},1&o||null===l?l=Ic(s,o,0,null):(l.childLanes=0,l.pendingProps=s),e=Dc(e,o,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Il(n),t.memoizedState=Dl,e):Fl(t,s));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,l){if(n)return 256&t.flags?(t.flags&=-257,zl(e,t,l,r=ul(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Ic({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,l,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&ka(t,e.child,null,l),t.child.memoizedState=Il(l),t.memoizedState=Dl,i);if(!(1&t.mode))return zl(e,t,l,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var s=r.dgst;return r=s,zl(e,t,l,r=ul(i=Error(a(419)),r,void 0))}if(s=!!(l&e.childLanes),vl||s){if(null!==(r=js)){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|l)?0:o)&&o!==i.retryLane&&(i.retryLane=o,Da(e,o),nc(r,e,o,-1))}return mc(),zl(e,t,l,r=ul(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Qo[Ko++]=Zo,Qo[Ko++]=Xo,Qo[Ko++]=Yo,Zo=e.id,Xo=e.overflow,Yo=t),t=Fl(t,r.children),t.flags|=4096,t)}(e,t,s,o,r,i,n);if(l){l=o.fallback,s=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 1&s||t.child===i?(o=Lc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null),null!==r?l=Lc(r,l):(l=Dc(l,s,n,null)).flags|=2,l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,s=null===(s=e.child.memoizedState)?Il(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Dl,o}return e=(l=e.child).sibling,o=Lc(l,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Fl(e,t){return(t=Ic({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zl(e,t,n,r){return null!==r&&ma(r),ka(t,e.child,null,n),(e=Fl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Bl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),ja(e.return,t,n)}function $l(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Ul(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(wl(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Bl(e,n,t);else if(19===e.tag)Bl(e,n,t);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(Ao(ei,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$l(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ti(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$l(t,!0,n,null,a);break;case"together":$l(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function ql(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Is|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Lc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Lc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Gl(e,t){if(!aa)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 Vl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Wl(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Vl(t),null;case 1:case 17:return Lo(t.type)&&Oo(),Vl(t),null;case 3:return r=t.stateNode,Za(),Co(Po),Co(jo),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(pa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ia&&(ic(ia),ia=null))),Rl(e,t),Vl(t),null;case 5:Ja(t);var o=Ka(Qa.current);if(n=t.type,null!==e&&null!=t.stateNode)Ll(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Vl(t),null}if(e=Ka(Va.current),pa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[fo]=t,r[go]=i,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var s in ye(n,i),o=null,i)if(i.hasOwnProperty(s)){var c=i[s];"children"===s?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",""+c]):l.hasOwnProperty(s)&&null!=c&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":V(r),J(r,i,!0);break;case"textarea":V(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"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[fo]=t,e[go]=r,Nl(e,t,!1,!1),t.stateNode=e;e:{switch(s=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Dr.length;o++)zr(Dr[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Y(e,r),o=K(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in ye(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?he(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&pe(e,u):"number"==typeof u&&pe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(l.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,s))}switch(n){case"input":V(e),J(e,r,!1);break;case"textarea":V(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Vl(t),null;case 6:if(e&&null!=t.stateNode)Ol(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=Ka(Qa.current),Ka(Va.current),pa(t)){if(r=t.stateNode,n=t.memoizedProps,r[fo]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Xr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,!!(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[fo]=t,t.stateNode=r}return Vl(t),null;case 13:if(Co(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&1&t.mode&&!(128&t.flags))fa(),ga(),t.flags|=98560,i=!1;else if(i=pa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[fo]=t}else ga(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Vl(t),i=!1}else null!==ia&&(ic(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ei.current?0===Os&&(Os=3):mc())),null!==t.updateQueue&&(t.flags|=4),Vl(t),null);case 4:return Za(),Rl(e,t),null===e&&Ur(t.stateNode.containerInfo),Vl(t),null;case 10:return Ta(t.type._context),Vl(t),null;case 19:if(Co(ei),null===(i=t.memoizedState))return Vl(t),null;if(r=!!(128&t.flags),null===(s=i.rendering))if(r)Gl(i,!1);else{if(0!==Os||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(s=ti(e))){for(t.flags|=128,Gl(i,!1),null!==(r=s.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(s=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=s.childLanes,i.lanes=s.lanes,i.child=s.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=s.memoizedProps,i.memoizedState=s.memoizedState,i.updateQueue=s.updateQueue,i.type=s.type,e=s.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Ao(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>Us&&(t.flags|=128,r=!0,Gl(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Gl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!s.alternate&&!aa)return Vl(t),null}else 2*Ze()-i.renderingStartTime>Us&&1073741824!==n&&(t.flags|=128,r=!0,Gl(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=i.last)?n.sibling=s:t.child=s,i.last=s)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,Ao(ei,r?1&n|2:1&n),t):(Vl(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Rs)&&(Vl(t),6&t.subtreeFlags&&(t.flags|=8192)):Vl(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Ql(e,t){switch(na(t),t.tag){case 1:return Lo(t.type)&&Oo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Za(),Co(Po),Co(jo),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Ja(t),null;case 13:if(Co(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ga()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Co(ei),null;case 4:return Za(),null;case 10:return Ta(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Nl=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}},Rl=function(){},Ll=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Ka(Va.current);var a,i=null;switch(n){case"input":o=K(e,o),r=K(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var s=o[u];for(a in s)s.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(l.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(s=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==s&&(null!=c||null!=s))if("style"===u)if(s){for(a in s)!s.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&s[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,s=s?s.__html:void 0,null!=c&&s!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(l.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||s===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ol=function(e,t,n,r){n!==r&&(t.flags|=4)};var Kl=!1,Yl=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Xl=null;function Jl(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){_c(e,t,r)}else n.current=null}function es(e,t,n){try{n()}catch(r){_c(e,t,r)}}var ts=!1;function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&es(t,n,a)}o=o.next}while(o!==r)}}function rs(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function os(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function as(e){var t=e.alternate;null!==t&&(e.alternate=null,as(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[fo],delete t[go],delete t[ho],delete t[bo],delete t[yo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function is(e){return 5===e.tag||3===e.tag||4===e.tag}function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||is(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ss(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,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=Jr));else if(4!==r&&null!==(e=e.child))for(ss(e,t,n),e=e.sibling;null!==e;)ss(e,t,n),e=e.sibling}function cs(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var us=null,ds=!1;function ps(e,t,n){for(n=n.child;null!==n;)fs(e,t,n),n=n.sibling}function fs(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(l){}switch(n.tag){case 5:Yl||Jl(n,t);case 6:var r=us,o=ds;us=null,ps(e,t,n),ds=o,null!==(us=r)&&(ds?(e=us,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):us.removeChild(n.stateNode));break;case 18:null!==us&&(ds?(e=us,n=n.stateNode,8===e.nodeType?so(e.parentNode,n):1===e.nodeType&&so(e,n),Ut(e)):so(us,n.stateNode));break;case 4:r=us,o=ds,us=n.stateNode.containerInfo,ds=!0,ps(e,t,n),us=r,ds=o;break;case 0:case 11:case 14:case 15:if(!Yl&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(2&a||4&a)&&es(n,t,i),o=o.next}while(o!==r)}ps(e,t,n);break;case 1:if(!Yl&&(Jl(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){_c(n,t,l)}ps(e,t,n);break;case 21:ps(e,t,n);break;case 22:1&n.mode?(Yl=(r=Yl)||null!==n.memoizedState,ps(e,t,n),Yl=r):ps(e,t,n);break;default:ps(e,t,n)}}function gs(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zl),t.forEach((function(t){var r=Tc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function ms(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:us=s.stateNode,ds=!1;break e;case 3:case 4:us=s.stateNode.containerInfo,ds=!0;break e}s=s.return}if(null===us)throw Error(a(160));fs(i,l,o),us=null,ds=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){_c(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)hs(t,e),t=t.sibling}function hs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(ms(t,e),bs(e),4&r){try{ns(3,e,e.return),rs(3,e)}catch(h){_c(e,e.return,h)}try{ns(5,e,e.return)}catch(h){_c(e,e.return,h)}}break;case 1:ms(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return);break;case 5:if(ms(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return),32&e.flags){var o=e.stateNode;try{pe(o,"")}catch(h){_c(e,e.return,h)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,l=null!==n?n.memoizedProps:i,s=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===s&&"radio"===i.type&&null!=i.name&&Z(o,i),ve(s,l);var u=ve(s,i);for(l=0;l<c.length;l+=2){var d=c[l],p=c[l+1];"style"===d?he(o,p):"dangerouslySetInnerHTML"===d?de(o,p):"children"===d?pe(o,p):v(o,d,p,u)}switch(s){case"input":X(o,i);break;case"textarea":ae(o,i);break;case"select":var f=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var g=i.value;null!=g?ne(o,!!i.multiple,g,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[go]=i}catch(h){_c(e,e.return,h)}}break;case 6:if(ms(t,e),bs(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(h){_c(e,e.return,h)}}break;case 3:if(ms(t,e),bs(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(h){_c(e,e.return,h)}break;case 4:default:ms(t,e),bs(e);break;case 13:ms(t,e),bs(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||($s=Ze())),4&r&&gs(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Yl=(u=Yl)||d,ms(t,e),Yl=u):ms(t,e),bs(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&1&e.mode)for(Xl=e,d=e.child;null!==d;){for(p=Xl=d;null!==Xl;){switch(g=(f=Xl).child,f.tag){case 0:case 11:case 14:case 15:ns(4,f,f.return);break;case 1:Jl(f,f.return);var m=f.stateNode;if("function"==typeof m.componentWillUnmount){r=f,n=f.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(h){_c(r,n,h)}}break;case 5:Jl(f,f.return);break;case 22:if(null!==f.memoizedState){ks(p);continue}}null!==g?(g.return=f,Xl=g):ks(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{o=p.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(s=p.stateNode,l=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,s.style.display=me("display",l))}catch(h){_c(e,e.return,h)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(h){_c(e,e.return,h)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:ms(t,e),bs(e),4&r&&gs(e);case 21:}}function bs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(is(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(pe(o,""),r.flags&=-33),cs(e,ls(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;ss(e,ls(e),i);break;default:throw Error(a(161))}}catch(l){_c(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ys(e,t,n){Xl=e,vs(e,t,n)}function vs(e,t,n){for(var r=!!(1&e.mode);null!==Xl;){var o=Xl,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Kl;if(!i){var l=o.alternate,s=null!==l&&null!==l.memoizedState||Yl;l=Kl;var c=Yl;if(Kl=i,(Yl=s)&&!c)for(Xl=o;null!==Xl;)s=(i=Xl).child,22===i.tag&&null!==i.memoizedState?xs(o):null!==s?(s.return=i,Xl=s):xs(o);for(;null!==a;)Xl=a,vs(a,t,n),a=a.sibling;Xl=o,Kl=l,Yl=c}ws(e)}else 8772&o.subtreeFlags&&null!==a?(a.return=o,Xl=a):ws(e)}}function ws(e){for(;null!==Xl;){var t=Xl;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Yl||rs(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Yl)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:nl(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Ha(t,i,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ha(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&Ut(p)}}}break;default:throw Error(a(163))}Yl||512&t.flags&&os(t)}catch(f){_c(t,t.return,f)}}if(t===e){Xl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Xl=n;break}Xl=t.return}}function ks(e){for(;null!==Xl;){var t=Xl;if(t===e){Xl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Xl=n;break}Xl=t.return}}function xs(e){for(;null!==Xl;){var t=Xl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(s){_c(t,n,s)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(s){_c(t,o,s)}}var a=t.return;try{os(t)}catch(s){_c(t,a,s)}break;case 5:var i=t.return;try{os(t)}catch(s){_c(t,i,s)}}}catch(s){_c(t,t.return,s)}if(t===e){Xl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Xl=l;break}Xl=t.return}}var Ss,_s=Math.ceil,Es=w.ReactCurrentDispatcher,Cs=w.ReactCurrentOwner,As=w.ReactCurrentBatchConfig,Ts=0,js=null,Ps=null,Ns=0,Rs=0,Ls=Eo(0),Os=0,Ds=null,Is=0,Ms=0,Fs=0,zs=null,Bs=null,$s=0,Us=1/0,qs=null,Hs=!1,Gs=null,Vs=null,Ws=!1,Qs=null,Ks=0,Ys=0,Zs=null,Xs=-1,Js=0;function ec(){return 6&Ts?Ze():-1!==Xs?Xs:Xs=Ze()}function tc(e){return 1&e.mode?2&Ts&&0!==Ns?Ns&-Ns:null!==ha.transition?(0===Js&&(Js=mt()),Js):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Yt(e.type):1}function nc(e,t,n,r){if(50<Ys)throw Ys=0,Zs=null,Error(a(185));bt(e,n,r),2&Ts&&e===js||(e===js&&(!(2&Ts)&&(Ms|=n),4===Os&&lc(e,Ns)),rc(e,r),1===n&&0===Ts&&!(1&t.mode)&&(Us=Ze()+500,Bo&&qo()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),l=1<<i,s=o[i];-1===s?l&n&&!(l&r)||(o[i]=ft(l,t)):s<=t&&(e.expiredLanes|=l),a&=~l}}(e,t);var r=pt(e,e===js?Ns:0);if(0===r)null!==n&&Qe(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Qe(n),1===t)0===e.tag?function(e){Bo=!0,Uo(e)}(sc.bind(null,e)):Uo(sc.bind(null,e)),io((function(){!(6&Ts)&&qo()})),n=null;else{switch(wt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=jc(n,oc.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function oc(e,t){if(Xs=-1,Js=0,6&Ts)throw Error(a(327));var n=e.callbackNode;if(xc()&&e.callbackNode!==n)return null;var r=pt(e,e===js?Ns:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=hc(e,r);else{t=r;var o=Ts;Ts|=2;var i=gc();for(js===e&&Ns===t||(qs=null,Us=Ze()+500,pc(e,t));;)try{yc();break}catch(s){fc(e,s)}Aa(),Es.current=i,Ts=o,null!==Ps?t=0:(js=null,Ns=0,t=Os)}if(0!==t){if(2===t&&(0!==(o=gt(e))&&(r=o,t=ac(e,o))),1===t)throw n=Ds,pc(e,0),lc(e,r),rc(e,Ze()),n;if(6===t)lc(e,r);else{if(o=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!lr(a(),o))return!1}catch(l){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)||(t=hc(e,r),2===t&&(i=gt(e),0!==i&&(r=i,t=ac(e,i))),1!==t)))throw n=Ds,pc(e,0),lc(e,r),rc(e,Ze()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:kc(e,Bs,qs);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=$s+500-Ze())){if(0!==pt(e,0))break;if(((o=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(kc.bind(null,e,Bs,qs),t);break}kc(e,Bs,qs);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var l=31-it(r);i=1<<l,(l=t[l])>o&&(o=l),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*_s(r/1960))-r)){e.timeoutHandle=ro(kc.bind(null,e,Bs,qs),r);break}kc(e,Bs,qs);break;default:throw Error(a(329))}}}return rc(e,Ze()),e.callbackNode===n?oc.bind(null,e):null}function ac(e,t){var n=zs;return e.current.memoizedState.isDehydrated&&(pc(e,t).flags|=256),2!==(e=hc(e,t))&&(t=Bs,Bs=n,null!==t&&ic(t)),e}function ic(e){null===Bs?Bs=e:Bs.push.apply(Bs,e)}function lc(e,t){for(t&=~Fs,t&=~Ms,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function sc(e){if(6&Ts)throw Error(a(327));xc();var t=pt(e,0);if(!(1&t))return rc(e,Ze()),null;var n=hc(e,t);if(0!==e.tag&&2===n){var r=gt(e);0!==r&&(t=r,n=ac(e,r))}if(1===n)throw n=Ds,pc(e,0),lc(e,t),rc(e,Ze()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,Bs,qs),rc(e,Ze()),null}function cc(e,t){var n=Ts;Ts|=1;try{return e(t)}finally{0===(Ts=n)&&(Us=Ze()+500,Bo&&qo())}}function uc(e){null!==Qs&&0===Qs.tag&&!(6&Ts)&&xc();var t=Ts;Ts|=1;var n=As.transition,r=vt;try{if(As.transition=null,vt=1,e)return e()}finally{vt=r,As.transition=n,!(6&(Ts=t))&&qo()}}function dc(){Rs=Ls.current,Co(Ls)}function pc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Ps)for(n=Ps.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Oo();break;case 3:Za(),Co(Po),Co(jo),ri();break;case 5:Ja(r);break;case 4:Za();break;case 13:case 19:Co(ei);break;case 10:Ta(r.type._context);break;case 22:case 23:dc()}n=n.return}if(js=e,Ps=e=Lc(e.current,null),Ns=Rs=t,Os=0,Ds=null,Fs=Ms=Is=0,Bs=zs=null,null!==Ra){for(t=0;t<Ra.length;t++)if(null!==(r=(n=Ra[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ra=null}return e}function fc(e,t){for(;;){var n=Ps;try{if(Aa(),oi.current=Xi,ui){for(var r=li.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ui=!1}if(ii=0,ci=si=li=null,di=!1,pi=0,Cs.current=null,null===n||null===n.return){Os=1,Ds=t,Ps=null;break}e:{var i=e,l=n.return,s=n,c=t;if(t=Ns,s.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=s,p=d.tag;if(!(1&d.mode||0!==p&&11!==p&&15!==p)){var f=d.alternate;f?(d.updateQueue=f.updateQueue,d.memoizedState=f.memoizedState,d.lanes=f.lanes):(d.updateQueue=null,d.memoizedState=null)}var g=hl(l);if(null!==g){g.flags&=-257,bl(g,l,s,0,t),1&g.mode&&ml(i,u,t),c=u;var m=(t=g).updateQueue;if(null===m){var h=new Set;h.add(c),t.updateQueue=h}else m.add(c);break e}if(!(1&t)){ml(i,u,t),mc();break e}c=Error(a(426))}else if(aa&&1&s.mode){var b=hl(l);if(null!==b){!(65536&b.flags)&&(b.flags|=256),bl(b,l,s,0,t),ma(cl(c,s));break e}}i=c=cl(c,s),4!==Os&&(Os=2),null===zs?zs=[i]:zs.push(i),i=l;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ua(i,fl(0,c,t));break e;case 1:s=c;var y=i.type,v=i.stateNode;if(!(128&i.flags||"function"!=typeof y.getDerivedStateFromError&&(null===v||"function"!=typeof v.componentDidCatch||null!==Vs&&Vs.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Ua(i,gl(i,s,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,Ps===n&&null!==n&&(Ps=n=n.return);continue}break}}function gc(){var e=Es.current;return Es.current=Xi,null===e?Xi:e}function mc(){0!==Os&&3!==Os&&2!==Os||(Os=4),null===js||!(268435455&Is)&&!(268435455&Ms)||lc(js,Ns)}function hc(e,t){var n=Ts;Ts|=2;var r=gc();for(js===e&&Ns===t||(qs=null,pc(e,t));;)try{bc();break}catch(o){fc(e,o)}if(Aa(),Ts=n,Es.current=r,null!==Ps)throw Error(a(261));return js=null,Ns=0,Os}function bc(){for(;null!==Ps;)vc(Ps)}function yc(){for(;null!==Ps&&!Ke();)vc(Ps)}function vc(e){var t=Ss(e.alternate,e,Rs);e.memoizedProps=e.pendingProps,null===t?wc(e):Ps=t,Cs.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ql(n,t)))return n.flags&=32767,void(Ps=n);if(null===e)return Os=6,void(Ps=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Wl(n,t,Rs)))return void(Ps=n);if(null!==(t=t.sibling))return void(Ps=t);Ps=t=e}while(null!==t);0===Os&&(Os=5)}function kc(e,t,n){var r=vt,o=As.transition;try{As.transition=null,vt=1,function(e,t,n,r){do{xc()}while(null!==Qs);if(6&Ts)throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===js&&(Ps=js=null,Ns=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Ws||(Ws=!0,jc(tt,(function(){return xc(),null}))),i=!!(15990&n.flags),!!(15990&n.subtreeFlags)||i){i=As.transition,As.transition=null;var l=vt;vt=1;var s=Ts;Ts|=4,Cs.current=null,function(e,t){if(eo=Ht,fr(e=pr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(k){n=null;break e}var l=0,s=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var g;p!==n||0!==o&&3!==p.nodeType||(s=l+o),p!==i||0!==r&&3!==p.nodeType||(c=l+r),3===p.nodeType&&(l+=p.nodeValue.length),null!==(g=p.firstChild);)f=p,p=g;for(;;){if(p===e)break t;if(f===n&&++u===o&&(s=l),f===i&&++d===r&&(c=l),null!==(g=p.nextSibling))break;f=(p=f).parentNode}p=g}n=-1===s||-1===c?null:{start:s,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Xl=t;null!==Xl;)if(e=(t=Xl).child,1028&t.subtreeFlags&&null!==e)e.return=t,Xl=e;else for(;null!==Xl;){t=Xl;try{var m=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var h=m.memoizedProps,b=m.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?h:nl(t.type,h),b);y.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(a(163))}}catch(k){_c(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Xl=e;break}Xl=t.return}m=ts,ts=!1}(e,n),hs(n,e),gr(to),Ht=!!eo,to=eo=null,e.current=n,ys(n,e,o),Ye(),Ts=s,vt=l,As.transition=i}else e.current=n;if(Ws&&(Ws=!1,Qs=e,Ks=o),i=e.pendingLanes,0===i&&(Vs=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,!(128&~e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Hs)throw Hs=!1,e=Gs,Gs=null,e;!!(1&Ks)&&0!==e.tag&&xc(),i=e.pendingLanes,1&i?e===Zs?Ys++:(Ys=0,Zs=e):Ys=0,qo()}(e,t,n,r)}finally{As.transition=o,vt=r}return null}function xc(){if(null!==Qs){var e=wt(Ks),t=As.transition,n=vt;try{if(As.transition=null,vt=16>e?16:e,null===Qs)var r=!1;else{if(e=Qs,Qs=null,Ks=0,6&Ts)throw Error(a(331));var o=Ts;for(Ts|=4,Xl=e.current;null!==Xl;){var i=Xl,l=i.child;if(16&Xl.flags){var s=i.deletions;if(null!==s){for(var c=0;c<s.length;c++){var u=s[c];for(Xl=u;null!==Xl;){var d=Xl;switch(d.tag){case 0:case 11:case 15:ns(8,d,i)}var p=d.child;if(null!==p)p.return=d,Xl=p;else for(;null!==Xl;){var f=(d=Xl).sibling,g=d.return;if(as(d),d===u){Xl=null;break}if(null!==f){f.return=g,Xl=f;break}Xl=g}}}var m=i.alternate;if(null!==m){var h=m.child;if(null!==h){m.child=null;do{var b=h.sibling;h.sibling=null,h=b}while(null!==h)}}Xl=i}}if(2064&i.subtreeFlags&&null!==l)l.return=i,Xl=l;else e:for(;null!==Xl;){if(2048&(i=Xl).flags)switch(i.tag){case 0:case 11:case 15:ns(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Xl=y;break e}Xl=i.return}}var v=e.current;for(Xl=v;null!==Xl;){var w=(l=Xl).child;if(2064&l.subtreeFlags&&null!==w)w.return=l,Xl=w;else e:for(l=v;null!==Xl;){if(2048&(s=Xl).flags)try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(x){_c(s,s.return,x)}if(s===l){Xl=null;break e}var k=s.sibling;if(null!==k){k.return=s.return,Xl=k;break e}Xl=s.return}}if(Ts=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(x){}r=!0}return r}finally{vt=n,As.transition=t}}return!1}function Sc(e,t,n){e=Ba(e,t=fl(0,t=cl(n,t),1),1),t=ec(),null!==e&&(bt(e,1,t),rc(e,t))}function _c(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Vs||!Vs.has(r))){t=Ba(t,e=gl(t,e=cl(n,e),1),1),e=ec(),null!==t&&(bt(t,1,e),rc(t,e));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,js===e&&(Ns&n)===n&&(4===Os||3===Os&&(130023424&Ns)===Ns&&500>Ze()-$s?pc(e,0):Fs|=n),rc(e,t)}function Cc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Da(e,t))&&(bt(e,t,n),rc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Cc(e,n)}function jc(e,t){return We(e,t)}function Pc(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.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Nc(e,t,n,r){return new Pc(e,t,n,r)}function Rc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Lc(e,t){var n=e.alternate;return null===n?((n=Nc(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.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,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 Oc(e,t,n,r,o,i){var l=2;if(r=e,"function"==typeof e)Rc(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case S:return Dc(n.children,o,i,t);case _:l=8,o|=8;break;case E:return(e=Nc(12,n,t,2|o)).elementType=E,e.lanes=i,e;case j:return(e=Nc(13,n,t,o)).elementType=j,e.lanes=i,e;case P:return(e=Nc(19,n,t,o)).elementType=P,e.lanes=i,e;case L:return Ic(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case T:l=11;break e;case N:l=14;break e;case R:l=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Nc(l,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Nc(7,e,r,t)).lanes=n,e}function Ic(e,t,n,r){return(e=Nc(22,e,r,t)).elementType=L,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Nc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Nc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ht(0),this.expirationTimes=ht(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ht(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Bc(e,t,n,r,o,a,i,l,s){return e=new zc(e,t,n,l,s),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Nc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ma(a),e}function $c(e){if(!e)return To;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Lo(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Lo(n))return Io(e,n,t)}return t}function Uc(e,t,n,r,o,a,i,l,s){return(e=Bc(n,r,!0,e,0,a,0,l,s)).context=$c(null),n=e.current,(a=za(r=ec(),o=tc(n))).callback=null!=t?t:null,Ba(n,a,o),e.current.lanes=o,bt(e,o,r),rc(e,r),e}function qc(e,t,n,r){var o=t.current,a=ec(),i=tc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=za(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ba(o,t,i))&&(nc(e,o,i,a),$a(e,o,i)),i}function Hc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Gc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Vc(e,t){Gc(e,t),(e=e.alternate)&&Gc(e,t)}Ss=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Po.current)vl=!0;else{if(!(e.lanes&n||128&t.flags))return vl=!1,function(e,t,n){switch(t.tag){case 3:jl(t),ga();break;case 5:Xa(t);break;case 1:Lo(t.type)&&Mo(t);break;case 4:Ya(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;Ao(Sa,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Ao(ei,1&ei.current),t.flags|=128,null):n&t.child.childLanes?Ml(e,t,n):(Ao(ei,1&ei.current),null!==(e=Hl(e,t,n))?e.sibling:null);Ao(ei,1&ei.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return Ul(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),Ao(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,_l(e,t,n)}return Hl(e,t,n)}(e,t,n);vl=!!(131072&e.flags)}else vl=!1,aa&&1048576&t.flags&&ea(t,Wo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ql(e,t),e=t.pendingProps;var o=Ro(t,jo.current);Pa(t,n),o=hi(null,t,r,e,o,n);var i=bi();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Lo(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ma(t),o.updater=ol,t.stateNode=o,o._reactInternals=t,sl(t,r,e,n),t=Tl(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),wl(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ql(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Rc(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===N)return 14}return 2}(r),e=nl(r,e),o){case 0:t=Cl(null,t,r,e,n);break e;case 1:t=Al(null,t,r,e,n);break e;case 11:t=kl(null,t,r,e,n);break e;case 14:t=xl(null,t,r,nl(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Cl(e,t,r,o=t.elementType===r?o:nl(r,o),n);case 1:return r=t.type,o=t.pendingProps,Al(e,t,r,o=t.elementType===r?o:nl(r,o),n);case 3:e:{if(jl(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Fa(e,t),qa(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Pl(e,t,r,n,o=cl(Error(a(423)),t));break e}if(r!==o){t=Pl(e,t,r,n,o=cl(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=xa(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ga(),r===o){t=Hl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return Xa(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,l=o.children,no(r,o)?l=null:null!==i&&no(r,i)&&(t.flags|=32),El(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Ml(e,t,n);case 4:return Ya(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ka(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,kl(e,t,r,o=t.elementType===r?o:nl(r,o),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,Ao(Sa,r._currentValue),r._currentValue=l,null!==i)if(lr(i.value,l)){if(i.children===o.children&&!Po.current){t=Hl(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var s=i.dependencies;if(null!==s){l=i.child;for(var c=s.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=za(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),ja(i.return,n,t),s.lanes|=n;break}c=c.next}}else if(10===i.tag)l=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(l=i.return))throw Error(a(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),ja(l,n,t),l=i.sibling}else l=i.child;if(null!==l)l.return=i;else for(l=i;null!==l;){if(l===t){l=null;break}if(null!==(i=l.sibling)){i.return=l.return,l=i;break}l=l.return}i=l}wl(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Pa(t,n),r=r(o=Na(o)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return o=nl(r=t.type,t.pendingProps),xl(e,t,r,o=nl(r.type,o),n);case 15:return Sl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:nl(r,o),ql(e,t),t.tag=1,Lo(r)?(e=!0,Mo(t)):e=!1,Pa(t,n),il(t,r,o),sl(t,r,o,n),Tl(null,t,r,!0,e,n);case 19:return Ul(e,t,n);case 22:return _l(e,t,n)}throw Error(a(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Qc(e){this._internalRoot=e}function Kc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Xc(){}function Jc(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var l=o;o=function(){var e=Hc(i);l.call(e)}}qc(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Hc(i);a.call(e)}}var i=Uc(t,r,e,0,null,!1,0,"",Xc);return e._reactRootContainer=i,e[mo]=i.current,Ur(8===e.nodeType?e.parentNode:e),uc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var l=r;r=function(){var e=Hc(s);l.call(e)}}var s=Bc(e,0,!1,null,0,!1,0,"",Xc);return e._reactRootContainer=s,e[mo]=s.current,Ur(8===e.nodeType?e.parentNode:e),uc((function(){qc(t,s,n,r)})),s}(n,t,e,o,r);return Hc(i)}Kc.prototype.render=Qc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));qc(e,t,null,null)},Kc.prototype.unmount=Qc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uc((function(){qc(null,e,null,null)})),t[mo]=null}},Kc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Lt.length&&0!==t&&t<Lt[n].priority;n++);Lt.splice(n,0,e),0===n&&Mt(e)}},kt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),rc(t,Ze()),!(6&Ts)&&(Us=Ze()+500,qo()))}break;case 13:uc((function(){var t=Da(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Vc(e,1)}},xt=function(e){if(13===e.tag){var t=Da(e,134217728);if(null!==t)nc(t,e,134217728,ec());Vc(e,134217728)}},St=function(e){if(13===e.tag){var t=tc(e),n=Da(e,t);if(null!==n)nc(n,e,t,ec());Vc(e,t)}},_t=function(){return vt},Et=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},xe=function(e,t,n){switch(t){case"input":if(X(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 o=xo(r);if(!o)throw Error(a(90));W(r),X(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Te=cc,je=uc;var eu={usingClientEntryPoint:!1,Events:[wo,ko,xo,Ce,Ae,cc]},tu={findFiberByHostInstance:vo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{ot=ru.inject(nu),at=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(a(299));var n=!1,r="",o=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Bc(e,1,!1,null,0,n,0,r,o),e[mo]=t.current,Ur(8===e.nodeType?e.parentNode:e),new Qc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(a(200));return Jc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",l=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Uc(t,null,e,1,null!=n?n:null,o,0,i,l),e[mo]=t.current,Ur(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Kc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(a(200));return Jc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(a(40));return!!e._reactRootContainer&&(uc((function(){Jc(null,null,e,!1,(function(){e._reactRootContainer=null,e[mo]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return Jc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},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,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(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,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!a(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!a(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(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(o&&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&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!a(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(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),o=n(5556),a=n.n(o),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function p(){return p=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},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}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"]},y={type:["application/ld+json"]},v={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]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=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},_=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},E=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},A=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),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])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 o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var l=a[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 c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var l=a[i],s=p({},r[l],o[l]);r[l]=s}return e}),[]).reverse()},j=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},P=function(e){return Array.isArray(e)?e.join(""):e},N=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}},R=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},L=[h.NOSCRIPT,h.SCRIPT,h.STYLE],O=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}),"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=P(t);return o?"<"+e+' data-rh="true" '+o+">"+O(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+O(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+O(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===L.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=N(e.metaTags,v),a=N(t,b),i=N(n,y);return{priorityMethods:{toComponent:function(){return[].concat(M(h.META,o.priority),M(h.LINK,a.priority),M(h.SCRIPT,i.priority))},toString:function(){return F(h.META,o.priority,r)+" "+F(h.LINK,a.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=g.priorityMethods,u=g.linkTags,d=g.metaTags,p=g.scriptTags}return{priority:f,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,a,r),script:F(h.SCRIPT,p,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:s,titleAttributes:c},r)}},B=[],$=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?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B: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:{}}))},U=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===o.indexOf(s)&&o.push(s);var u=a.indexOf(s);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Q=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(h.BODY,e.bodyAttributes),W(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),W(h.TITLE,t)}(u,d);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,o),metaTags:V(h.META,a),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,s),styleTags:V(h.STYLE,c)},f={},g={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)})),t&&t(),l(e,f,g)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(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,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:A(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("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(e),scriptTags:T(h.SCRIPT,["src","innerHTML"],e),styleTags:T(h.STYLE,["cssText"],e),title:_(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:j(e,"prioritizeSeoTags")});G.canUseDOM?(t=a,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){Q(t,(function(){K=null}))})):(Q(t),K=null)):z&&(o=z(a)),r(o)},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);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(R(this.props,"helmetData"),R(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 p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(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."),c()(!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,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,Z),l=Object.keys(i).reduce((function(e,t){return e[x[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,a),s){case h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:l,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Y,p({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().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,o=n?Symbol.for("react.portal"):60106,a=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,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=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 u:case d:case a:case l:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case m:case s:return e;default:return t}}case o:return t}}}function x(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=l,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||k(e)===u},t.isConcurrentMode=x,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===l||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===s||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},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 o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}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(){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=[],c=[];var u=l.createContext(null);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 p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.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 f(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return s.push(h),"function"==typeof g.webpack&&c.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),p=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.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&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.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(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(l.Component),a(d,"contextType",u),p}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(p,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(u.Provider,{value:{report:this.props.report}},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)}))}m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(s).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=m},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.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,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>w});var r=n(6347),o=n(2892),a=n(6540),i=n(1513),l=n(8168),s=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var p=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},g=function(e){return e},m=a.forwardRef;void 0===m&&(m=g);var h=m((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.A)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=g!==m&&t||n,a.createElement("a",u)}));var b=m((function(e,t){var n=e.component,o=void 0===n?h:n,u=e.replace,d=e.to,b=e.innerRef,y=(0,s.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=f(p(d,e.location),e.location),s=r?n.createHref(r):"",h=(0,l.A)({},y,{href:s,navigate:function(){var t=p(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(f(t));(u||r?n.replace:n.push)(t)}});return g!==m?h.ref=t||b:h.innerRef=b,a.createElement(o,h)}))})),y=function(e){return e},v=a.forwardRef;void 0===v&&(v=y);var w=v((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,g=e.className,m=e.exact,h=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,_=e.to,E=e.innerRef,C=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=f(p(_,n),n),s=i.pathname,A=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=A?(0,r.B6)(n.pathname,{path:A,exact:m,sensitive:k,strict:x}):null,j=!!(h?h(T,n):T),P="function"==typeof g?g(j):g,N="function"==typeof S?S(j):S;j&&(P=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(" ")}(P,u),N=(0,l.A)({},N,d));var R=(0,l.A)({"aria-current":j&&o||null,className:P,style:N,to:i},C);return y!==v?R.ref=t||E:R.innerRef=E,a.createElement(b,R)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>v,W6:()=>R,XZ:()=>y,dO:()=>P,qh:()=>_,zy:()=>L});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),l=n(1513),s=n(1561),c=n(8168),u=n(5302),d=n.n(u),p=(n(4363),n(8587)),f=(n(4146),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,l="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||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 o=n.prototype;return o.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.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 o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},o.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},o.getValue=function(){return this.context[l]?this.context[l].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[l]=i().object,a),{Provider:s,Consumer:c}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),y=h("Router"),v=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 o.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var w={},k=1e4,x=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=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=w[n]||(w[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return x<k&&(r[e]=a,x++),a}(n,{end:a,strict:l,sensitive:c}),o=r.regexp,i=r.keys,s=o.exec(e);if(!s)return null;var u=s[0],p=s.slice(1),f=e===u;return a&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=p[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 o.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,a=(0,c.A)({},t,{location:n,match:r}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===o.Children.count(e)}(l)&&(l=null),o.createElement(y.Provider,{value:a},a.match?l?"function"==typeof l?l(a):l:u?o.createElement(u,a):d?d(a):null:"function"==typeof l?l(a):null)}))},t}(o.Component);function E(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=E(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function A(e){return"string"==typeof e?e:(0,l.AO)(e)}function T(e){return function(){(0,s.A)(!1)}}function j(){}o.Component;var P=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(a.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var N=o.useContext;function R(){return N(b)}function L(){return N(y).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,l=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!s.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:l.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,h={};function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,m(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,x=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,l=null;if(null!=t)for(o in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var s=arguments.length-2;if(1===s)a.children=r;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in s=e.defaultProps)void 0===a[o]&&(a[o]=s[o]);return{$$typeof:n,type:e,key:i,ref:l,props:a,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var A=/\/+/g;function T(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 j(e,t,o,a,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 n:case r:s=!0}}if(s)return i=i(s=e),e=""===a?"."+T(s,0):a,k(i)?(o="",null!=e&&(o=e.replace(A,"$&/")+"/"),j(i,t,o,"",(function(e){return e}))):null!=i&&(C(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(A,"$&/")+"/")+e)),t.push(i)),1;if(s=0,a=""===a?".":a+":",k(e))for(var c=0;c<e.length;c++){var u=a+T(l=e[c],c);s+=j(l,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=j(l=l.value,t,o,u=a+T(l,c++),i);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function P(e,t,n){if(null==e)return e;var r=[],o=0;return j(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function N(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var R={current:null},L={transition:null},O={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:L,ReactCurrentOwner:S};function D(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:P,forEach:function(e,t,n){P(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return P(e,(function(){t++})),t},toArray:function(e){return P(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=i,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.act=D,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=m({},e.props),a=e.key,i=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,l=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)x.call(t,c)&&!_.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=r;else if(1<c){s=Array(c);for(var u=0;u<c;u++)s[u]=arguments[u+2];o.children=s}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=L.transition;L.transition={};try{e()}finally{L.transition=t}},t.unstable_act=D,t.useCallback=function(e,t){return R.current.useCallback(e,t)},t.useContext=function(e){return R.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return R.current.useDeferredValue(e)},t.useEffect=function(e,t){return R.current.useEffect(e,t)},t.useId=function(){return R.current.useId()},t.useImperativeHandle=function(e,t,n){return R.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return R.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return R.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return R.current.useMemo(e,t)},t.useReducer=function(e,t,n){return R.current.useReducer(e,t,n)},t.useRef=function(e){return R.current.useRef(e)},t.useState=function(e){return R.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return R.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return R.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>a(s,n))c<o&&0>a(u,s)?(e[r]=u,e[c]=n,r=c):(e[r]=s,e[l]=n,r=l);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}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}}var c=[],u=[],d=1,p=null,f=3,g=!1,m=!1,h=!1,b="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(h=!1,w(e),!m)if(null!==r(c))m=!0,L(x);else{var t=r(u);null!==t&&O(k,t.startTime-e)}}function x(e,n){m=!1,h&&(h=!1,y(C),C=-1),g=!0;var a=f;try{for(w(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!j());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var l=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?p.callback=l:p===r(c)&&o(c),w(n)}else o(c);p=r(c)}if(null!==p)var s=!0;else{var d=r(u);null!==d&&O(k,d.startTime-n),s=!1}return s}finally{p=null,f=a,g=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,_=!1,E=null,C=-1,A=5,T=-1;function j(){return!(t.unstable_now()-T<A)}function P(){if(null!==E){var e=t.unstable_now();T=e;var n=!0;try{n=E(!0,e)}finally{n?S():(_=!1,E=null)}}else _=!1}if("function"==typeof v)S=function(){v(P)};else if("undefined"!=typeof MessageChannel){var N=new MessageChannel,R=N.port2;N.port1.onmessage=P,S=function(){R.postMessage(null)}}else S=function(){b(P,0)};function L(e){E=e,_||(_=!0,S())}function O(e,n){C=b((function(){e(t.unstable_now())}),n)}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(){m||g||(m=!0,L(x))},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"):A=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:l=a+l,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(h?(y(C),C=-1):h=!0,O(k,a-i))):(e.sortIndex=l,n(c,e),m||g||(m=!0,L(x))),e},t.unstable_shouldYield=j,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<a.length;s++){var c=a[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"drand",tagline:"Distributed randomness beacon",favicon:"img/favicon.ico",url:"https://kentbull.github.io",baseUrl:"/drand-docs/",organizationName:"kentbull",projectName:"drand-docs",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"./sidebars.ts",editUrl:"https://github.com/kentbull/drand-docs/tree/main"},blog:{showReadingTime:!0,feedOptions:{type:["rss","atom"],xslt:!0},editUrl:"https://github.com/kentbull/drand-docs/tree/main",onInlineTags:"warn",onInlineAuthors:"warn",onUntruncatedBlogPosts:"warn"},theme:{customCss:"./src/css/custom.css"}}]],themeConfig:{image:"img/league-members.avif",navbar:{title:"drand",logo:{alt:"drand Logo",src:"img/drand-logo.avif"},items:[{type:"docSidebar",sidebarId:"docsSidebar",position:"left",label:"Docs"},{to:"/blog",label:"Blog",position:"left"},{href:"https://github.com/kentbull/drand-docs",label:"GitHub",position:"right"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"Docs",items:[{label:"Dev Docs",to:"/docs/home"}]},{title:"Community",items:[{label:"Stack Overflow",href:"https://stackoverflow.com/questions/tagged/drand"},{label:"Slack",href:"https://join.slack.com/t/drandworkspace/shared_invite/zt-2p00bn43o-qALTK5RZEIK3I4fIO9h8dQ"}]},{title:"More",items:[{label:"Blog",to:"/blog"},{label:"GitHub",href:"https://github.com/drand/drand"}]}],copyright:"Apache 2.0 and/or MIT Licensed 2024 Randamu, Inc.\u2122 Built with Docusaurus."},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"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!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)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,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 o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},4164:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},1765:(e,t,n)=>{"use strict";n.d(t,{My:()=>A,f4:()=>ee});var r,o,a,i,l,s,c,u=n(6540),d=n(4164),p=Object.create,f=Object.defineProperty,g=Object.defineProperties,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyDescriptors,b=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,x=(e,t,n)=>t in e?f(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))w.call(t,n)&&x(e,n,t[n]);if(y)for(var n of y(t))k.call(t,n)&&x(e,n,t[n]);return e},_=(e,t)=>g(e,h(t)),E=(e,t)=>{var n={};for(var r in e)w.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&y)for(var r of y(e))t.indexOf(r)<0&&k.call(e,r)&&(n[r]=e[r]);return n},C=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(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 o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);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 o=e.classList;if(o.contains(t))return!0;if(o.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 o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=a[l])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],o||l);var s=t[l],c=r.util.type(s);"Object"!==c||a[i(s)]?"Array"!==c||a[i(s)]||(a[i(s)]=!0,e(s,n,l,a)):(a[i(s)]=!0,e(s,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new l;return s(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},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 o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,l,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var g=0;g<f.length;++g){if(d&&d.cause==p+","+g)return;var m=f[g],h=m.inside,b=!!m.lookbehind,y=!!m.greedy,v=m.alias;if(y&&!m.pattern.global){var w=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,w+"g")}for(var k=m.pattern||m,x=l.next,S=u;x!==t.tail&&!(d&&S>=d.reach);S+=x.value.length,x=x.next){var _=x.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,C=1;if(y){if(!(E=a(k,S,e,b))||E.index>=e.length)break;var A=E.index,T=E.index+E[0].length,j=S;for(j+=x.value.length;A>=j;)j+=(x=x.next).value.length;if(S=j-=x.value.length,x.value instanceof o)continue;for(var P=x;P!==t.tail&&(j<T||"string"==typeof P.value);P=P.next)C++,j+=P.value.length;C--,_=e.slice(S,j),E.index-=S}else if(!(E=a(k,0,_,b)))continue;A=E.index;var N=E[0],R=_.slice(0,A),L=_.slice(A+N.length),O=S+_.length;d&&O>d.reach&&(d.reach=O);var D=x.prev;if(R&&(D=s(t,D,R),S+=R.length),c(t,D,C),x=s(t,D,new o(p,h?r.tokenize(N,h):N,v,N)),L&&s(t,x,L),C>1){var I={cause:p+","+g,reach:O};i(e,t,n,x.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.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,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={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(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var l="";for(var s in a.attributes)l+=" "+s+'="'+(a.attributes[s]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[b(r)[0]])((o={exports:{}}).exports,o),o.exports}),A=((e,t,n)=>(n=null!=e?p(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of b(t))w.call(e,o)||o===n||f(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:f(n,"default",{value:e,enumerable:!0}),e)))(C());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"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},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;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:A.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:A.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},A.languages.insertBefore("markup","cdata",t)}}),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,a=A,i={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},s="(?:[^\\\\-]|"+(l=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")",s=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:l,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":i,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:l}},"special-escape":i,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:l,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":c}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},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.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:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),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,A.languages.actionscript=A.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),A.languages.actionscript["class-name"].alias="function",delete A.languages.actionscript.parameter,delete A.languages.actionscript["literal-property"],A.languages.markup&&A.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:A.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},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=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var l=0,s=i.length;l<s;l++)i[l]instanceof RegExp&&(i[l]={pattern:i[l]}),r(i[l]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(A),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),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,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(A),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(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("\\[(?:[^[\\]\"']|"+t.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":[t,{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}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{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|RebeccaPurple|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:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(A),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\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})),a=/"(?:[^"\\\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"(?:"+o+"|"+a+")"}))),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(a),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,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(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("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),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 o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n)):l[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),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 o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(f(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<o.length)){var l=p(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&0<=o.indexOf(c.content)&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))o++;else if(r.test(l)&&0==--o)return a}return-1}function f(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,o=r.inside["interpolation-punctuation"],a=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(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function s(t,n,i){var s=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(s=l(s.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,s,p,f,g,m,h,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(h=(m="string"==typeof b?b:b.content).indexOf(i))&&(++c,s=m.substring(0,h),g=u[i],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(g,f)).length&&((p=[1,1]).push.apply(p,l(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,g),f=m.substring(h+i.length),g=[],s&&g.push(s),g.push(p),f&&(t(m=[f]),g.push.apply(g,m)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(g)),a+=g.length-1):b.content=g)):(h=b.content,Array.isArray(h)?t(h):t([h]))}}(s),new e.Token(i,s,"language-"+i,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 c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,l,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,l=e.languages[c])&&(a[1]=s(i,l,c))):t(a):"string"!=typeof a&&t([a]))}}(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){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(A),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(A),A.languages.n4js=A.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),A.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),A.languages.n4jsd=A.languages.n4js,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 o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(A),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===l(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:l(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=l(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=l(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=l(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\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:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var l=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(l).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(A),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(A),A.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},A.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=A.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(A),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,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.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){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(A),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){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),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;((e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>j,duotoneLight:()=>P,github:()=>N,jettwaveDark:()=>H,jettwaveLight:()=>G,nightOwl:()=>R,nightOwlLight:()=>L,oceanicNext:()=>I,okaidia:()=>M,oneDark:()=>V,oneLight:()=>W,palenight:()=>F,shadesOfPurple:()=>z,synthwave84:()=>B,ultramin:()=>$,vsDark:()=>U,vsLight:()=>q});var T={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)"}}]},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","atrule","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"}}]},P={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{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:"#896724"}}]},N={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"}}]},R={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},L={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},O="#c5a5c5",D="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:O}},{types:["attr-value"],style:{color:D}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:D}},{types:["punctuation"],style:{color:D}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:O}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},M={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},F={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},z={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},B={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},$={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},U={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},q={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},H={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},G={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},V={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{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:"hsl(220, 14%, 71%)"}}]},W={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{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:"hsl(230, 8%, 24%)"}}]},Q=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=S(S({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=_(S({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Y=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)},Z=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},X=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,l=[];const s=[l];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Z(c,u.type),u.alias&&(c=Z(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(K),p=d.length;l.push({types:c,content:d[0]});for(let t=1;t<p;t++)Y(l),s.push(l=[]),l.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return Y(l),s},J=({children:e,language:t,code:n,theme:r,prism:o})=>{const a=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Q(t,e)),o=(0,u.useRef)(),a=(0,u.useRef)();return(0,u.useEffect)((()=>{t===o.current&&e===a.current||(o.current=t,a.current=e,r(Q(t,e)))}),[e,t]),n})(a,r),l=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=E(n,["className","style","line"]);const l=_(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=S(S({},l.style||{}),o)),l}),[e]))(i),s=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=E(n,["token","className","style"]);const l=_(S({},i),{className:(0,d.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=S(S({},l.style||{}),a)),l}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,u.createElement)(J,_(S({},e),{prism:e.prism||A,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},1635:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>O,__assign:()=>a,__asyncDelegator:()=>E,__asyncGenerator:()=>_,__asyncValues:()=>C,__await:()=>S,__awaiter:()=>g,__classPrivateFieldGet:()=>N,__classPrivateFieldIn:()=>L,__classPrivateFieldSet:()=>R,__createBinding:()=>h,__decorate:()=>l,__disposeResources:()=>I,__esDecorate:()=>c,__exportStar:()=>b,__extends:()=>o,__generator:()=>m,__importDefault:()=>P,__importStar:()=>j,__makeTemplateObject:()=>A,__metadata:()=>f,__param:()=>s,__propKey:()=>d,__read:()=>v,__rest:()=>i,__runInitializers:()=>u,__setFunctionName:()=>p,__spread:()=>w,__spreadArray:()=>x,__spreadArrays:()=>k,__values:()=>y,default:()=>M});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function l(e,t,n,r){var o,a=arguments.length,i=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var l=e.length-1;l>=0;l--)(o=e[l])&&(i=(a<3?o(i):a>3?o(t,n,i):o(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i}function s(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,o,a){function i(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var l,s=r.kind,c="getter"===s?"get":"setter"===s?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),p=!1,f=n.length-1;f>=0;f--){var g={};for(var m in r)g[m]="access"===m?{}:r[m];for(var m in r.access)g.access[m]=r.access[m];g.addInitializer=function(e){if(p)throw new TypeError("Cannot add initializers after decoration has completed");a.push(i(e||null))};var h=(0,n[f])("accessor"===s?{get:d.get,set:d.set}:d[c],g);if("accessor"===s){if(void 0===h)continue;if(null===h||"object"!=typeof h)throw new TypeError("Object expected");(l=i(h.get))&&(d.get=l),(l=i(h.set))&&(d.set=l),(l=i(h.init))&&o.unshift(l)}else(l=i(h))&&("field"===s?o.unshift(l):d[c]=l)}u&&Object.defineProperty(u,r.name,d),p=!0}function u(e,t,n){for(var r=arguments.length>2,o=0;o<t.length;o++)n=r?t[o].call(e,n):t[o].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function p(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function f(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{s(r.next(e))}catch(t){a(t)}}function l(e){try{s(r.throw(e))}catch(t){a(t)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}s((r=r.apply(e,t||[])).next())}))}function m(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(l){return function(s){return function(l){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==l[0]&&2!==l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(s){l=[6,s],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([l,s])}}}var h=Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function b(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||h(t,e,n)}function y(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(l){o={error:l}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i}function w(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function k(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var a=arguments[t],i=0,l=a.length;i<l;i++,o++)r[o]=a[i];return r}function x(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function S(e){return this instanceof S?(this.v=e,this):new S(e)}function _(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),a=[];return r={},i("next"),i("throw"),i("return",(function(e){return function(t){return Promise.resolve(t).then(e,c)}})),r[Symbol.asyncIterator]=function(){return this},r;function i(e,t){o[e]&&(r[e]=function(t){return new Promise((function(n,r){a.push([e,t,n,r])>1||l(e,t)}))},t&&(r[e]=t(r[e])))}function l(e,t){try{(n=o[e](t)).value instanceof S?Promise.resolve(n.value.v).then(s,c):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function s(e){l("next",e)}function c(e){l("throw",e)}function u(e,t){e(t),a.shift(),a.length&&l(a[0][0],a[0][1])}}function E(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:S(e[r](t)),done:!1}:o?o(t):t}:o}}function C(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}}function A(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var T=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function j(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&h(t,e,n);return T(t,e),t}function P(e){return e&&e.__esModule?e:{default:e}}function N(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function R(e,t,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(e,n):o?o.value=n:t.set(e,n),n}function L(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function O(e,t,n){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var r,o;if(n){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose],n&&(o=r)}if("function"!=typeof r)throw new TypeError("Object not disposable.");o&&(r=function(){try{o.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var D="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=new Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function I(e){function t(t){e.error=e.hasError?new D(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}return function n(){for(;e.stack.length;){var r=e.stack.pop();try{var o=r.dispose&&r.dispose.call(r.value);if(r.async)return Promise.resolve(o).then(n,(function(e){return t(e),n()}))}catch(a){t(a)}}if(e.hasError)throw e.error}()}const M={__extends:o,__assign:a,__rest:i,__decorate:l,__param:s,__metadata:f,__awaiter:g,__generator:m,__createBinding:h,__exportStar:b,__values:y,__read:v,__spread:w,__spreadArrays:k,__spreadArray:x,__await:S,__asyncGenerator:_,__asyncDelegator:E,__asyncValues:C,__makeTemplateObject:A,__importStar:j,__importDefault:P,__classPrivateFieldGet:N,__classPrivateFieldSet:R,__classPrivateFieldIn:L,__addDisposableResource:O,__disposeResources:I}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/drand-docs/blog-81b":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"d954c059"},{"content":"7661071f"},{"content":"f4f34a3a"},{"content":"8717b14a"},{"content":"925b3f96"}],"__props":"2b46ab97"},"/drand-docs/blog/archive-29a":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"e9a994e3"},"/drand-docs/blog/authors-c57":{"__comp":"621db11d","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","__props":"2a9db486"},"/drand-docs/blog/authors/all-dave-grantham-articles-02f":{"__comp":"33fc5bb8","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"items":[{"content":"d954c059"}],"sidebar":"814f3328","__props":"c6806766"},"/drand-docs/blog/authors/all-sebastien-lorber-articles-864":{"__comp":"33fc5bb8","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"items":[{"content":"7661071f"},{"content":"f4f34a3a"},{"content":"925b3f96"}],"sidebar":"814f3328","__props":"3e814fbd"},"/drand-docs/blog/authors/kentbull-26f":{"__comp":"33fc5bb8","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"items":[{"content":"d954c059"}],"sidebar":"814f3328","__props":"aa23f094"},"/drand-docs/blog/authors/yangshun-7f8":{"__comp":"33fc5bb8","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"items":[{"content":"7661071f"},{"content":"8717b14a"},{"content":"925b3f96"}],"sidebar":"814f3328","__props":"aa909e52"},"/drand-docs/blog/drand-greetings-3bc":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"4e0eb3dc"},"/drand-docs/blog/first-blog-post-b37":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"e273c56f"},"/drand-docs/blog/long-blog-post-abc":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"73664a40"},"/drand-docs/blog/mdx-blog-post-eeb":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"59362658"},"/drand-docs/blog/tags-8e0":{"__comp":"01a85c17","__context":{"plugin":"36994c47"},"sidebar":"814f3328","__props":"93a0da4a"},"/drand-docs/blog/tags/docusaurus-630":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"7661071f"},{"content":"f4f34a3a"},{"content":"8717b14a"},{"content":"925b3f96"}],"__props":"c88e9617"},"/drand-docs/blog/tags/facebook-a48":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"7661071f"}],"__props":"ceb4708b"},"/drand-docs/blog/tags/hello-2e7":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"d954c059"},{"content":"7661071f"},{"content":"8717b14a"}],"__props":"f25a3067"},"/drand-docs/blog/tags/hola-6c2":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"925b3f96"}],"__props":"2080a1aa"},"/drand-docs/blog/welcome-0e9":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"d9f32620"},"/drand-docs/docs-adf":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/drand-docs/docs-912":{"__comp":"a7bd4aaa","__props":"ab32f63b"},"/drand-docs/docs-5c4":{"__comp":"a94703ab"},"/drand-docs/docs/about/1-0-about-819":{"__comp":"17896441","content":"cf1eeb86"},"/drand-docs/docs/about/1-1-governance-b7d":{"__comp":"17896441","content":"e50fef06"},"/drand-docs/docs/category/10-about-what-is-drand-a69":{"__comp":"14eb3368","__props":"ff1a36d1"},"/drand-docs/docs/category/20-concepts-getting-started-f86":{"__comp":"14eb3368","__props":"e4fffcf9"},"/drand-docs/docs/category/30-developers-guide-409":{"__comp":"14eb3368","__props":"8f578ac3"},"/drand-docs/docs/category/40-operators-guide-89a":{"__comp":"14eb3368","__props":"8806b065"},"/drand-docs/docs/category/50-drand-community-f63":{"__comp":"14eb3368","__props":"6c2aefca"},"/drand-docs/docs/category/60-drand-faq-c0a":{"__comp":"14eb3368","__props":"24f06274"},"/drand-docs/docs/concepts/2-0-concepts-8aa":{"__comp":"17896441","content":"f132e997"},"/drand-docs/docs/concepts/2-1-concepts-cryptography-360":{"__comp":"17896441","content":"52a7705f"},"/drand-docs/docs/concepts/2-2-concepts-security-model-1b3":{"__comp":"17896441","content":"0f048bff"},"/drand-docs/docs/concepts/2-3-concepts-specification-662":{"__comp":"17896441","content":"6825e205"},"/drand-docs/docs/concepts/2-4-concepts-timelock-encryption-519":{"__comp":"17896441","content":"56aab574"},"/drand-docs/docs/dev-guide/3-0-dev-guide-41d":{"__comp":"17896441","content":"91f57a82"},"/drand-docs/docs/dev-guide/3-1-dev-guide-organization-6ff":{"__comp":"17896441","content":"e6415a3f"},"/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cli-da0":{"__comp":"17896441","content":"78fc3e97"},"/drand-docs/docs/dev-guide/3-3-dev-guide-client-libraries-89e":{"__comp":"17896441","content":"4c7240d8"},"/drand-docs/docs/dev-guide/3-4-dev-guide-http-api-f5e":{"__comp":"17896441","content":"6eaa7728"},"/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-network-693":{"__comp":"17896441","content":"72684690"},"/drand-docs/docs/dev-guide/3-6-dev-guide-code-examples-5c6":{"__comp":"17896441","content":"9c3d38a1"},"/drand-docs/docs/drand-community/5-0-drand-community-279":{"__comp":"17896441","content":"b0017b1d"},"/drand-docs/docs/drand-community/5-1-drand-community-contributing-42a":{"__comp":"17896441","content":"bba71062"},"/drand-docs/docs/drand-faq/6-0-drand-faq-ceb":{"__comp":"17896441","content":"2acb4dcc"},"/drand-docs/docs/home-652":{"__comp":"17896441","content":"0a40e68b"},"/drand-docs/docs/ops-guide/4-0-ops-guide-7f8":{"__comp":"17896441","content":"d1958d43"},"/drand-docs/docs/ops-guide/4-1-ops-guide-deployment-8c4":{"__comp":"17896441","content":"1ab32222"},"/drand-docs/docs/ops-guide/4-2-ops-guide-docker-install-e5c":{"__comp":"17896441","content":"5589aa37"},"/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backends-584":{"__comp":"17896441","content":"da23e8d3"},"/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guide-c97":{"__comp":"17896441","content":"7c330c58"},"/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-tools-2e5":{"__comp":"17896441","content":"6412f335"},"/drand-docs/-56f":{"__comp":"1df93b7f","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=7815,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/site/assets/js/main.a4869a1a.js.LICENSE.txt b/site/assets/js/main.a4869a1a.js.LICENSE.txt new file mode 100644 index 00000000..91dc8949 --- /dev/null +++ b/site/assets/js/main.a4869a1a.js.LICENSE.txt @@ -0,0 +1,64 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + *) +*/ + +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/site/assets/js/runtime~main.afb8bc39.js b/site/assets/js/runtime~main.afb8bc39.js new file mode 100644 index 00000000..f1ccc9ba --- /dev/null +++ b/site/assets/js/runtime~main.afb8bc39.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,f,c,d,r={},t={};function b(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return r[e].call(f.exports,f,f.exports,b),f.loaded=!0,f.exports}b.m=r,b.c=t,e=[],b.O=(a,f,c,d)=>{if(!f){var r=1/0;for(i=0;i<e.length;i++){f=e[i][0],c=e[i][1],d=e[i][2];for(var t=!0,o=0;o<f.length;o++)(!1&d||r>=d)&&Object.keys(b.O).every((e=>b.O[e](f[o])))?f.splice(o--,1):(t=!1,d<r&&(r=d));if(t){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[f,c,d]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var r={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach((a=>r[a]=()=>e[a]));return r.default=()=>e,b.d(d,r),d},b.d=(e,a)=>{for(var f in a)b.o(a,f)&&!b.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,f)=>(b.f[f](e,a),a)),[])),b.u=e=>"assets/js/"+({453:"f132e997",580:"2b46ab97",867:"33fc5bb8",1235:"a7456010",1245:"4e0eb3dc",1447:"da23e8d3",1502:"3e814fbd",1548:"e50fef06",1788:"e9a994e3",1800:"8806b065",1903:"acecf23e",1972:"73664a40",2066:"e6415a3f",2148:"b0017b1d",2239:"ff1a36d1",2268:"5589aa37",2339:"7c330c58",2542:"e4fffcf9",2691:"2a9db486",2711:"9e4087bc",2964:"93a0da4a",3179:"78fc3e97",3249:"ccc49370",3390:"6eaa7728",3472:"bba71062",3537:"c6806766",3573:"aa909e52",3637:"f4f34a3a",3655:"4c7240d8",3694:"8717b14a",3833:"2080a1aa",3941:"cf1eeb86",4093:"aa23f094",4115:"d1958d43",4205:"6412f335",4212:"621db11d",4230:"ceb4708b",4318:"24f06274",4342:"56aab574",4532:"1ab32222",4583:"1df93b7f",4813:"6875c492",4960:"6c2aefca",5081:"9c3d38a1",5218:"52a7705f",5557:"d9f32620",5706:"6825e205",5719:"72684690",5742:"aba21aa0",5858:"d954c059",6121:"f25a3067",6574:"8f578ac3",6969:"14eb3368",7098:"a7bd4aaa",7472:"814f3328",7643:"a6aa9e1f",8082:"ab32f63b",8209:"01a85c17",8401:"17896441",8551:"0f048bff",8609:"925b3f96",8737:"7661071f",9025:"2acb4dcc",9048:"a94703ab",9170:"c88e9617",9325:"59362658",9328:"e273c56f",9517:"0a40e68b",9647:"5e95c892",9676:"91f57a82",9858:"36994c47"}[e]||e)+"."+{453:"dafb65b3",580:"81ab04ae",867:"b8d29537",1235:"cf5a56fa",1245:"b3f03104",1447:"05f6318d",1502:"757e41f8",1548:"efa026e2",1788:"81a04118",1800:"250ece8d",1903:"089691d6",1972:"dd711b8c",2066:"992d6845",2148:"b2686800",2237:"982ee814",2239:"29f290f7",2268:"9e1166dd",2339:"6719f53a",2542:"db2fbd7c",2691:"1f5e4555",2711:"e31a38f4",2964:"3efb7f73",3179:"fbff7af8",3249:"1d26175e",3347:"8e958281",3390:"6a525c68",3472:"342fddb8",3537:"95b6059d",3573:"3a7aa99f",3637:"7300eb64",3655:"b5d9d4d0",3694:"e86499f8",3833:"9945b360",3941:"2375ecc8",4093:"0b225b8c",4115:"5026828c",4205:"a106b4db",4212:"f90eb02b",4230:"abf75248",4318:"cc8c4631",4342:"730cb5ff",4532:"41cc101f",4583:"4bbe161e",4813:"386ee3df",4960:"957edc04",5081:"9dbcf339",5218:"150d1613",5557:"d09d65df",5706:"e96e4ab0",5719:"1ef3b384",5742:"3532aa88",5858:"7a3d7eb4",6121:"d1d556b0",6574:"0fd7b2ea",6905:"9c40e72e",6969:"1844d12e",7098:"12039cfb",7472:"3e3fb0dc",7643:"9e397cf8",8082:"98faafc7",8209:"b1c4f5a5",8401:"217d4c3c",8551:"1592e817",8609:"c4b155f0",8737:"8296746d",9025:"e1a2a4c1",9048:"7c376541",9170:"089a163c",9325:"4f0764d1",9328:"84e147cb",9517:"3ed906ab",9647:"0d8a2771",9676:"b0048d22",9858:"47378eed"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},d="drand-docs:",b.l=(e,a,f,r)=>{if(c[e])c[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==d+f){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,b.nc&&t.setAttribute("nonce",b.nc),t.setAttribute("data-webpack",d+f),t.src=e),c[e]=[a];var l=(a,f)=>{t.onerror=t.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(f))),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/drand-docs/",b.gca=function(e){return e={17896441:"8401",59362658:"9325",72684690:"5719",f132e997:"453","2b46ab97":"580","33fc5bb8":"867",a7456010:"1235","4e0eb3dc":"1245",da23e8d3:"1447","3e814fbd":"1502",e50fef06:"1548",e9a994e3:"1788","8806b065":"1800",acecf23e:"1903","73664a40":"1972",e6415a3f:"2066",b0017b1d:"2148",ff1a36d1:"2239","5589aa37":"2268","7c330c58":"2339",e4fffcf9:"2542","2a9db486":"2691","9e4087bc":"2711","93a0da4a":"2964","78fc3e97":"3179",ccc49370:"3249","6eaa7728":"3390",bba71062:"3472",c6806766:"3537",aa909e52:"3573",f4f34a3a:"3637","4c7240d8":"3655","8717b14a":"3694","2080a1aa":"3833",cf1eeb86:"3941",aa23f094:"4093",d1958d43:"4115","6412f335":"4205","621db11d":"4212",ceb4708b:"4230","24f06274":"4318","56aab574":"4342","1ab32222":"4532","1df93b7f":"4583","6875c492":"4813","6c2aefca":"4960","9c3d38a1":"5081","52a7705f":"5218",d9f32620:"5557","6825e205":"5706",aba21aa0:"5742",d954c059:"5858",f25a3067:"6121","8f578ac3":"6574","14eb3368":"6969",a7bd4aaa:"7098","814f3328":"7472",a6aa9e1f:"7643",ab32f63b:"8082","01a85c17":"8209","0f048bff":"8551","925b3f96":"8609","7661071f":"8737","2acb4dcc":"9025",a94703ab:"9048",c88e9617:"9170",e273c56f:"9328","0a40e68b":"9517","5e95c892":"9647","91f57a82":"9676","36994c47":"9858"}[e]||e,b.p+b.u(e)},(()=>{var e={5354:0,1869:0};b.f.j=(a,f)=>{var c=b.o(e,a)?e[a]:void 0;if(0!==c)if(c)f.push(c[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((f,d)=>c=e[a]=[f,d]));f.push(c[2]=d);var r=b.p+b.u(a),t=new Error;b.l(r,(f=>{if(b.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var d=f&&("load"===f.type?"missing":f.type),r=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+r+")",t.name="ChunkLoadError",t.type=d,t.request=r,c[1](t)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,f)=>{var c,d,r=f[0],t=f[1],o=f[2],n=0;if(r.some((a=>0!==e[a]))){for(c in t)b.o(t,c)&&(b.m[c]=t[c]);if(o)var i=o(b)}for(a&&a(f);n<r.length;n++)d=r[n],b.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return b.O(i)},f=self.webpackChunkdrand_docs=self.webpackChunkdrand_docs||[];f.forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f))})()})(); \ No newline at end of file diff --git a/site/blog/archive/index.html b/site/blog/archive/index.html new file mode 100644 index 00000000..eb7ba481 --- /dev/null +++ b/site/blog/archive/index.html @@ -0,0 +1,14 @@ +<!doctype html> +<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v3.5.2"> +<title data-rh="true">Archive | drand + + + + + + + + \ No newline at end of file diff --git a/site/blog/atom.css b/site/blog/atom.css new file mode 100644 index 00000000..d2fc20b2 --- /dev/null +++ b/site/blog/atom.css @@ -0,0 +1,75 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +main { + flex: 1 0 auto; + width: 100%; + margin: 2rem auto; + max-width: 800px; + /* stylelint-disable-next-line font-family-name-quotes */ + font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell; +} + +.info { + display: block; + margin: 2rem 0; + padding: 1.6rem 2.4rem; + border: 1px solid dodgerblue; + border-left-width: 0.5rem; + border-radius: 0.4rem; + background-color: #edf5ff; +} + +a { + color: #005aff; + text-decoration: none; +} + +h1 { + text-wrap: balance; + font-size: 3.4rem; + font-weight: 800; + margin-bottom: 2rem; + display: flex; + align-items: center; +} + +h1 .rss-icon { + height: 3.2rem; + width: 3.2rem; + margin-right: 1rem; +} + +h2 { + font-size: 2.2rem; + font-weight: 700; + margin-bottom: 0.2rem; +} + +h3 { + font-size: 1.8rem; + font-weight: 700; + margin-bottom: 0.1rem; +} + +.blog-description { + font-size: 1.4rem; + margin-bottom: 0.6rem; +} + +.blog-post-date { + font-size: 1rem; + line-height: 1.4rem; + font-style: italic; + color: #797b7e; +} + +.blog-post-description { + font-size: 1rem; + line-height: 1.4rem; + color: #434349; +} diff --git a/site/blog/atom.xml b/site/blog/atom.xml new file mode 100644 index 00000000..462adab9 --- /dev/null +++ b/site/blog/atom.xml @@ -0,0 +1,133 @@ + + + https://kentbull.github.io/drand-docs/blog + drand Blog + 2024-08-19T00:00:00.000Z + https://github.com/jpmonette/feed + + drand Blog + https://kentbull.github.io/drand-docs/img/favicon.ico + + <![CDATA[Greetings!]]> + https://kentbull.github.io/drand-docs/blog/drand-greetings + + 2024-08-19T00:00:00.000Z + + Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+

We are building a replacement for the drand community docs.

+

Once we are done then all of the docs will be done with docusaurus.

+

How is line six?

+
Or eight?

Or eight lines?

+
Or ten?

Or even ten? Oh no!

+

How about twenty?

]]>
+ + Kent Bull + https://kentbull.com + + + Dave Grantham + https://cryptid.tech + + +
+ + <![CDATA[Welcome]]> + https://kentbull.github.io/drand-docs/blog/welcome + + 2021-08-26T00:00:00.000Z + + Docusaurus blogging features are powered by the blog plugin.

+

Here are a few tips you might find useful.

+

Simply add Markdown files (or folders) to the blog directory.

+

Regular blog authors can be added to authors.yml.

+

The blog post date can be extracted from filenames, such as:

+
    +
  • 2019-05-30-welcome.md
  • +
  • 2019-05-30-welcome/index.md
  • +
+

A blog post folder can be convenient to co-locate blog post images:

+

Docusaurus Plushie

+

The blog supports tags as well!

+

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

]]>
+ + Sébastien Lorber + https://sebastienlorber.com + + + Yangshun Tay + https://github.com/yangshun + + + + +
+ + <![CDATA[MDX Blog Post]]> + https://kentbull.github.io/drand-docs/blog/mdx-blog-post + + 2021-08-01T00:00:00.000Z + + Blog posts support Docusaurus Markdown features, such as MDX.

+
tip

Use the power of React to create interactive blog posts.

+ +

For example, use JSX to create an interactive button:

+
<button onClick={() => alert('button clicked!')}>Click me!</button>
+]]>
+ + Sébastien Lorber + https://sebastienlorber.com + + +
+ + <![CDATA[Long Blog Post]]> + https://kentbull.github.io/drand-docs/blog/long-blog-post + + 2019-05-29T00:00:00.000Z + + This is the summary of a very long blog post,

+

Use a <!-- truncate --> comment to limit blog post size in the list view.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ + Yangshun Tay + https://github.com/yangshun + + + +
+ + <![CDATA[First Blog Post]]> + https://kentbull.github.io/drand-docs/blog/first-blog-post + + 2019-05-28T00:00:00.000Z + + Lorem ipsum dolor sit amet...

+

...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ + Sébastien Lorber + https://sebastienlorber.com + + + Yangshun Tay + https://github.com/yangshun + + + +
+
\ No newline at end of file diff --git a/site/blog/atom.xsl b/site/blog/atom.xsl new file mode 100644 index 00000000..271895cf --- /dev/null +++ b/site/blog/atom.xsl @@ -0,0 +1,92 @@ + + + + + + + + Atom Feed | <xsl:value-of + select="atom:feed/atom:title" + /> + + + +
+
+
+ This is an Atom feed. Subscribe by copying the URL + from the address bar into your newsreader. Visit + About Feeds to learn more + and get started. It’s free. +
+

+
+ + + + + + + + + + +
+ +

+

+ +

+
+

Recent Posts

+
+ +
+

+ +
+ +
+
+
+
+
+ + +
+
diff --git a/site/blog/authors/all-dave-grantham-articles/index.html b/site/blog/authors/all-dave-grantham-articles/index.html new file mode 100644 index 00000000..e3c1a590 --- /dev/null +++ b/site/blog/authors/all-dave-grantham-articles/index.html @@ -0,0 +1,15 @@ + + + + + +Dave Grantham - One post | drand + + + + + +
Dave Grantham
drand Community Scout Master
View all authors

Greetings!

· One min read
Kent Bull
drand Community Manager
Dave Grantham
drand Community Scout Master

Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+ + \ No newline at end of file diff --git a/site/blog/authors/all-sebastien-lorber-articles/index.html b/site/blog/authors/all-sebastien-lorber-articles/index.html new file mode 100644 index 00000000..ac6d4c33 --- /dev/null +++ b/site/blog/authors/all-sebastien-lorber-articles/index.html @@ -0,0 +1,16 @@ + + + + + +Sébastien Lorber - 3 posts | drand + + + + + +
Sébastien Lorber
Docusaurus maintainer
View all authors

+ + \ No newline at end of file diff --git a/site/blog/authors/index.html b/site/blog/authors/index.html new file mode 100644 index 00000000..63433be8 --- /dev/null +++ b/site/blog/authors/index.html @@ -0,0 +1,14 @@ + + + + + +Authors | drand + + + + + +

Authors

+ + \ No newline at end of file diff --git a/site/blog/authors/kentbull/index.html b/site/blog/authors/kentbull/index.html new file mode 100644 index 00000000..6b90fe7d --- /dev/null +++ b/site/blog/authors/kentbull/index.html @@ -0,0 +1,15 @@ + + + + + +Kent Bull - One post | drand + + + + + +
Kent Bull
drand Community Manager
View all authors

Greetings!

· One min read
Kent Bull
drand Community Manager
Dave Grantham
drand Community Scout Master

Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+ + \ No newline at end of file diff --git a/site/blog/authors/yangshun/index.html b/site/blog/authors/yangshun/index.html new file mode 100644 index 00000000..3b1c39b6 --- /dev/null +++ b/site/blog/authors/yangshun/index.html @@ -0,0 +1,16 @@ + + + + + +Yangshun Tay - 3 posts | drand + + + + + +
Yangshun Tay
Front End Engineer @ Facebook
View all authors

+ + \ No newline at end of file diff --git a/site/blog/drand-greetings/index.html b/site/blog/drand-greetings/index.html new file mode 100644 index 00000000..c2795e57 --- /dev/null +++ b/site/blog/drand-greetings/index.html @@ -0,0 +1,21 @@ + + + + + +Greetings! | drand + + + + + +

Greetings!

· One min read
Kent Bull
drand Community Manager
Dave Grantham
drand Community Scout Master

Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+

We are building a replacement for the drand community docs.

+

Once we are done then all of the docs will be done with docusaurus.

+

How is line six?

+
Or eight?

Or eight lines?

+
Or ten?

Or even ten? Oh no!

+

How about twenty?

+ + \ No newline at end of file diff --git a/site/blog/first-blog-post/index.html b/site/blog/first-blog-post/index.html new file mode 100644 index 00000000..fb0e61eb --- /dev/null +++ b/site/blog/first-blog-post/index.html @@ -0,0 +1,15 @@ + + + + + +First Blog Post | drand + + + + + +

First Blog Post

· One min read
Sébastien Lorber
Docusaurus maintainer
Yangshun Tay
Front End Engineer @ Facebook

Lorem ipsum dolor sit amet...

+

...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + \ No newline at end of file diff --git a/site/blog/index.html b/site/blog/index.html new file mode 100644 index 00000000..8170b943 --- /dev/null +++ b/site/blog/index.html @@ -0,0 +1,18 @@ + + + + + +Blog | drand + + + + + +

Greetings!

· One min read
Kent Bull
drand Community Manager
Dave Grantham
drand Community Scout Master

Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+ + \ No newline at end of file diff --git a/site/blog/long-blog-post/index.html b/site/blog/long-blog-post/index.html new file mode 100644 index 00000000..8b92e6f6 --- /dev/null +++ b/site/blog/long-blog-post/index.html @@ -0,0 +1,31 @@ + + + + + +Long Blog Post | drand + + + + + +

Long Blog Post

· 3 min read
Yangshun Tay
Front End Engineer @ Facebook

This is the summary of a very long blog post,

+

Use a <!-- truncate --> comment to limit blog post size in the list view.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+ + \ No newline at end of file diff --git a/site/blog/mdx-blog-post/index.html b/site/blog/mdx-blog-post/index.html new file mode 100644 index 00000000..fa5eb439 --- /dev/null +++ b/site/blog/mdx-blog-post/index.html @@ -0,0 +1,19 @@ + + + + + +MDX Blog Post | drand + + + + + +

MDX Blog Post

· One min read
Sébastien Lorber
Docusaurus maintainer

Blog posts support Docusaurus Markdown features, such as MDX.

+
tip

Use the power of React to create interactive blog posts.

+ +

For example, use JSX to create an interactive button:

+
<button onClick={() => alert('button clicked!')}>Click me!</button>
+
+ + \ No newline at end of file diff --git a/site/blog/rss.css b/site/blog/rss.css new file mode 100644 index 00000000..d2fc20b2 --- /dev/null +++ b/site/blog/rss.css @@ -0,0 +1,75 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +main { + flex: 1 0 auto; + width: 100%; + margin: 2rem auto; + max-width: 800px; + /* stylelint-disable-next-line font-family-name-quotes */ + font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell; +} + +.info { + display: block; + margin: 2rem 0; + padding: 1.6rem 2.4rem; + border: 1px solid dodgerblue; + border-left-width: 0.5rem; + border-radius: 0.4rem; + background-color: #edf5ff; +} + +a { + color: #005aff; + text-decoration: none; +} + +h1 { + text-wrap: balance; + font-size: 3.4rem; + font-weight: 800; + margin-bottom: 2rem; + display: flex; + align-items: center; +} + +h1 .rss-icon { + height: 3.2rem; + width: 3.2rem; + margin-right: 1rem; +} + +h2 { + font-size: 2.2rem; + font-weight: 700; + margin-bottom: 0.2rem; +} + +h3 { + font-size: 1.8rem; + font-weight: 700; + margin-bottom: 0.1rem; +} + +.blog-description { + font-size: 1.4rem; + margin-bottom: 0.6rem; +} + +.blog-post-date { + font-size: 1rem; + line-height: 1.4rem; + font-style: italic; + color: #797b7e; +} + +.blog-post-description { + font-size: 1rem; + line-height: 1.4rem; + color: #434349; +} diff --git a/site/blog/rss.xml b/site/blog/rss.xml new file mode 100644 index 00000000..7a46163f --- /dev/null +++ b/site/blog/rss.xml @@ -0,0 +1,103 @@ + + + + drand Blog + https://kentbull.github.io/drand-docs/blog + drand Blog + Mon, 19 Aug 2024 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[Greetings!]]> + https://kentbull.github.io/drand-docs/blog/drand-greetings + https://kentbull.github.io/drand-docs/blog/drand-greetings + Mon, 19 Aug 2024 00:00:00 GMT + + Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+

We are building a replacement for the drand community docs.

+

Once we are done then all of the docs will be done with docusaurus.

+

How is line six?

+
Or eight?

Or eight lines?

+
Or ten?

Or even ten? Oh no!

+

How about twenty?

]]>
+ Hello +
+ + <![CDATA[Welcome]]> + https://kentbull.github.io/drand-docs/blog/welcome + https://kentbull.github.io/drand-docs/blog/welcome + Thu, 26 Aug 2021 00:00:00 GMT + + Docusaurus blogging features are powered by the blog plugin.

+

Here are a few tips you might find useful.

+

Simply add Markdown files (or folders) to the blog directory.

+

Regular blog authors can be added to authors.yml.

+

The blog post date can be extracted from filenames, such as:

+
    +
  • 2019-05-30-welcome.md
  • +
  • 2019-05-30-welcome/index.md
  • +
+

A blog post folder can be convenient to co-locate blog post images:

+

Docusaurus Plushie

+

The blog supports tags as well!

+

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

]]>
+ Facebook + Hello + Docusaurus +
+ + <![CDATA[MDX Blog Post]]> + https://kentbull.github.io/drand-docs/blog/mdx-blog-post + https://kentbull.github.io/drand-docs/blog/mdx-blog-post + Sun, 01 Aug 2021 00:00:00 GMT + + Blog posts support Docusaurus Markdown features, such as MDX.

+
tip

Use the power of React to create interactive blog posts.

+ +

For example, use JSX to create an interactive button:

+
<button onClick={() => alert('button clicked!')}>Click me!</button>
+]]>
+ Docusaurus +
+ + <![CDATA[Long Blog Post]]> + https://kentbull.github.io/drand-docs/blog/long-blog-post + https://kentbull.github.io/drand-docs/blog/long-blog-post + Wed, 29 May 2019 00:00:00 GMT + + This is the summary of a very long blog post,

+

Use a <!-- truncate --> comment to limit blog post size in the list view.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ Hello + Docusaurus +
+ + <![CDATA[First Blog Post]]> + https://kentbull.github.io/drand-docs/blog/first-blog-post + https://kentbull.github.io/drand-docs/blog/first-blog-post + Tue, 28 May 2019 00:00:00 GMT + + Lorem ipsum dolor sit amet...

+

...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

]]>
+ Hola + Docusaurus +
+
+
\ No newline at end of file diff --git a/site/blog/rss.xsl b/site/blog/rss.xsl new file mode 100644 index 00000000..e9695b29 --- /dev/null +++ b/site/blog/rss.xsl @@ -0,0 +1,86 @@ + + + + + + + + RSS Feed | <xsl:value-of select="rss/channel/title" /> + + + +
+
+
+ This is an RSS feed. Subscribe by copying the URL + from the address bar into your newsreader. Visit + About Feeds to learn more + and get started. It’s free. +
+

+
+ + + + + + + + + + +
+ +

+

+ +

+
+

Recent Posts

+
+ +
+

+ +
+ +
+
+
+
+
+ + +
+
diff --git a/site/blog/tags/docusaurus/index.html b/site/blog/tags/docusaurus/index.html new file mode 100644 index 00000000..bee6e9ed --- /dev/null +++ b/site/blog/tags/docusaurus/index.html @@ -0,0 +1,17 @@ + + + + + +4 posts tagged with "Docusaurus" | drand + + + + + +

4 posts tagged with "Docusaurus"

Docusaurus tag description

View All Tags
+ + \ No newline at end of file diff --git a/site/blog/tags/facebook/index.html b/site/blog/tags/facebook/index.html new file mode 100644 index 00000000..1923012b --- /dev/null +++ b/site/blog/tags/facebook/index.html @@ -0,0 +1,15 @@ + + + + + +One post tagged with "Facebook" | drand + + + + + +

One post tagged with "Facebook"

Facebook tag description

View All Tags
+ + \ No newline at end of file diff --git a/site/blog/tags/hello/index.html b/site/blog/tags/hello/index.html new file mode 100644 index 00000000..ca847569 --- /dev/null +++ b/site/blog/tags/hello/index.html @@ -0,0 +1,17 @@ + + + + + +3 posts tagged with "Hello" | drand + + + + + +

3 posts tagged with "Hello"

Hello tag description

View All Tags

Greetings!

· One min read
Kent Bull
drand Community Manager
Dave Grantham
drand Community Scout Master

Congratulations, you have made your first post!

+

Feel free to play around and edit this post as much as you like.

+ + \ No newline at end of file diff --git a/site/blog/tags/hola/index.html b/site/blog/tags/hola/index.html new file mode 100644 index 00000000..9bea662c --- /dev/null +++ b/site/blog/tags/hola/index.html @@ -0,0 +1,14 @@ + + + + + +One post tagged with "Hola" | drand + + + + + +

One post tagged with "Hola"

Hola tag description

View All Tags
+ + \ No newline at end of file diff --git a/site/blog/tags/index.html b/site/blog/tags/index.html new file mode 100644 index 00000000..5b739fe0 --- /dev/null +++ b/site/blog/tags/index.html @@ -0,0 +1,14 @@ + + + + + +Tags | drand + + + + + +
+ + \ No newline at end of file diff --git a/site/blog/welcome/index.html b/site/blog/welcome/index.html new file mode 100644 index 00000000..c1bd9d0a --- /dev/null +++ b/site/blog/welcome/index.html @@ -0,0 +1,26 @@ + + + + + +Welcome | drand + + + + + +

Welcome

· One min read
Sébastien Lorber
Docusaurus maintainer
Yangshun Tay
Front End Engineer @ Facebook

Docusaurus blogging features are powered by the blog plugin.

+

Here are a few tips you might find useful.

+

Simply add Markdown files (or folders) to the blog directory.

+

Regular blog authors can be added to authors.yml.

+

The blog post date can be extracted from filenames, such as:

+
    +
  • 2019-05-30-welcome.md
  • +
  • 2019-05-30-welcome/index.md
  • +
+

A blog post folder can be convenient to co-locate blog post images:

+

Docusaurus Plushie

+

The blog supports tags as well!

+

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

+ + \ No newline at end of file diff --git a/site/docs/about/1-0-about/index.html b/site/docs/about/1-0-about/index.html new file mode 100644 index 00000000..7eb3c96d --- /dev/null +++ b/site/docs/about/1-0-about/index.html @@ -0,0 +1,60 @@ + + + + + +1.0 About | drand + + + + + +

1.0 ABOUT (What is “drand”?)

+

drand (lower case, pronounced "DEE-rand") is a distributed randomness beacon daemon written in the Go programming language. It generates collective, publicly verifiable, unbiased, and unpredictable random values at fixed intervals using advanced cryptographic techniques.

+

drand serves as a critical Internet-wide infrastructure, providing randomness to applications much like the Network Time Protocol (NTP) provides timing information. It ensures randomness is verifiable and decentralized, making it ideal for a wide range of applications, from blockchain systems to anonymity networks.

+

Randomness plays a crucial role in various aspects of modern life, from voting systems and traffic management to financial services. However, its most critical application is in cryptography.

+

For example, WPA2, the widely used security protocol for Wi-Fi networks, relies on randomness. When a laptop connects to a Wi-Fi network, both the laptop and the Wi-Fi access point generate large random numbers to perform a secure handshake. This ensures that communications cannot be eavesdropped. If these random numbers were predictable, an attacker could intercept the connection.

+

Current Randomness Generators

+

Several systems have tried to provide strong randomness, but each has its limitations. As an example:

+
    +
  • NIST Randomness Beacon: The NIST Randomness Beacon provides cryptographic randomness in real-time. However, it is centralized and not verifiable by the public, which poses trust and reliability concerns.
  • +
+

Features of Good Randomness

+

To prevent manipulation, a strong random-number generator should be:

+
    +
  • Unpredictable: Impossible to predict the next number.
  • +
  • Publicly Verifiable: Anyone can verify the randomness.
  • +
  • Bias-Resistant: Cannot be influenced to produce specific outcomes.
  • +
  • Decentralized: Produced by a set of independent, unrelated parties.
  • +
  • Always Available: Reliably capable of providing random numbers.
  • +
+

drand aims to fulfill all these criteria.

+

How drand Works

+

drand generates randomness without allowing any party to predict or bias the output. Here's a simplified overview:

+
    +
  1. Network Setup: A drand network consists of nodes running the drand protocol. These nodes agree on a threshold parameter and generate partial signatures.
  2. +
  3. Randomness Generation: Nodes broadcast parts of their signatures, which are collected until they match the threshold. The final signature, a Boneh–Lynn–Shacham (BLS) signature, is verified by the network and hashed to produce the random value.
  4. +
+

For more details, refer to the project specifications.

+

Public Randomness

+

drand's primary function is generating public randomness. The process involves:

+
    +
  • Setup Phase: Nodes generate a long-term public/private key pair and perform a distributed key generation (DKG) protocol to create a collective public key and individual private key shares.
  • +
  • Generation Phase: Nodes initiate randomness generation rounds, sign messages using their private key shares, and reconstruct the full BLS signature. This signature is hashed to ensure no bias, producing the final random value.
  • +
+

This randomness is useful for applications like lotteries, sharding, and consensus protocols.

+

Importance of Decentralized Randomness

+

Decentralized randomness is crucial for many systems that rely on fair and unpredictable outcomes. For example, Proof-of-Stake (PoS) blockchains use randomness to elect miners, ensuring security and fairness. Unlike centralized solutions, drand offers a verifiable and unbiased source of randomness, enhancing reliability and security.

+

Origins of drand

+

drand was developed in 2017 in the DEDIS Lab at EPFL, spearheaded by Nicolas Gailly. The project built upon earlier work in decentralized randomness by researchers at Yale University and EPFL.

+

The DEDIS team collaborated with DFINITY to optimize the cryptographic techniques used in drand, resulting in a more efficient and reliable randomness generation protocol.

+

drand Network and Adoption

+

drand gained support from prominent organizations such as Cloudflare, Kudelski Security, Protocol Labs, Universidad de Chile, and many others. These collaborations have helped establish a robust drand network, hosted by a voluntary consortium known as the League of Entropy, which launched its production-ready mainnet in 2019.

+

Today, drand is used in various applications, including leader election in consensus mechanisms, providing randomness for smart contracts, and more.

+

Acknowledgments

+

Special thanks to contributors and collaborators who have supported drand’s development, including @paulmillr and @herumi for cryptographic library support, and teams from the DEDIS lab and from Protocol Labs.

+

💌 Get in touch!

+

If you have any questions or comments, you can reach the drand team at leagueofentropy@googlegroups.com or join the drand Slack workspace.

+
+ + \ No newline at end of file diff --git a/site/docs/about/1-1-governance/index.html b/site/docs/about/1-1-governance/index.html new file mode 100644 index 00000000..8a2ddab1 --- /dev/null +++ b/site/docs/about/1-1-governance/index.html @@ -0,0 +1,55 @@ + + + + + +1.1 Governance | drand + + + + + +

1.1 About: Governance

+

Our mission thrives in an environment that is friendly, safe, accepting, and free from intimidation or harassment. Certain behaviors will not be tolerated to ensure this atmosphere.

+

Key Points

+
    +
  • Be respectful.
  • +
  • Need help? Contact: abuse@ipfs.io.
  • +
  • Abusive behavior is never tolerated.
  • +
  • Violations may result in immediate and permanent expulsion.
  • +
  • Ignorance of this document is not an excuse.
  • +
+

Scope

+

This Code of Conduct applies to all community members at all times, in all community venues, online and in person, and in one-on-one communications related to the project. It covers the use of our public infrastructure, including the drand network, events, and services.

+

Creating a Harassment-Free Space

+

We are committed to a friendly, safe, and welcoming environment for everyone, regardless of gender identity, sexual orientation, disability, ethnicity, religion, age, physical appearance, or any other personal characteristic.

+

Respect differing opinions and understand that disagreement is not an excuse for rudeness. Disruptive behaviors like spamming, trolling, or flaming are not tolerated.

+

Harassment includes:

+
    +
  • Threatening or demeaning behavior
  • +
  • Harmful comments related to personal characteristics
  • +
  • Inappropriate use of nudity, sexual images, or explicit language in public spaces
  • +
  • Threats of harm
  • +
  • Intimidation, stalking, or following
  • +
  • Harassing photography or recording
  • +
  • Disrupting talks or events
  • +
  • Inappropriate physical contact
  • +
  • Unwelcome sexual attention
  • +
+

Reporting Violations

+

If you believe someone is harassing you or violating this Code of Conduct, contact us with an abuse report. Provide as much detail as possible to help us address the issue effectively.

+

Consequences

+

Unacceptable behavior will not be tolerated. Anyone asked to stop such behavior must comply immediately. The team may take any action deemed appropriate, including temporary bans or permanent expulsion without warning.

+

Addressing Grievances

+

If you feel falsely or unfairly accused of violating this Code of Conduct, notify the team. We will handle your grievance appropriately to foster a safe and friendly community.

+

Contact Information

+

As our community remains small, the IPFS abuse team acts as a neutral arbiter for Code of Conduct and abuse issues within drand.

+

Contact us if you are unsure about content appropriateness. We are happy to provide guidance.

+

Updates

+

This document may be updated periodically. Refer to the git history for changes.

+

Credit and License

+

This Code of Conduct is based on the IPFS Code of Conduct, the npm Code of Conduct, CodeOfConduct4Lib, and the Geek Feminism wiki.

+

This document may be reused under a Creative Commons Attribution-ShareAlike License.

+
+ + \ No newline at end of file diff --git a/site/docs/category/10-about-what-is-drand/index.html b/site/docs/category/10-about-what-is-drand/index.html new file mode 100644 index 00000000..ef749520 --- /dev/null +++ b/site/docs/category/10-about-what-is-drand/index.html @@ -0,0 +1,14 @@ + + + + + +1.0 About (What is "drand"?) | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/category/20-concepts-getting-started/index.html b/site/docs/category/20-concepts-getting-started/index.html new file mode 100644 index 00000000..8f090c16 --- /dev/null +++ b/site/docs/category/20-concepts-getting-started/index.html @@ -0,0 +1,14 @@ + + + + + +2.0 CONCEPTS (Getting Started) | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/category/30-developers-guide/index.html b/site/docs/category/30-developers-guide/index.html new file mode 100644 index 00000000..09576cb4 --- /dev/null +++ b/site/docs/category/30-developers-guide/index.html @@ -0,0 +1,14 @@ + + + + + +3.0 DEVELOPERS GUIDE | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/category/40-operators-guide/index.html b/site/docs/category/40-operators-guide/index.html new file mode 100644 index 00000000..e3cf3438 --- /dev/null +++ b/site/docs/category/40-operators-guide/index.html @@ -0,0 +1,14 @@ + + + + + +4.0 OPERATORS GUIDE | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/category/50-drand-community/index.html b/site/docs/category/50-drand-community/index.html new file mode 100644 index 00000000..b26bf621 --- /dev/null +++ b/site/docs/category/50-drand-community/index.html @@ -0,0 +1,14 @@ + + + + + +5.0 DRAND COMMUNITY | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/category/60-drand-faq/index.html b/site/docs/category/60-drand-faq/index.html new file mode 100644 index 00000000..5465786e --- /dev/null +++ b/site/docs/category/60-drand-faq/index.html @@ -0,0 +1,14 @@ + + + + + +6.0 DRAND FAQ | drand + + + + + + + + \ No newline at end of file diff --git a/site/docs/concepts/2-0-concepts/index.html b/site/docs/concepts/2-0-concepts/index.html new file mode 100644 index 00000000..eb02dd58 --- /dev/null +++ b/site/docs/concepts/2-0-concepts/index.html @@ -0,0 +1,23 @@ + + + + + +2.0 Concepts | drand + + + + + +

2.0 CONCEPTS (Getting Started)

+

This section introduces the key concepts behind drand. For information about consuming randomness from a drand network, see the **Developer's Guide. F**or help running a drand network, see the entries under the “For Operators” section. To run node(s) or relay(s) for the League of Entropy, please apply to the League to be considered for membership.

+
    +
  • Read the What is "drand"? section to learn more about drand’s main goals. It gives an overview of the challenges drand aims to address.
  • +
  • Cryptography provides an overview of the cryptographic building blocks that drand uses to generate publicly-verifiable, unbiased, and unpredictable randomness in a distributed manner.
  • +
  • Security Model describes the security considerations taken into account when designing and building drand.
  • +
  • Specification is a formal description of the drand protocols.
  • +
  • Timelock Encryption gives all the information on our Timelock Encryption scheme, and links on where to find the tools to use it.
  • +
+
+ + \ No newline at end of file diff --git a/site/docs/concepts/2-1-concepts-cryptography/index.html b/site/docs/concepts/2-1-concepts-cryptography/index.html new file mode 100644 index 00000000..730b02a0 --- /dev/null +++ b/site/docs/concepts/2-1-concepts-cryptography/index.html @@ -0,0 +1,45 @@ + + + + + +2.1 Cryptography | drand + + + + + +

2.1 Concepts: Cryptography

+

This document provides an overview of the cryptographic building blocks that drand uses to generate publicly verifiable, unbiased, and unpredictable randomness in a distributed manner.

+

🕳️ Threshold Cryptography

+

drand relies on threshold cryptography, where a minimum number of participants must work together to execute cryptographic operations. This approach avoids single points of failure and enhances security.

+

The drand beacon operates in two phases: 1.) the setup phase and 2.) the beacon phase.

+

1. Setup Phase

+

The setup phase creates a collective private and public key pair shared among participants. This is done through a Distributed Key Generation (DKG) process, ensuring that no individual node knows the entire collective private key. Each private key share is used for cryptographic threshold computations, such as generating threshold signatures.

+

🤐 Secret Sharing

+

Secret sharing allows a secret value to be split into shares, which can be reconstructed only if a threshold of shares is available. drand uses Shamir's Secret Sharing (SSS) scheme, which is well-known for its reliability and security.

+ +

🤫 Verifiable Secret Sharing

+

Verifiable Secret Sharing (VSS) ensures that participants can verify their shares, protecting against malicious dealers. drand uses Feldman's VSS scheme, an extension of SSS, to ensure the shared secret can be correctly reconstructed.

+ +

🔑 Distributed Key Generation (DKG)

+

DKG creates a collectively shared secret without any single participant knowing it. drand uses Pedersen's DKG scheme, running multiple instances of Feldman's VSS in parallel to create a final share for each participant. This collective public key is then used in the randomness generation phase.

+ +

🚨 2. Beacon Phase

+

In the beacon phase, drand uses pairing-based cryptography to generate publicly verifiable, unbiased, and unpredictable randomness. The process involves threshold Boneh-Lynn-Shacham (BLS) signatures.

+

👫 Pairing-Based Cryptography

+

Pairing-based cryptography uses bilinear groups to create efficient cryptographic operations. drand currently uses the BLS12-381 curve.

+ +

🎲 Randomness Generation

+

To generate randomness, drand uses threshold BLS signatures. Each participant creates a partial signature, which are then combined to form a collective BLS signature. This signature is hashed to produce the final random value.

+ +

🔏 Smaller Signatures for Resource-Constrained Applications

+

drand supports schemes, which are network-level configurations that determine the cryptographic methods and protocols used to generate randomness. These scheme aim to minimize the size of signatures, reducing storage requirements and improving efficiency.

+

⛓️ Chained and Unchained Modes

+

drand operates in two modes: chained and unchained. In chained mode, each random value depends on all previous values, ensuring security and consistency. In unchained mode, each random value is generated independently.

+ +

🎓 Learning More

+

For more detailed information, refer to the drand project specifications and related research papers on scalable bias-resistant distributed randomness.

+
+ + \ No newline at end of file diff --git a/site/docs/concepts/2-2-concepts-security-model/index.html b/site/docs/concepts/2-2-concepts-security-model/index.html new file mode 100644 index 00000000..6906b478 --- /dev/null +++ b/site/docs/concepts/2-2-concepts-security-model/index.html @@ -0,0 +1,86 @@ + + + + + +2.2 Security Model | drand + + + + + +

2.2 Concepts: Security Model

+

📕 Key Terminology

+

Drand Node: A node running the drand daemon, participating in generating randomness across one or multiple networks. A drand network consists of interconnected drand nodes, each with a long-term public key and a private share.

+

Relay Node: A node connected to a drand daemon, providing an Internet-facing interface to fetch public randomness. The relay network consists of relay nodes that may be partially connected.

+

Corrupted Node: A node controlled by an attacker, giving access to all its cryptographic material and network authorizations.

+

Offline Node: A node that is unreachable from an external point of view.

+

Online Node: A node that is running and correctly transmitting packets over the Internet.

+

🌒 Security Phases

+

In drand, there are two main phases, each with specific security assumptions:

+

Phase 1. Distributed Key Generation (DKG) Setup

+

The DKG protocol follows Pedersen's protocol, ensuring:

+
    +
  • Synchronous Network: Packets reach their destination within a bounded time.
  • +
  • Synchronized Clocks: Nodes have synchronized clocks with minimal offset.
  • +
  • Reliable Broadcast Channel: All nodes receive the same packet within a bounded time.
  • +
  • Authenticated Channel: All communications are authenticated.
  • +
  • Public Group: Nodes know each other's public keys before starting the DKG.
  • +
+

Phase 2. Randomness Generation

+

The randomness generation phase ensures:

+
    +
  • Network Flexibility: No strict network bounds; nodes process packets as they arrive.
  • +
  • Synchronized Clocks: Nodes start rounds simultaneously with accurate clock synchronization.
  • +
  • Broadcast Channel: A regular broadcast channel suffices for partial beacon transmission.
  • +
  • Threshold: A specific number of nodes must be online and honest to create the final random beacon.
  • +
  • Determinism: The chain is deterministic with respect to a fresh DKG phase.
  • +
+

💥 Attack Vectors & Mitigations

+

Randomness Generation Attacks

+
    +
  1. Front Running: +
      +
    • Passive Adversary: An attacker listening to traffic might aggregate the final beacon before others.
    • +
    • Active Adversary: An attacker tries to disable half of the nodes, deciding whether to release the final beacon.
    • +
    +
  2. +
  3. Denial of Service (DoS) Attacks: +
      +
    • Scenario: Sustained DoS attacks can halt the chain if enough nodes are disabled.
    • +
    • Defense: Block incoming traffic early, allowing only known IP addresses.
    • +
    +
  4. +
  5. Corruption: +
      +
    • Scenario #1: Attacker corrupts less than the threshold of nodes, gaining no meaningful information.
    • +
    • Scenario #2: Attacker corrupts more than the threshold, deriving the entire chain.
    • +
    +
  6. +
+

Distributed Key Generation Attacks

+
    +
  1. DoS During DKG: +
      +
    • Nodes may miss shares or replies, risking exclusion.
    • +
    • Remediation: Manual verification of the final group and decision to re-run DKG if necessary.
    • +
    +
  2. +
  3. Corruption During DKG: +
      +
    • Scenario 1: Attacker influences the distribution of private shares without biasing randomness.
    • +
    • Scenario 2: Attacker controls more than the threshold, knowing the randomness chain.
    • +
    +
  4. +
  5. Broadcast Channel Assumption: +
      +
    • Attacker sends inconsistent shares, causing verification issues.
    • +
    • Observation: Nodes publish the distributed public key and start randomness rounds, enabling third-party verification.
    • +
    +
  6. +
+

Conclusion

+

drand employs robust security measures, including pairing-based cryptography and threshold BLS signatures, to ensure publicly verifiable, unbiased, and unpredictable randomness. Regular resharing and strict network protocols further enhance security and resilience against attacks.

+
+ + \ No newline at end of file diff --git a/site/docs/concepts/2-3-concepts-specification/index.html b/site/docs/concepts/2-3-concepts-specification/index.html new file mode 100644 index 00000000..26c53fdf --- /dev/null +++ b/site/docs/concepts/2-3-concepts-specification/index.html @@ -0,0 +1,72 @@ + + + + + +2.3 Specification | drand + + + + + +

2.3 Concepts: Specification

+

This document outlines the specifications of the drand protocols.

+

📕 Key Terminology

+

Drand Node: A server that runs the drand code, participating in the distributed key generation (DKG) process and randomness generation. Each node can run multiple independent internal randomness processes, each with its own randomness generation frequency.

+

Drand Network: A group of nodes running a specific process, acting as an independent beacon generator.

+

Drand Beacon: The output created by the drand network, containing the signature of the previous beacon, the round of the beacon, and the signature itself.

+

Beacon ID: A unique identifier for each beacon process running on a drand node. This ID helps each drand node dispatch received messages to the correct internal process.

+

Metadata

+

Each request sent by a drand node includes metadata to communicate important message-related data. The protobuf definition for this field is:

+
message Metadata {
NodeVersion node_version = 1;
string beaconID = 2;
bytes chain_hash = 3;
}
+

Scheme

+

A scheme is a network-level configuration set by a coordinator when starting a new network. Available schemes are:

+
    +
  • DefaultSchemeID: "pedersen-bls-chained"
  • +
  • UnchainedSchemeID: "pedersen-bls-unchained"
  • +
  • ShortSigSchemeID: "bls-unchained-on-g1"
  • +
+

Group Configuration

+

Group Configuration includes all necessary information about a running drand network, such as nodes, threshold, period, ID, scheme, genesis time, genesis seed, distributed public key, and transition time. This configuration is shared internally within drand nodes.

+

Group Configuration Hash

+

The group configuration is uniquely referenced via its canonical hash, derived using the BLAKE2b hash function.

+

Wire Format & API

+

Drand uses gRPC as the networking protocol. All exposed services and protobuf definitions are in the protocol.proto file for intra-node protocols and in the api.proto file.

+

drand Node Operations

+

Generating public randomness is the primary function of drand. Each node can run multiple processes, each independent of the others, identified and dispatched using the Beacon ID.

+

drand Versioning

+

Each request sent by a drand node contains the protocol version used. Drand uses semantic versioning, allowing only nodes with the same MAJOR version to communicate.

+

drand Modules

+

drand operates in two phases: 1. setup and 2. generation.

+

1. Setup Phase

+

During the setup phase, nodes perform a DKG protocol to create the collective public key and individual private key shares. This setup uses a coordinator to collect public keys and create the group configuration.

+

2. Randomness Generation Phase

+

After setup, nodes switch to randomness generation mode, broadcasting partial signatures periodically. Once enough partial signatures are gathered, a final signature is reconstructed, verified, and hashed to produce the public randomness.

+

Randomness Generation Details

+

Randomness Generation Period

+

The drand network outputs a new random beacon every period, mapping a beacon "round" to a specific time. The function to determine the current round and time is as follows:

+
func CurrentRound(now, genesis int64, period uint32) (round uint64, time int64) {
if now < genesis {
return 0
}
fromGenesis := now - genesis
round = uint64(math.Floor(float64(fromGenesis)/period)) + 1
time = genesis + int64(nextRound*uint64(period.Seconds()))
return
}
+

Chained vs. Unchained Mode

+

drand can operate in two modes regarding randomness generation: chained or unchained. In chained mode, each beacon builds on the previous one, forming a randomness chain. In unchained mode, each beacon is independent.

+

Root of Trust

+

drand uniquely identifies a randomness chain via the Info structure, which includes public key, ID, period, scheme, genesis time, and group hash.

+

Catchup Mode

+

Nodes must synchronize with each other to catch up if the network stalls. Nodes enter catchup mode if they detect a discrepancy in the expected round, synchronizing beacons until the current round is reached.

+

Syncing

+

Nodes that are offline or restarted should sync with the network, requesting beacons from the last saved round to the current round.

+

Cryptographic Specification

+

drand Curve

+

drand uses the BLS12-381 pairing curve, with points sent in compressed form. The hash-to-curve algorithm follows RFC-9380.

+

Distributed Public Key

+

The distributed public key is a list of BLS12-381 G1 points, representing the public polynomial created during the DKG protocol.

+

Beacon Signature

+

A beacon signature is a BLS signature over the message, verified using the distributed public key.

+

Partial Beacon Signature

+

A partial beacon signature is created over the same input as the beacon signature, prefixed with the node's index.

+

Distributed Key Generation

+

drand implements the Joint Feldman protocol for DKG, ensuring secure and distributed key generation.

+

Resharing

+

Resharing allows an established group to distribute new shares to a new group of nodes, maintaining the same public key for verifying random beacons.

+
+ + \ No newline at end of file diff --git a/site/docs/concepts/2-4-concepts-timelock-encryption/index.html b/site/docs/concepts/2-4-concepts-timelock-encryption/index.html new file mode 100644 index 00000000..fe9f7e43 --- /dev/null +++ b/site/docs/concepts/2-4-concepts-timelock-encryption/index.html @@ -0,0 +1,88 @@ + + + + + +2.4 Timelock Encryption | drand + + + + + +

2.4 Concepts: Timelock Encryption

+

🤔 What is Timelock Encryption?

+

Timelock encryption allows you to encrypt information now that can only be decrypted at a future time. Traditional methods have used either trusted third parties to store keys or proof of work, requiring users to perform computations to decrypt the information. Proof of work has become ineffective due to advancements in hardware and computational science, and it also wastes a lot of energy. Using a trusted third party avoids these issues but relies on trusting that party and hoping they aren't breached.

+

How drand enables Timelock Encryption

+

With the launch of our unchained scheme, drand supports a new paradigm for timelock encryption. drand acts as a reference clock: each drand round is mapped to a specific time, and network nodes share their signature over that round number once the time is reached. These signatures form a full randomness beacon, attesting that the network believes the clock time has been reached.

+

Our timelock scheme uses identity-based encryption to allow users to create ciphertexts using a future round's random value as the private key. The drand network won't release that randomness until the specified time, providing accurate timelock encryption without wasting energy or relying on a single third party. Users can decrypt their timelock ciphertext offline without needing a third party.

+

🎓 Learn more about Timelock Encryption

+ +

🛡️ Security Assumptions

+

While our timelock scheme has been assessed by Kudelski Security, it's essential to understand its limitations:

+
    +
  • Malicious Nodes: If a threshold number of malicious nodes join the network, they could generate all future random values and decrypt future timelock ciphertexts. Our quicknet network started with 18 organizations running 22 nodes, minimizing this risk.
  • +
  • Quantum Resistance: Our cryptography does not use quantum-resistant algorithms. If you encrypt something for 1000 years and a viable quantum computer emerges, it could decrypt it. Currently, no widespread quantum-resistant schemes exist for threshold identity-based encryption (IBE) cryptography.
  • +
  • Network Shutdown: If the League of Entropy shuts down, members would delete their keys. This means ciphertexts created after the network's cessation would be un-decryptable until quantum computers can break them.
  • +
+

📋 Use Cases

+

Timelock encryption has various applications, including:

+
    +
  • Responsible vulnerability disclosures
  • +
  • Transfer of assets/passwords upon death
  • +
  • Sealed-bid auctions
  • +
  • Maximal extractable value (MEV) prevention
  • +
  • Public, turn-based games
  • +
  • Voting
  • +
  • Quizzes
  • +
+

Join our Slack and post your ideas in the #drand-use-cases channel for discussion!

+

🧮 The Math behind Timelock Encryption

+

Encryption: A client encrypts a message to be decrypted at a specific epoch by:

+
    +
  1. Computing the "round public key.”
  2. +
  3. Choosing a random "mask."
  4. +
  5. Setting the ephemeral secret key.
  6. +
  7. Outputting the ciphertext with the ephemeral public key, mask commitment, and one-time pad.
  8. +
+

Decryption: A client decrypts a ciphertext using the epoch signature by:

+
    +
  1. Computing the necessary values.
  2. +
  3. Verifying the ciphertext.
  4. +
  5. Extracting the plaintext.
  6. +
+

Libraries for Timelock Encryption

+
    +
  • tlock: A Go CLI and library. +
      +
    • tlock is a go CLI and library developed and maintained by the drand team for performing timelock encryption and decryption.
    • +
    +
  • +
  • tlock-js: A JavaScript library written in Typescript. +
      +
    • tlock-js is a JavaScript library developed and maintained by the drand team for performing timelock encryption and decryption written in Typescript.
    • +
    +
  • +
  • dee: A Rust CLI by Thibault Meunier from Cloudflare. +
      +
    • dee is a rust CLI developed and maintained by Thibault Meunier from Cloudflare. It can perform timelock encryption and decryption, as well as retrieve beacons from any of the drand networks.
    • +
    +
  • +
  • timevault: A web app for timelock encryption and decryption. +
      +
    • timevault is a web app for timelock encrypting and decrypting vulnerability reports for responsible disclosure as well as arbitrary text. It is developed and maintained by the drand team.
    • +
    +
  • +
  • tlock-fvm: +
      +
    • Timelock encryption and decryption will be available on the Filecoin Virtual Machine in the second half of 2023. Stay tuned to our blog for updates!
    • +
    +
  • +
+
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-0-dev-guide/index.html b/site/docs/dev-guide/3-0-dev-guide/index.html new file mode 100644 index 00000000..2d57779a --- /dev/null +++ b/site/docs/dev-guide/3-0-dev-guide/index.html @@ -0,0 +1,43 @@ + + + + + +3.0 Developers Guide | drand + + + + + +

3.0 DEVELOPERS GUIDE

+

This section helps developers build applications that use drand as a source of randomness. For help running your own drand network, see the guides under “For Operators” on the main menu of the site.

+

The current public League of Entropy drand mainnet API endpoints are:

+
    +
  • https://api.drand.sh (HTTPS endpoint, also available over HTTP)
  • +
  • https://api2.drand.sh (HTTPS endpoint, also available over HTTP)
  • +
  • https://api3.drand.sh (HTTPS endpoint, also available over HTTP)
  • +
  • https://drand.cloudflare.com (HTTPS endpoint)
  • +
  • https://api.drand.secureweb3.com:6875 (HTTPS endpoint)
  • +
  • /dnsaddr/api.drand.sh (1st-level libp2p gossipsub relay endpoint)
  • +
  • /dnsaddr/api2.drand.sh (1st-level libp2p gossipsub relay endpoint)
  • +
  • /dnsaddr/api3.drand.sh (1st-level libp2p gossipsub relay endpoint)
  • +
+

There are two networks on mainnet:

+
    +
  • default which is running the chained scheme with public keys on G1
  • +
  • quicknet which is running the unchained scheme with public keys on G2
  • +
+

default network chain hash: 8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce

+

quicknet network chain hash: 52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971

+ +

In order to retrieve randomness from a drand network you should preferentially use the drand client libraries or the drand-client CLI, which support the different mechanisms and perform verification for every value obtained.

+

Alternatively, you can interact directly with the endpoints. Make sure to manually verify every value:

+ +

Finally, for development purposes, we recommend also testing your code against our Testnet endpoints. See our dedicated documentation entry about testnet endpoints.

+
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-1-dev-guide-organization/index.html b/site/docs/dev-guide/3-1-dev-guide-organization/index.html new file mode 100644 index 00000000..6e2b6940 --- /dev/null +++ b/site/docs/dev-guide/3-1-dev-guide-organization/index.html @@ -0,0 +1,105 @@ + + + + + +3.1 DevGuide: Organization | drand + + + + + +

3.1 DevGuide: Organization

+

Top-level Packages

+
    +
  • +

    chain - Code for generating the sequence of beacons (implementation of which is in chain/beacon) after setup.

    +
      +
    • boltdb - BoltDB storage backend.
    • +
    • errors - common errors for the chain package.
    • +
    • memdb - in-memory storage backend.
    • +
    • postgresdb - PostgreSQL storage backend.
    • +
    +
  • +
  • +

    client - The drand client library - composition utilities for fail-over and reliable abstraction.

    +
      +
    • client/grpc - The concrete gRPC client implementation.
    • +
    • client/http - The concrete HTTP client implementation.
    • +
    • client/test - Mock client implementations for testing.
    • +
    +
  • +
  • +

    cmd - Binary entry points.

    +
      +
    • cmd/client - A client for fetching randomness.
    • +
    • cmd/client/lib - A common library for creating a client shared by cmd/client and cmd/relay.
    • +
    • cmd/drand-cli - The main drand group member binary.
    • +
    • cmd/relay - A relay that pulls randomness from a drand group member and exposes an HTTP server interface.
    • +
    • cmd/relay-gossip - A relay that pulls randomness from a group member and publishes it over a libp2p gossipsub topic.
    • +
    +
  • +
  • +

    crypto - Holds the schemes supported by drand.

    +
  • +
  • +

    core - The primary Service interface of drand commands.

    +
      +
    • core/migration - A library for migrating drand files from single-beacon to multi-beacon version.
    • +
    +
  • +
  • +

    demo - A framework for integration testing.

    +
  • +
  • +

    deploy - Records of previous drand deployments.

    +
  • +
  • +

    docker - Helpers for docker image packaging.

    +
  • +
  • +

    docs - Here.

    +
  • +
  • +

    entropy - A common abstraction for ingesting randomness.

    +
  • +
  • +

    fs - Utilities for durable state storage.

    +
  • +
  • +

    hooks - Docker helper entry point.

    +
  • +
  • +

    http - The publicly exposed HTTP server for exposing randomness.

    +
  • +
  • +

    key - Validation of signatures.

    +
  • +
  • +

    log - Common logging library.

    +
  • +
  • +

    lp2p - Utilities for constructing a libp2p host.

    +
      +
    • lp2p/client - The concrete gossip client implementation.
    • +
    +
  • +
  • +

    metrics - The Prometheus metrics server.

    +
  • +
  • +

    net - gRPC service handlers for inter-node communication.

    +
  • +
  • +

    protobuf/drand - Definitions for the wire format interface of inter-node communication.

    +
  • +
  • +

    test - Testing helper utilities.

    +
      +
    • test/docker - Files and related scripts for testing drand networks on docker.
    • +
    +
  • +
+
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-2-dev-guide-drand-client-cli/index.html b/site/docs/dev-guide/3-2-dev-guide-drand-client-cli/index.html new file mode 100644 index 00000000..dd32a681 --- /dev/null +++ b/site/docs/dev-guide/3-2-dev-guide-drand-client-cli/index.html @@ -0,0 +1,26 @@ + + + + + +3.2 drand-client CLI | drand + + + + + +

3.2 DevGuide: drand-client CLI

+

The drand-client command-line interface application can be used to fetch randomness from a drand network. It is a CLI frontend for the drand client libraries.

+

Installation

+

From Source

+

This will require a working Golang installation. You'll also need the make command available.

+
git clone https://github.com/drand/drand
cd drand
make drand-client
+

From Docker

+
docker run drandorg/drand-client
+

Usage

+

Run drand-client --help for a list of supported options.

+

As an example, here is how to launch the client in order to read randomness for the current League of Entropy mainnet endpoints with automatic verification, failover and fastest-endpoint optimizations:

+
drand-client --watch \
--chain-hash 8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce \
--url http://api.drand.sh \
--url http://api2.drand.sh \
--url http://api3.drand.sh \
--url https://drand.cloudflare.com \
--relay /dnsaddr/api.drand.sh \
--relay /dnsaddr/api2.drand.sh \
--relay /dnsaddr/api3.drand.sh
+
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-3-dev-guide-client-libraries/index.html b/site/docs/dev-guide/3-3-dev-guide-client-libraries/index.html new file mode 100644 index 00000000..88c215ac --- /dev/null +++ b/site/docs/dev-guide/3-3-dev-guide-client-libraries/index.html @@ -0,0 +1,49 @@ + + + + + +3.3 Client Libraries | drand + + + + + +

3.3 DevGuide: Client Libraries

+

Client libraries enable easy access to drand randomness in specific programming languages. They also provide peace of mind by verifying randomness rounds and add additional features like failover, racing, aggregation, and caching.

+

Drand randomness is available over HTTPlibp2p PubSub and gRPC.

+

Currently, the following client libraries are available:

+ +

If your application cannot use the libraries above, you can still use the drand-client CLI or make requests to the HTTP API endpoints. If you have created a client library or know of a client library not listed here, please let us know by opening an issue.

+Go Logo +

Install

+
go get github.com/drand/drand
+

Usage

+

The Go drand client library is structured with a base client interface in /client, and with protocol-specific transport implementations in /client/http/client/grpc and /lp2p/client. The main client package holds transport agnostic logic for retrying, validation, and caching.

+

For documentation and examples please check the Go clients reference:

+ +

Client implementations (to be used with the above):

+ + +

Install

+

In the browser or Deno you can grab and use the client from a CDN e.g. https://cdn.jsdelivr.net/npm/drand-client/drand.js.

+

In Node.js, install with:

+
npm install drand-client
+

Usage

+

The JS drand client is an esmodule. It has no dependencies and is not transpiled. It can be imported directly in the browser, Deno or Node.js. In Node.js it can be imported from CommonJS using await import('...').

+ +
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-4-dev-guide-http-api/index.html b/site/docs/dev-guide/3-4-dev-guide-http-api/index.html new file mode 100644 index 00000000..dbaf0e28 --- /dev/null +++ b/site/docs/dev-guide/3-4-dev-guide-http-api/index.html @@ -0,0 +1,97 @@ + + + + + +3.4 HTTP API | drand + + + + + +

3.4 DevGuide: HTTP API

+

Drand provides a JSON HTTP interface that clients can use to fetch randomness from each drand network running on nodes. If you're using drand in an application, it may be easier and more secure to use one of the client libraries, which will also perform verification of randomness rounds and add additional features like failover, racing, aggregation, and caching.

+

All that's required is the address of the HTTP interface and way to fetch from HTTP, e.g. curl.

+

Public endpoints

+

The public League of Entropy HTTP APIs are available at:

+
    +
  • Protocol Labs +
      +
    • https://api.drand.sh/
    • +
    • https://api2.drand.sh/
    • +
    • https://api3.drand.sh/
    • +
    +
  • +
  • Cloudflare +
      +
    • https://drand.cloudflare.com/
    • +
    +
  • +
  • StorSwift +
      +
    • https://api.drand.secureweb3.com:6875/
    • +
    +
  • +
+

The League of Entropy currently runs two networks in mainnet: default and fastnet. They are chained and unchained networks respectively, the details of which can be found in the cryptography specification.

+

The chain hash for the League of Entropy default chain running at a 30s frequency in chained mode on Mainnet is:

+
8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce
+

It also available at the default context, i.e. omitting the /{chain-hash} in the API specification below.

+

The chain hash for the League of Entropy quicknet network running at a 3s frequency in unchained mode on Mainnet is:

+
52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971
+

Note that **the fastnet network has been deprecated.**

+

Testnet endpoints

+

Furthermore, we have "testnet endpoints" which are a completely separate environment for testing our latest changes, potentially helping you detect breaking changes or issues with our latest release before they hit mainnet. We recommend running your CI/CD against our testnet endpoints as well as our mainnet ones, in order to detect issues early.

+

We currently have three testnet HTTP(S) endpoints being run by:

+ +

As you can see, they are currently running various chains as explained below. We are committed to maintaining the default, G2 based, chained testnet chain (84b2234fb34e835dccd048255d7ad3194b81af7d978c3bf157e3469592ae4e02) as well as the faster, G1 based, unchained quicknet-t testnet chain (cc9c398442737cbd141526600919edd69f1d6f9b4adb67e4d912fbc64341a9a5) as long as we run the equivalent mainnet networks.

+

Other testnet chains, such as our first "unchained" testnet (7672797f548f3f4748ac4bf3352fc6c6b6468c9ad40ad456a397545c6e2df5bf) or our first G1 based non-RFC compliant chain (f3827d772c155f95a9fda8901ddd59591a082df5ac6efe3a479ddb1f5eeb202c) may be deprecated in the future.

+

/chains

+

Retrieves the chain hash of every running network a user can interact with. It returns a JSON object with the following structure:

+
[
"8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce",
"859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce",
"8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84",
"515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"
]
+

/{chain-hash}/info

+

Retrieves the randomness chain information. It returns a JSON object with the following structure:

+
{
"public_key": "868f005eb8e6e4ca0a47c8a77ceaa5309a47978a7c71bc5cce96366b5d7a569937c529eeda66c7293784a9402801af31",
"period": 30,
"genesis_time": 1595431050,
"hash": "8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce",
"groupHash": "176f93498eac9ca337150b46d21dd58673ea4e3581185f869672e59fa4cb390a",
"schemeID": "pedersen-bls-chained",
"metadata": {
"beaconID": "default"
}
}
+
    +
  • public_key is the distributed public key of the drand group
  • +
  • period is the time in seconds between randomness beacon rounds
  • +
  • genesis_time is the time in seconds since the Unix Epoch that the group began generating randomness
  • +
  • hash is the chain hash, which uniquely identifies the drand chain. It is used as a root of trust for validation of the first round of randomness.
  • +
  • groupHash is the hash of a file containing the current set of nodes participating in the network. The group file is updated on every resharing.
  • +
  • schemeID is the name of the scheme this network uses. The scheme specifies the type of cryptography being used to generate the randomness beacons.
  • +
  • metadata contains some miscellaneous metadata about the network that is added to most packets during operation.
  • +
+

/{chain-hash}/public/latest

+

Retrieves the latest round of randomness. It returns a JSON object with the following structure:

+
{
"round": 367,
"randomness": "3439d92d58e47d342131d446a3abe264396dd264717897af30525c98408c834f",
"signature": "90957ebc0719f8bfb67640aff8ca219bf9f2c5240e60a8711c968d93370d38f87b38ed234a8c63863eb81f234efce55b047478848c0de025527b3d3476dfe860632c1b799550de50a6b9540463e9fb66c8016b89c04a9f52dabdc988e69463c1",
"previous_signature": "859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"
}
+
    +
  • round is a monotonically increasing integer - the randomness round index
  • +
  • randomness is a SHA-256 hash of the signature
  • +
  • signature is the Boneh-Lynn-Shacham (BLS) signature for this round of randomness
  • +
  • previous_signature is the signature of the previous round of randomness
  • +
+

/{chain-hash}/public/{round}

+

Retrieves a previous round of randomness identified by the positive integer round. Note that specifying 0 will retrieve the latest round. It returns a JSON object with the following structure:

+
{
"round": 367,
"randomness": "3439d92d58e47d342131d446a3abe264396dd264717897af30525c98408c834f",
"signature": "90957ebc0719f8bfb67640aff8ca219bf9f2c5240e60a8711c968d93370d38f87b38ed234a8c63863eb81f234efce55b047478848c0de025527b3d3476dfe860632c1b799550de50a6b9540463e9fb66c8016b89c04a9f52dabdc988e69463c1",
"previous_signature": "859504eade86790ad09b2b3474d5e09d1718b549ef7107d7bbd18f5e221765ce8252d7db02664c1f6b20f40c6e8e138704d2acfeb6c5abcc14c77e3a842b2f84515e7366248ca37b1460d23b4f98493c246fbb02851f2a43a710c968a349f8d6"
}
+
    +
  • round is a sequentially increasing integer - the randomness round index
  • +
  • randomness is a SHA-256 hash of the signature
  • +
  • signature is the Boneh-Lynn-Shacham (BLS) signature for this round of randomness
  • +
  • previous_signature is the signature of the previous round of randomness (note: this will is omitted for unchained networks
  • +
+

Note: For backwards-compatibility reasons, paths without chain-hash will resort to the the default network in operation.

+
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-5-dev-guide-pubsub-network/index.html b/site/docs/dev-guide/3-5-dev-guide-pubsub-network/index.html new file mode 100644 index 00000000..008d6e68 --- /dev/null +++ b/site/docs/dev-guide/3-5-dev-guide-pubsub-network/index.html @@ -0,0 +1,32 @@ + + + + + +3.5 PubSub Network | drand + + + + + +

3.5 DevGuide: PubSub Network

+

drand is able to publish randomness on a libp2p PubSub network using the gossipsub protocol , using what is known as a gossip relay.

+

Public endpoints

+

The public League Of Entropy network provides the following 1st-tier gossip relays (all existing gossip relays will form a mesh to distribute randomness around):

+
    +
  • /dnsaddr/api.drand.sh
  • +
  • /dnsaddr/api2.drand.sh
  • +
  • /dnsaddr/api3.drand.sh
  • +
+

The pubsub topic on which randomness is published is based to the drand's chain hash as follows:

+
/drand/pubsub/v0.0.0/<chain_hash>
+

for the public network being /drand/pubsub/v0.0.0/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce.

+

Usage

+

The published messages are encoded protobufs of type PublicRandResponse(RandResponse).

+

In order to receive randomness using this method you will need to run an application that creates a libp2p host that can connect to a pubsub relay and subscribe to the PubSub topic. We recommend using drand's client libraries or the drand-client tool, which automatically perform verification for this task.

+

As a side note, IPFS can be used to subscribe to PubSub topics (running with ipfs daemon --enable-pubsub-experiment):

+
ipfs swarm connect /dnsaddr/api.drand.sh
ipfs pubsub sub /drand/pubsub/v0.0.0/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce
+ +
+ + \ No newline at end of file diff --git a/site/docs/dev-guide/3-6-dev-guide-code-examples/index.html b/site/docs/dev-guide/3-6-dev-guide-code-examples/index.html new file mode 100644 index 00000000..9ed775e2 --- /dev/null +++ b/site/docs/dev-guide/3-6-dev-guide-code-examples/index.html @@ -0,0 +1,17 @@ + + + + + +3.6 Code Examples | drand + + + + + +
+ + \ No newline at end of file diff --git a/site/docs/drand-community/5-0-drand-community/index.html b/site/docs/drand-community/5-0-drand-community/index.html new file mode 100644 index 00000000..feeca5bf --- /dev/null +++ b/site/docs/drand-community/5-0-drand-community/index.html @@ -0,0 +1,41 @@ + + + + + +5.0 DRAND COMMUNITY | drand + + + + + +

5.0 DRAND COMMUNITY

+

Welcome to the drand community! We're always seeking better ways to engage with our members and welcome new participants. Here’s how you can join and stay connected with us:

+

👥 Join Our GitHub Community

+

The best way to actively participate and contribute to drand is through GitHub. By joining our GitHub community, you can:

+
    +
  • Access and contribute to drand’s source code.
  • +
  • Report issues and suggest improvements.
  • +
  • Collaborate with other developers and enthusiasts.
  • +
+

💬 Engage in Discussions on Slack

+

For real-time conversations and ongoing discussions, join us on drandworkspace.slack.com. On Slack, you can:

+
    +
  • Ask questions and get near-immediate responses.
  • +
  • Participate in topic-specific channels.
  • +
  • Connect with the drand team and fellow community members.
  • +
+

📬 Stay Informed with Our Mailing List

+

Join our announcement mailing list for all League of Entropy members. This mailing list is:

+
    +
  • Used for announcing any changes impacting drand users downstream.
  • +
  • Maintained by the League of Entropy Secretariat.
  • +
  • An excellent way to stay updated with important news and updates.
  • +
+

You can join the mailing list by visiting groups.google.com/g/leagueofentropy-users.

+

🎪 Attend one of Our Events

+

Subscribe to our event calendar on Lu.ma.

+

drand · Events Calendar

+
+ + \ No newline at end of file diff --git a/site/docs/drand-community/5-1-drand-community-contributing/index.html b/site/docs/drand-community/5-1-drand-community-contributing/index.html new file mode 100644 index 00000000..9c9ff86d --- /dev/null +++ b/site/docs/drand-community/5-1-drand-community-contributing/index.html @@ -0,0 +1,39 @@ + + + + + +5.1 Contributing | drand + + + + + +

5.1 Community: Contributing

+

We welcome contributions to the drand project! Whether you’re interested in submitting code, fixing bugs, or updating documentation, your help is invaluable.

+

Core Project Contributions

+

drand is constantly evolving, and while not all external contributions can be accepted, your input is highly valued. Here’s how you can contribute:

+
    +
  • Submit Bug Reports: Found a bug? Report it on GitHub to help us improve drand.
  • +
  • Suggest Improvements: Have ideas for new features or enhancements? Share them with us through GitHub.
  • +
  • Contribute Code: If you have developed a fix or feature, you can submit a pull request for review. Please note that contributions should align with the project’s goals and standards.
  • +
+

Improving Documentation

+

Our documentation is a critical resource for users and developers alike, and we strive to keep it accurate and up-to-date. Here’s how you can help:

+
    +
  • Report Issues: If you find any errors or need clarification, file an issue on GitHub.
  • +
  • Request Features: Have a feature request or need more detailed documentation? Let us know through our documentation repository.
  • +
  • Submit Updates: You can directly contribute by submitting improvements to the documentation via GitHub.
  • +
+

Submitting Issues

+

If you encounter bugs or have feature requests, we encourage you to submit them through GitHub. Clear and detailed reports help us address issues more effectively.

+

How to Submit an Issue

+
    +
  1. Search for Existing Issues: Before submitting a new issue, check if it has already been reported.
  2. +
  3. Create a Detailed Report: Provide a clear and concise description of the problem or request. Include steps to reproduce the issue, if applicable.
  4. +
  5. Submit on GitHub: Use the appropriate GitHub repository to submit your issue.
  6. +
+

Your contributions help make drand better for everyone. Thank you for your support!

+
+ + \ No newline at end of file diff --git a/site/docs/drand-faq/6-0-drand-faq/index.html b/site/docs/drand-faq/6-0-drand-faq/index.html new file mode 100644 index 00000000..fa747108 --- /dev/null +++ b/site/docs/drand-faq/6-0-drand-faq/index.html @@ -0,0 +1,16 @@ + + + + + +6.0 DRAND FAQ | drand + + + + + +

6.0 DRAND FAQ

+

[Note: Currently a stub. Fill this up!]

+

<Answers to commonly asked questions about the service, its usage, and any potential issues users might encounter.>

+ + \ No newline at end of file diff --git a/site/docs/home/index.html b/site/docs/home/index.html new file mode 100644 index 00000000..04cd3e8c --- /dev/null +++ b/site/docs/home/index.html @@ -0,0 +1,26 @@ + + + + + +Welcome to the drand docs 🎲! | drand + + + + + +

Welcome to the drand docs 🎲!

+ +

Use this documentation to add secure, high-entropy, verifiable randomness to your application.

+

This is the documentation site for drand including both general and developer documentation.

+

Contents:

+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-0-ops-guide/index.html b/site/docs/ops-guide/4-0-ops-guide/index.html new file mode 100644 index 00000000..12b3cdb5 --- /dev/null +++ b/site/docs/ops-guide/4-0-ops-guide/index.html @@ -0,0 +1,77 @@ + + + + + +4.0 OPERATORS GUIDE | drand + + + + + +

4.0 OPERATORS GUIDE

+

Overview

+

A drand Network is composed of individual and independent drand Nodes that generate randomness by networking with other distributed nodes. The randomness is published to the world with the help of drand Relays.

+

Key Objectives for League of Entropy Operators:

+
ObjectiveDescription
SecurityEnsure a secure, DDoS-resistant stack that withstands targeted attacks without compromising private key material.
PerformanceProvide a fast service that scales to serve hundreds of thousands of clients efficiently.
DiversityCreate a diverse setup with multiple endpoints and access methods to ensure reliable randomness consumption, even in degraded network conditions.
+

A high-level view of a simple drand stack

+

A high-level view of a simple drand stack

+

https://lh7-us.googleusercontent.com/0dTQEtQyYTdw8W8kzzKms5o2fx7XlXZIcZXXm7B2N0U7ZfXaHIquajtW4KlOm2Yg28zKcu3aItyAXEegPZ-IML4tR2Wr6vqFdmHqF1NWQL1ML7Bbdi-XQa6FFOnNQchbmkUn8nCX4gJ5SgjHjnjJYbqfiJ_lH8I

+

Guidelines for drand Nodes

+
    +
  • Must be isolated from the public internet.
  • +
  • Whitelist incoming TLS-encrypted connections from other drand Nodes using a dedicated firewall instance, which can also perform TLS termination as needed.
  • +
  • Outgoing connections should originate from static IP(s) that other operators can whitelist.
  • +
  • drand nodes do not offer API service publicly; rely on drand Relays and CDNs.
  • +
  • Whitelist or authenticate access from Relays and CDN endpoints.
  • +
+

Guidelines for drand Relays

+
    +
  • Encourage the use of Relays to distribute randomness.
  • +
  • Relays can provide an HTTP endpoint or use a libp2p-based PubSub system for distribution.
  • +
  • Relays should be independent of the drand Node and not co-located on the same machine.
  • +
  • PubSub-enabled relays should maintain a unique libp2p Peer ID.
  • +
  • HTTP-enabled relays are stateless and can be horizontally scaled.
  • +
+

Use of Content Distribution Networks (CDNs)

+
    +
  • Provide HTTP(S) API access to randomness using a CDN linked to Nodes. Note: Do not use CDNs operated by other LoE members. (i.e. Cloudflare)
  • +
  • Configure CDN to cache drand HTTP endpoints, as drand produces immutable values periodically.
  • +
  • Use dedicated HTTP-enabled Relays for CDN requests to minimize direct access to drand Nodes.
  • +
+

Operation of a drand Stack

+
    +
  • Ensure a known set of node operators are responsible and reachable.
  • +
  • Monitor infrastructure with extracted logs and pushed monitoring information.
  • +
  • Ensure logs are collected externally and ensure both system level metrics as well as applications level metrics are monitored.
  • +
  • Additionally, follow security recommendations below:
  • +
+

Security Recommendations

+
AreaRecommendations
SSH Access- Use a bastion node for SSH access, whitelisting operator IPs or VPN endpoints.
+
    +
  • Disable sudo and root access on bastion nodes.
  • +
  • Enforce key-based SSH login and disable password authentication.
  • +
  • Enable 2FA for all machine logins.
  • +
  • Use a pin-protected physical device (e.g. Yubikey) for SSH key storage. | +| Firewall Configuration | - Thoroughly test allowlist enforcement, allowing only incoming connections on the drand-grpc port.
  • +
  • Use dedicated reverse-proxy/firewall machines without exposing SSH access.
  • +
  • Ensure reverse proxies for HTTP-relays are on separate machines. | +| External Services | - Enable MFA for all infrastructure/cloud provider logins.
  • +
  • Rotate API keys frequently.
  • +
  • Limit user permissions and avoid shared logins.
  • +
  • Use an email list for main account notifications. | +| Drand Machines | - Ensure operating system is up-to-date with latest security patches.
  • +
  • Run the drand node in isolation with dedicated system users.
  • +
  • Encrypt disks containing drand configuration files.
  • +
  • Limit external access strictly to operators.
  • +
  • Inform network partners immediately in case of compromise. |
  • +
+

Resource Recommendations

+
ResourceFor a drand nodeFor a Publicly-accessible HTTP Relay
ComputeComparable to x86-64 at the AWS ‘micro’ tierComparable to x86-64 at the AWS ‘micro’ tier
StorageAt least 64GB of persistent storageN/A
Storage I/ONo special provisioning requiredN/A
Network BandwidthMinimum 1Mbps of dedicated bandwidth100Mbps of network traffic
Memory32GB32GB to keep all rounds cached in memory
Hosting CapacityAt least 100Gbps of available peered or transit bandwidthN/A
+

Monitoring Recommendations

+
AreaRecommendations
Logs• Collect and ship logs to an external service.
• Monitor log collection and notify operators if logs are not received.
• Enable pam_tty_audit for logging user actions.
• Collect and monitor load balancer/firewall/CDN logs.
Metrics• Monitor common machine metrics (CPU, Disk usage, Memory, Bandwidth).
• Enable Prometheus metrics endpoints for drand applications.
• Scrape metrics locally and push to a remote service.
API Monitoring• Monitor /health and /public/latest endpoints for node and relay health.
• Use /info endpoint for load-balancer health checks.
AlertsSet up alerts for increased error log entries, failed metric pushes, panic lines, successful and failed SSH logins, CPU usage spikes, reboots, and application restarts.
DashboardsCreate dashboards for metrics like CPU, load, uptime, connections, memory usage, disk usage, API requests, beacon discrepancy, and process details.
+

Operation Recommendations

+
AreaRecommendations
Deployments and Maintenance• Communicate maintenance to partners and users.
• Avoid maintenance overlaps.
• Monitor log messages and dashboards during deployments.
Backups• Securely back up key and group folders before network events.
• Regularly back up node configurations to prevent data loss.
CDN and HTTP Relays• Never co-locate HTTP relays with the drand node.
• Use CDNs to cache responses and prevent direct DDoS attacks on the drand daemon.
• Limit HTTP relay traffic to CDN only.
Gossip Relays• Ensure gossip relays are not co-located with drand nodes or HTTP relays.
• Configure dnsaddr entries for gossip relays.
• Protect gossip relay identities and monitor their performance.
Status Monitoring• Monitor nodes using appropriate tools and report their status to the collective status page.
• Ensure latency monitoring is enabled and accessible by the League of Entropy. This refers to making GRPC exposed Prometheus metrics available for latency monitoring. Ensure your metrics are publicly accessible to enable comprehensive monitoring by the League of Entropy.
+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-1-ops-guide-deployment/index.html b/site/docs/ops-guide/4-1-ops-guide-deployment/index.html new file mode 100644 index 00000000..c98502e3 --- /dev/null +++ b/site/docs/ops-guide/4-1-ops-guide-deployment/index.html @@ -0,0 +1,169 @@ + + + + + +4.1 Deployment | drand + + + + + +

4.1 DevOps: Deployment

+

Deployment guide

+

This document explains the workflow to have a working group of drand nodes generate randomness. There are four sections to this guide:

+
    +
  1. Start the daemons.
  2. +
  3. Choose a beacon id.
  4. +
  5. Generate the long-term key pairs and the group file.
  6. +
  7. Have each node collectively participate in the distributed key generation (DKG).
  8. +
  9. Generate randomness.
  10. +
+

You can repeat these steps every time you want to start a new network for randomness generation. If the drand daemon is already running, please skip that step. For each new network, a unique identifier, known as Beacon ID is required.

+

Setup

+

The setup process for a drand node consists of the following steps:

+
    +
  1. Start the drand daemon on each node.
  2. +
  3. Choose a beacon id for the new network.
  4. +
  5. Generate the long-term key pair for each new network.
  6. +
  7. The leader starts the command as a coordinator & every participant connects to the coordinator to setup the network.
  8. +
+

This document explains how to do the setup with the drand binary itself. If you want to install drand using Docker, follow the Docker instructions instead.

+

Beacon ID

+

Each drand network needs a unique identifier to run. The only constraint regarding possible values is it could not have been used before on another network. If you leave the id empty, the node will set it to default.

+

Long-term Key

+

Each drand network needs a public and secret key to interact with the rest of the nodes. To generate these keys run drand generate-keypair followed by the address of your node:

+
drand generate-keypair --id {beacon-id} drand.example.com:443
+

The address must be reachable over a TLS connection through a reverse proxy doing gRPC TLS termination. Disabling TLS can be done when running a development or test deployment by building drand with the -tags=conn_insecure build tag.

+

The default location for your keys is ~/.drand. You can specify where you want the keys to be saved by using the --folder flag:

+
drand generate-keypair --folder ~/.drand-node-0 --id {beacon-id} drand0.example.com:443
+

Starting the drand Daemon

+

The daemon does not automatically run in the background. To run the daemon in the background, you must add & to the end of your command. Docker users can use the -d option. Once the daemon is running, the best way to issue commands is to use the control functionalities. The control client has to run on the same server as the drand daemon, so only drand administrators can issue a command to their drand daemons.

+

To choose where drand listens, use the --private-listen flag. You can also use the --public-listen flag to specify the address of the public API. Both these flags allow specifying the interface and/or port for drand to listen on. The --private-listen flag is the primary listener used to expose a gRPC service for inter-group-member communication. The --public-listen flag exposes a public and limited HTTP service designed to be CDN friendly with caching header, and provide basic information for drand users.

+

To get TLS certificates for free, you can use, for example, Let's Encrypt with its official CLI tool EFF's certbot.

+

TLS setup: Nginx with Let's Encrypt

+

Running drand behind a reverse proxy is the default method of deploying drand. Such a setup greatly simplifies TLS management issues (renewal of certificates, etc.). We provide here the minimum setup using Nginx ****and certbot- make sure you have both binaries installed with the latest version; Nginx version must be at least >= 1.13.10 for gRPC compatibility.

+
    +
  1. +

    First, add an entry in the Nginx configuration for drand:

    +
    # /etc/nginx/sites-available/default
    server {
    server_name drand.example.xyz;
    listen 80;
    location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    }
    }

    server {
    server_name drand.example.xyz;
    listen 443 ssl http2;
    location / {
    grpc_pass grpc://localhost:4444;
    grpc_set_header X-Real-IP $remote_addr;
    }

    # Add ssl certificates by running certbot --nginx
    }
    +

    You can change:

    +
      +
    1. the port on which you want drand to be accessible by changing the line listen 443 ssl http2 to use any port.
    2. +
    3. the port on which the drand binary will listen locally by changing the line grpc_pass grpc://localhost:4444; to the private API port and proxy_pass http://localhost:8080; to the public API port.
    4. +
    +

    You can use different server blocks to apply different configurations (DNS names, for example) for the private and public API.

    +
  2. +
  3. +

    Run certbot to get a TLS certificate:

    +
    sudo certbot --nginx
    +
  4. +
  5. +

    Running drand uses two ports: one for group member communication, and one for a public-facing API for distributing randomness. These ports and interfaces should be specified with flags.

    +
    drand start --private-listen 127.0.0.1:4444 --public-listen drand0.example.com:8080
    +

    The --private-listen flag tells drand to listen on the given address. The public-facing address associated with this listener is given to other group members in the setup phase (see below).

    +

    If no private-listen address is provided, it will default to the discovered public address of the drand node.

    +

    If no public-listen flag is provided, drand will not expose a public HTTP interface.

    +
  6. +
+

TLS Setup: Apache for HTTP

+

The equivalent Apache config block to the NGinX config above for forwarding HTTP requests back to the drand public port would be:

+
ProxyPreserveHost On
SSLProxyEngine on
SSLProxyCheckPeerCN off
ProxyPass / https://127.0.0.1:8080/
ProxyPassReverse / https://127.0.0.1:8080/
<Proxy *>
allow from all
</Proxy>
+

Test the Connection to a Node

+

Use drand util check <address> to test the gRPC endpoint on a drand node (like a ping to the node).

+
drand util check example.com:443

> drand: id example.com:443 answers correctly
+

If the address used is a DNS name, this command will try to resolve the DNS name to IP.

+

Test the Connection to a Network

+

Use drand util check --id <beacon-id> <address>  to test the gRPC endpoint of a drand network which has a specific beacon id.

+
drand util check --id <beacon-id> example.com:443

> drand: id example.com:443 answers correctly
+

If the address used is a DNS name, this command will try to resolve the DNS name to IP.

+

Run the Setup Phase

+

To setup a new network, drand uses the notion of a coordinator that collects the public key of the participants, setups the group configuration once all keys are received, and then start the distributed key generation phase. Once the DKG phase is performed, the participants can see the list of members in the group configuration file.

+

Coordinator: The designated coordinator node must run the following command before everyone else:

+
drand dkg init --threshold 6 --proposal /path/to/proposal/file --period 30s --id {beacon-id} --scheme {scheme-id}
+

Rest of participants: Once the coordinator has run the previous command, the rest of the participants must run the following command:

+
drand dkg join --id {beacon-id}
+

The flags usage is as follows:

+
FlagDescription
--leaderThis node is the group coordinator.
--nodesThe number of nodes in this group.
--thresholdThe minimum number of nodes that need to be online for the network to be live.
--periodThe period of the randomness beacon to use. It must be a valid duration as parsed by Golang's https://golang.org/pkg/time/#ParseDurationhttps://golang.org/pkg/time/#ParseDurationmethod.
--catchup-periodThe period of randomness when recovering from a failure. A valid Golang duration, it may be 0 to catch up as fast as possible.
--secret-fileThe file that contains the password that the leader uses to authenticate nodes that want to participate in the group. This password must be at least 32 characters long. This variable contains the path and name of the file. Notice that this flag takes precedence over the DRAND_SHARE_SECRET env variable if set.
--idThe unique identification for this new network. It allows drand to handle various networks running at the same time.
--schemeThe scheme the new network will use. It allows the network to work on chain or unchained mode.
+

The drand share command will run until the DKG has finished. If you quit the command, the DKG will continue, but the group file will not be created. In that case, once the DKG is done, you can get the group file by running:

+
drand show group --out group.toml --id {beacon-id}
+

If you specified a --control in when you started the drand node, you will have to supply the same port with this command:

+
drand show group --out group.toml --control 3001 --id {beacon-id}
+

Custom Entropy Source

+

Drand takes its entropy for the setup phase from the OS's entropy source by default. This source is /dev/urandom on Unix systems. However, it is possible for a participant to inject their own entropy source into the creation of their secret.

+

Group TOML File

+

Once the DKG phase is done, each node has both a private share and a group file containing the distributed public key. Using the previous commands, the group file will be written to group.toml. That updated group file is needed by drand to securely contact drand nodes on their public interface to gather private or public randomness. To view this file, run drand show group. If you want to save the output to a file, add the --out <file> flag:

+
drand show group --out ~/group-config.toml --id {beacon-id}
+

Randomness Generation

+

After a successful setup phase, drand will switch to the randomness generation mode at the genesis time specified in the group file. Each node broadcasts randomness shares at regular intervals. Every new random beacon is linked to the previous one in a chain of randomness. Once a node has collected a threshold of shares in the current round, it computes the public, random value, and stores it in its local instance of BoltDB.

+

For third party implementations of randomness beacon verification, you need:

+
    +
  • The distributed public key generated during the setup phase.
  • +
  • The period.
  • +
  • The genesis time of the chain.
  • +
+

As an administrator of a drand node, you can use the control port to access a series of important information:

+
    +
  • For listing all running networks:
  • +
+
drand util status --list-ids
+
    +
  • For accessing the chain information of a network:
  • +
+
drand show chain-info --id {beacon-id}
+

Non-administrators can contact an external drand node to ask for its current distributed public key:

+
drand get chain-info --id {beacon-id} <address>
+

In this command, <address> is the address of a drand node. Use the--tls-cert flag to specify the server's certificate if needed. The group.toml file does not need to be updated with the collective key.

+

When using the get chain-info method, a drand node can lie about the key if no out-of-band verification is performed. That information is usually best gathered from a trusted drand operator and then embedded in any applications using drand.

+

Timings

+

At each new period, each node will try to broadcast their partial signatures for the corresponding round and try to generate full randomness from the partial signatures. The corresponding round is the number of rounds elapsed from the genesis time. That means there is a 1-1 mapping between a given time and a drand round.

+

Daemon Downtime and Chain Sync

+

Due to the threshold nature of drand, a drand network can support some numbers of nodes offline at any given point. This number is determined by the threshold: max_offline = group_len - threshold. When a drand node goes back up, it will sync rapidly with the other nodes to catch up its local chain and participate in the next upcoming drand round.

+

drand Network Failure

+

If, for some reason, drand goes down for some time and then backs up, the new random beacon will be built over the last successfully generated beacon. For example, if the network goes down at round 10 (i.e., the last beacon generated contained round: 10), and back up again at round 20 (i.e., field round: 20), then this new randomness contains the field previous_round:10.

+

Control Functionalities

+

Drand's local administrator interface provides further functionality, e.g., to update group details or retrieve secret information. By default, the daemon listens on 127.0.0.1:8888, but you can specify another control port when starting the daemon with:

+
drand start --control 1234
+

In that case, you need to specify the control port for each of the following commands.

+

Long-term Private Key

+

To retrieve the long-term private key of our node, run:

+
drand show private --id {beacon-id}
+

Long-term Public Key

+

To retrieve the long-term public key of our node, run:

+
drand show public --id {beacon-id}
+

Private Key Share

+

To retrieve the private key share of our node, as determined during the DKG, run the following command:

+
drand show share --id {beacon-id}
+

The JSON-formatted output has the following form:

+
{
"index": 1,
"share": {
"gid": 22,
"scalar": "764f6e3eecdc4aba8b2f0119e7b2fd8c35948bf2be3f87ebb5823150c6065764"
}
}
+

The "gid" simply indicates which group the data belongs to. It is present for scalar and points on the curve, even though scalars are the same on the three groups of bls12-381. The field is present already to be able to accommodate different curves later on.

+

Chain Information

+

To retrieve information about the chain this node participates in, run:

+
drand show chain-info --id {beacon-id}
+

Updating drand Group

+

Drand allows for "semi-dynamic" group update with a resharing protocol that offers the following:

+
    +
  • New nodes can join an existing group and get new shares. Note that, in fact, all nodes get new shares after running the resharing protocol.
  • +
  • Nodes can leave their current group. It may be necessary for nodes that do not wish to operate drand anymore.
  • +
  • Nodes can update the threshold associated with their current distributed public key.
  • +
  • refresh the shares (similar to using a new private key)
  • +
+

The main advantage of this method is that the distributed public key stays the same even with new nodes coming in. That can be useful when the distributed public key is embedded inside the application using drand, and hence is difficult to update.

+

Setting up the coordinator: The coordinator must be a member of the current network. To run the coordinator, run the following:

+
drand share --leader --transition --secret-file /path/to/my/secret/file --nodes 15 --threshold 10 --out group2.toml --id {beacon-id}
+

Setting up the current members for the resharing: The current members can simply run the following command:

+
drand share --connect <coordinator> --transition --secret-file /path/to/my/secret/file --out group2.toml --id {beacon-id}
+

Setting up the new members: The new members need the current group file to proceed. Check how to get the group file in the Deployment section.

+ +

A new member can synchronize with a chain before joining. This can be done by anyone, and does not require resharing to have started.

+
drand follow --sync-nodes <coordinator> --chain-hash <chain hash>
+

This command will not exit, but will keep adding new beacons to the local database as they are produced. If you wish for the command to terminate once it has synchronized up to now, you can add the option --up-to=<round> where round is the current randomness round.

+

To join the group, the incoming member should execute:

+
drand share connect <coordinator> --from group.toml --secret-file /path/to/my/secret/file --out group2.toml
+

After the protocol is finished, each node will have the new group file written out as group2.toml. The randomness generation starts only at the specified transition time specified in the new group file.

+

In this case, the Beacon ID is not required as it is taken from the group file.

+

Metrics

+

The --metrics <metrics-address> flag may be used to launch a metrics server at the provided address. The address may be specified as 127.0.0.1:port, or as :port to bind to the default network interface. The webserver at this port will serve pprof runtime profiling data at <metrics>/debug/pprof, allow triggering golang garbage collection at <metrics>/debug/gc, and will serve Prometheus metrics at <metrics>:/metrics. Prometheus counters track the number of gRPC requests sent and received by the drand node, as well as the number of HTTP API requests. This endpoint should not be exposed publicly. If desired, prometheus metrics can be used as a data source for grafana dashboards or other monitoring services.

+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-2-ops-guide-docker-install/index.html b/site/docs/ops-guide/4-2-ops-guide-docker-install/index.html new file mode 100644 index 00000000..c396e270 --- /dev/null +++ b/site/docs/ops-guide/4-2-ops-guide-docker-install/index.html @@ -0,0 +1,114 @@ + + + + + +4.2 Docker Install | drand + + + + + +

4.2 DevOps: Docker Install

+

Install drand with Docker

+

This page describes how to run a production version of drand based on docker-compose. This is meant as a production setup. It notably involves generating TLS certificates for your public-facing server. Check out the simple install if you just want a local drand demo →

+

Prerequisites for this Guide

+

a VPS with the following software setup:

+
    +
  1. docker >= 17.12
  2. +
  3. docker-compose >= 1.18
  4. +
  5. go >= 1.12
  6. +
  7. certbot, a TLS-capable reverse-proxy, or any other way to get TLS certificates (see section "Setting up TLS")
  8. +
+

First Steps

+

Copy/send this folder on your server, then open a shell in it. You may place this directory where you want, e.g. ~/deploy-example. Its name is irrelevant too, should you want to change it (just don't call it ~/.drand which is used for the config files).

+

At this point, your current working directory should look like this:

+
$ pwd
/home/drand/deploy-example
------------------------------------------------------------
$ tree
.
├── data
│ ├── tls_certificates
│ └── tls_keypair
├── docker-compose.yml
└── README.md
+

Also make sure data is owned by your user, and have rights 740:

+
chmod -R 740 data
+

Setting up TLS

+

To be secure, drand needs authenticated channels to talk to other drand nodes. This can be currently done in two ways:

+
    +
  1. via the TLS module within drand; in that case, you need to give TLS certificates to drand itself.
  2. +
  3. via a reverse-proxy in front of drand; in that case, drand itself is unaware of TLS, and your reverse proxy is handling TLS itself.
  4. +
+

First option: use TLS within drand

+

One way to get a TLS certificate is through LetsEncrypt and their command-line tool certbot.

+

Use certbox to generate TLS certificates. The command will depend on your setup, but typically can be sudo certbot certonly --standalone.

+

Once done, certbot put the files in /etc/letsencrypt/live. We are interested in /etc/letsencrypt/live/YOURSERVER/certX.pem and /etc/letsencrypt/live/YOURSERVER/privkeyX.pem.

+

Copy those two files into data/tls_keypair, renaming them as cert.pem and privkey.pem:

+
cp /etc/letsencrypt/live/YOURSERVER/certX.pem data/cert.pem
cp /etc/letsencrypt/live/YOURSERVER/privX.pem data/priv.pem
+

The TLS setup is done.

+

Second option: disable TLS in drand

+

Note: only do this if you intend to setup TLS with your reverse proxy. If you don't use TLS at all, there's no point in doing this setup, it won't be secure ! If you're just trying to run an insecure demo, run make demo in the root folder of this repository instead of following this guide.

+

In this case, replace the following line in the docker-compose.yml file:

+
    command: --verbose 2 start --private-listen 0.0.0.0:8080 --cert-dir "/data/drand/.drand/tls_certificates" --tls-cert "/data/drand/.drand/tls_keypair/cert.pem" --tls-key "/data/drand/.drand/tls_keypair/key.pem"
+

by:

+
    command: --verbose 2 -tls-disable start --private-listen 0.0.0.0:8080
+

This guide will continue focusing on drand; jump to the end of this guide to configure the reverse proxy.

+

Public HTTP API

+

The compose file also opens a public http API to be consumed by the clients. This public endpoint is exposed on the 8081 port (specified with --public-listen]). If you wish to not expose the public http endpoint, you need to change the docker file to remove references to public port.

+

Generate drand Keys

+

Now, let's generate keys for drand:

+
go get -u github.com/drand/drand
drand generate-keypair <address>
+

Where <address> is for instance drand.yourserver.com:8080 or yourserver.com:8080. If you'll be using a reverse-proxy, make sure you enter the public-facing port.

+

This generates keys in ~/.drand/keys/. Let's move them into data:

+
mv ~/.drand/key data
+

Docker-compose Setup

+

Drand can now be started as follows:

+
docker-compose up -d
+

To check what is happening, access the docker-compose logs via

+
docker-compose logs
+

Distributed Key Generation (DKG)

+

If you did the setup above, you have a container running the drand deamon, loaded with your keys. It still misses two things:

+
    +
  1. the group.toml file corresponding to other participants. For this, you have to exchange keys manually, e.g., via email.
  2. +
  3. running the DKG protocol to bootstrap drand.
  4. +
+

Fortunately, with our docker-compose volumes, it's now very easy to add things into the running container. Just add your group.toml into the root of the data folder (NOT in the data/groups/ folder; this one is manually managed by drand, don't touch it).

+

Then, open a CLI into your running docker.

+

First find its id on the host:

+
$ docker ps
697e4766f8b2 drand_drand "drand --verbose 2 s…" 11 minutes ago Up 9 minutes
+

The id of the container is 697e4766f8b2. Enter it by running:

+
docker exec -it 697e4766f8b2 /bin/sh
+

Then, you're inside the container; tell drand to run the DKG like so:

+
drand share --connect <leader address> --nodes <expected nodes> --threshold <expected threshold>
+

Notice the full path /data/drand/.drand/group.toml and not group.toml nor ./group.toml

+

At this point, once everybody in the group.toml has run the same command (at the same time), the randomness generation starts. Well done! Simply let it run, there's nothing else to do.

+

Other Topics

+

Updating drand

+

To update drand, simply shut it the container

+
docker-compose down
+

and to fully rebuild it, you need to first clean the already-used layers (for some reason Docker is confused and thinks nothing has changed, and it keeps rebuilding the old version). Caution! this delete all your unused containers and networks; it's typically fine, but just be aware of it.

+
docker system prune -a
+

Then rebuild and restart it

+
docker-compose up --build -d
+

Reset the Docker State (without losing the Keys)

+

This part is if you need to reset drand's internal state without loosing the keys.

+

Method 1: using drand clean

+

First, try using this method. If that doesn't work, use the method below.

+

Find drand's container id on the host, and enter it:

+
$ docker ps
697e4766f8b2 drand_drand "drand --verbose 2 s…" 11 minutes ago Up 9 minutes

$ docker exec -it 697e4766f8b2 /bin/sh
+

Then simply call:

+
drand reset
+

Exit the container with CTRL-C. Then, on the host, I advise you to restart the container (to make sure the drand deamon has a clean restart and can reload its cleaned config):

+
docker-compose down
docker-compose up --build -d
+

Method 2: performing a Manual Reset

+

The method above relies on drand clean, which could theoretically fail. If you want a manual hard-reset, start by killing the container:

+
docker-compose down
+

Delete what you want to reset in data: typically, you absolutely want to keep data/keysespecially if you shared those keys to create a group.toml with other people. For instance if the DKG failed, remove data/db and data/groups. Notice that if you added the group.toml into the root of data as suggested, it should still be there (don't delete it unless you want to change the group).

+

Then, rebuild the image from scratch:

+
docker system prune -a
docker-compose up --build -d
+

Check that things are running with

+
docker-compose logs
+

You're now back to the step "Distributed Key Generation" of this guide.

+

Docker behind Reverse Proxy Setup

+

Typically, the TLS part of my VPS is managed by a single reverse proxy, which then proxies multiple services running locally with docker.

+

There is one subtletly: you need to forward both GRPC (used by drand "core") and web traffic (for the web interface). To forward GRPC, you need to have nginx 1.13.10 or above, it's a fairly recent addition.

+

Then, you need to forward differently traffic to private API port and the HTTP public API port. Here's an example configuration for nginx:

+
server {
server_name drand.lbarman.ch;
listen 443 ssl http2;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
// default --private-listen port specified in the docker compose
grpc_pass grpc://localhost:1234;
grpc_set_header X-Real-IP $remote_addr;
}

location /info {
// default --public-listen flag specified in the docker compose
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
}

location /public/ {
// default --public-listen flag specified in the docker compose
proxy_pass http://localhost:8081;
proxy_set_header Host $host;
}

ssl_certificate /etc/letsencrypt/live/.../fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem; # managed by Certbot
}
+

You can separate the entries in two in nginx by having two server blocks to apply different configurations.

+

Note: to others, you'll still be using TLS (handled by your reverse proxy), so make sure you generate your drand-keys using an https address, and the flag TLS=true.

+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-3-ops-guide-storage-backends/index.html b/site/docs/ops-guide/4-3-ops-guide-storage-backends/index.html new file mode 100644 index 00000000..869ac98d --- /dev/null +++ b/site/docs/ops-guide/4-3-ops-guide-storage-backends/index.html @@ -0,0 +1,73 @@ + + + + + +4.3 Storage Backends | drand + + + + + +

4.3 DevOps: Storage Backends

+

drand supports multiple storage backends: BoltDB, PostgreSQL, in-memory storage, aka. MemDB.

+

To launch drand with a specific backend, you need to provide the --db flag.

+

The supported values are: bolt for BoltDB, postgres for PostgreSQL, memdb for the in-memory backend.

+

BoltDB

+

The BoltDB backend allows drand to store beacon data under a local filesystem.

+

The database can be found under the <storage-path>/multibeacon/<beacon-id>/db/drand.db.

+

This is the default storage backend.

+

Usage Example:

+
drand start \
-db boltdb \
<other "start" options here>
+

You can also omit the -db flag.

+

At the moment, there are no configurable options for this backend.

+

🐘 PostgreSQL

+

This backend is supported since drand v1.5+.

+

The PostgreSQL backend allows drand to store beacons in a database.

+

The database connection will use UTC as default timezone. This parameter is not currently configurable.

+

Usage Example:

+

Before using this backend, you'll need to create a user that can read/write into the database you want the beacons to be stored in.

+

You'll also need to manually apply the migration schema chain/postgresdb/schema/schema.sql.

+

Note: You should always apply the schema corresponding to your code version.

+
drand start \
-db postgres \
-pg-dsn 'postgres://drand:drand@services.local.rodb.ro:45432/drand?sslmode=disable&connect_timeout=5' \
<other "start" options here>
+

Supported Options:

+

You can customize the PostgreSQL backend using the -pg-dsn option. This allows you to control various connection properties.

+

The available options are:

+
    +
  • sslmode - If the SSL mode is disabled or not. Supports: required or disabled. Default disabled.
  • +
  • connect_timeout - How many seconds to wait until the connection attempt times out. Default: 5 seconds.
  • +
  • max-idle - The number of maximum idle connections to the database. Default: 2.
  • +
  • max-open - The number of maximum open connections to the database. Default: 0 - unlimited. +
      +
    • If max-idle is greater than 0 and max-open is less than max-idle, then max-idle will be capped to max-open limit.
    • +
    +
  • +
+

In-memory (memDB)

+

This backend is supported since drand v1.5+.

+

The in-memory backend, also referred to as memdb, allows the node to store all beacons in-memory.

+

This backend will lose all the contents on node restart/stop.

+

Warning: Using this backend on a threshold amount of nodes can cause catastrophic network disruptions if all nodes reboot/fail at the same time.

+

Usage Example:

+
drand start \
-db memdb \
-memdb-size 2000 \
<other "start" options here>
+

Supported Options:

+

You can customize the in-memory backend by specifying the following options:

+
    +
  • memdb-size - The number of beacons that each network will store before purging.
  • +
+

Note, the memdb-size applies to individually to all the networks. E.g., for a -memdb-size=2000:

+
    +
  • If you plan to run a single network, then the total number of beacons in memory will be 2000.
  • +
  • If you plan to run two networks, then the total number of beacons in memory will be 4000.
  • +
  • If you plan to run N networks, then the total number of beacons in memory will be N * 2000.
  • +
+

To help you estimate the memory size required to operate an in-memory node, you can use a size of about 200 bytes for each beacon value stored.

+

Besides the memory constraints, you'll also have to keep in mind the frequency of the network:

+
    +
  • For a 30 seconds period, 2000 beacons will cover the last ~16 hours of values.
  • +
  • For a 3 seconds period, 2000 beacons will cover the last ~1 hour of values.
  • +
  • For a 1 second period, 2000 beacons will cover the last ~30 minutes of values
  • +
+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-4-ops-guide-metrics-guide/index.html b/site/docs/ops-guide/4-4-ops-guide-metrics-guide/index.html new file mode 100644 index 00000000..4ae5239d --- /dev/null +++ b/site/docs/ops-guide/4-4-ops-guide-metrics-guide/index.html @@ -0,0 +1,41 @@ + + + + + +4.4 Metrics Guide | drand + + + + + +

4.4 DevOps: Metrics Guide

+

Drand uses Prometheus instrumentation for helping operators monitor and understand the runtime behavior of system.

+

Local Metrics

+

The local drand node exposes metrics on an HTTP server listening as specified by the --metrics command line flag. You can view the reported metrics in a browser at http://localhost:<metrics port>/metrics. This page includes

+
    +
  • The default Golang process metrics collected by Prometheus
  • +
  • Statistics on the drand beacon and group behavior
  • +
  • Statistics on the HTTP public listener request load if enabled.
  • +
+

Shared Group Metrics

+

In addition to the metrics collected within the local node, the drand GRPC group protocol supports re-export and sharing of group metrics between group members. When a local metrics port is specified, metrics shared by other group members can be accessed at http://localhost:<metrics port>/peer/<peer address>/metrics. This will only include the drand beacon statistics shared by the remote peer, and does not include the process or internal health of the node. It is meant to allow better visibility when debugging network issues, and helping operators understand where problems originate.

+

Client Metrics

+

The drand client is capable of collecting metrics on the health of the sources of randomness that it is connected to.

+

For each HTTP endpoint, every 10 seconds, the client sends "heartbeat" requests for the "current" randomness, wherein the requested "current" randomness round is calculated based on the current time and the genesis time of the drand network. The outcomes of these requests are used to generate the following metrics:

+
    +
  • Heartbeat latency: This is the duration, in milliseconds, between the time when the randomness response was received and the time when it was meant to be produced by the drand nodes (based on the genesis time of the network and the round number). The corresponding Prometheus metric is the gauge client_http_heartbeat_latency. In normal conditions, when the network latency is sub-second, one expects the heartbeat latency to be roughly evenly distributed between 0 and 30 seconds. This is caused by the fact that there are multiple heartbeats during a single round, which lasts 30 seconds, as well as the fact that each request blocks until the randomness becomes available. This metric is implemented in [https://github.com/drand/drand/blob/master/client/http/metric.go#L59].
  • +
  • Heartbeat success and failure: These are two counters, "success" and "failure", whose Prometheus names are client_http_heartbeat_success and client_http_heartbeat_latency. The success counter is increments after an HTTP request returns a successful response HTTP, otherwise the the failure counter is incremented. This metric is implemented in [https://github.com/drand/drand/blob/master/client/http/metric.go#L50].
  • +
+

In addition, the client maintains a metric on its watch channel for randomness. This channel pushes latest randomness to the client as soon as it is available. The channel is implemented either by connecting to a gossip relay or by polling HTTP endpoints, if a relay is not specified. The relevant metric is:

+
    +
  • Watch latency: This is a Prometheus gauge measuring the duration between when a randomness round was received by the client and the time when it was produced by the drand nodes (as calculated based on round number and genesis time). The metric is implemented in [https://github.com/drand/drand/blob/master/client/metric.go#L37].
  • +
+

All of the above measurements have two significant labels:

+
    +
  • The label http_address identifies the HTTP endpoint that is being queried by the client,
  • +
  • The label client_id identifies the client itself.
  • +
+
+ + \ No newline at end of file diff --git a/site/docs/ops-guide/4-5-ops-guide-command-line-tools/index.html b/site/docs/ops-guide/4-5-ops-guide-command-line-tools/index.html new file mode 100644 index 00000000..b2434e29 --- /dev/null +++ b/site/docs/ops-guide/4-5-ops-guide-command-line-tools/index.html @@ -0,0 +1,159 @@ + + + + + +4.5 Command-line Tools | drand + + + + + +

4.5 DevOps: Command-line Tools

+

Drand's main functionality is provided by the drand program, which allows you to run a drand server and control its operation. You can also use drand as a client to fetch randomness from a drand network.

+

Installing drand

+

Binary Releases

+

The simplest way to get drand is to download a pre-built binary release for your platform.

+

You can verify the checksum of a drand binary release by checking the checksums.txt listed in the GitHub assets for the release, which contains the SHA-256 checksum for each release archive. To check your local download, you can use the shasum command:

+
shasum -a 256 <path-to-drand.tar.gz>
+

Source Code

+

You can compile drand from source code by cloning the drand GitHub repository and building the project.

+

This will require a working Go installation, and your GOPATH must be set. You'll also need the make command available.

+

With those requirements met, install drand via:

+
git clone https://github.com/drand/drand
cd drand
make install
+

This will install drand into $GOPATH/bin, which should be on your $PATH if you followed the standard Go install instructions.

+

If you'd prefer not to install drand globally, or if you want to put the drand binary in a different location, you can run make build instead of make install. This will create the drand binary in the current directory.

+

Usage

+

This section gives a basic overview of the main drand CLI interface to give an idea of the options available. If you're setting up a drand network deployment, please see the 4.1 DevOps: Deployment, which walks through using drand to run a live network.

+

The drand command has several subcommands. Among the most important is drand help, which will introduce you to the rest of the subcommands:

+
$ drand help

NAME:
drand - distributed randomness service

USAGE:
drand [global options] command [command options] [arguments...]

VERSION:
2.0.1

COMMANDS:
dkg Commands for interacting with the DKG
start Start the drand daemon.
stop Stop the drand daemon.

share The old command for running DKGs; this has been removed
load Launch a sharing protocol from filesystem
sync sync your local randomness chain with other nodes and validate your local beacon chain. To follow a remote node, it requires the use of the 'follow' flag.
generate-keypair Generate the longterm keypair (drand.private, drand.public) for this node, and load it on the drand daemon if it is up and running.

util Multiple commands of utility functions, such as reseting a state, checking the connection of a peer...
show local information retrieval about the node's cryptographic material. Show prints the information about the collective public key, the group details (group.toml),the long-term public key (drand.public), respectively.

help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--verbose If set, verbosity is at the debug level (default: false) [$DRAND_VERBOSE]
--folder value Folder to keep all drand cryptographic information, with absolute path. (default: "/Users/1337user/.drand") [$DRAND_FOLDER]
--help, -h show help (default: false)
--version, -v print the version (default: false)
+

The help command can be used for subcommands as well, for example drand help generate-keypair. If you prefer, you can also show help with the --help flag after the subcommand name, e.g.: drand generate-keypair --help.

+

drand generate-keypair

+

The generate-keypair command creates a long-term public/private keypair for a drand network. You must provide the address that your drand node will listen on, including the publicly reachable port number. This may be different from the port specified when starting the daemon, for example if you've set up drand to run behind a reverse proxy as described in the Deployment Guide. These new keys will be loaded on drand daemon if the daemon is up and running.

+
$ drand help generate-keypair

NAME:
drand generate-keypair - Generate the longterm keypair (drand.private, drand.public) for this node, and load it on the drand daemon if it is up and running.

USAGE:
drand generate-keypair [command options] <address> is the address other nodes will be able to contact this node on (specified as 'private-listen' to the daemon)

OPTIONS:
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--folder value Folder to keep all drand cryptographic information, with absolute path. (default: "/Users/1337user/.drand") [$DRAND_FOLDER]
--id value Indicates the id for the randomness generation process which will be started [$DRAND_ID]
--scheme value Indicates a set of values drand will use to configure the randomness generation process (default: "pedersen-bls-chained") [$DRAND_SCHEME]
--help, -h show help (default: false)
+

The generated key and all other drand state will be stored in $HOME/.drand by default, but this can be overridden with the --folder flag.

+

The --id flag should be used when generating long-term public/private keypair for networks with beacon id different from default. If you don't provide a value, the default beacon id will be used. For example, a network with beacon id beacon_name_x, you must set the flag --id beacon_name_x.

+

If you use a non-standard control port, you will also need to use the --control flag when running this command.

+

drand start

+

The start command starts the drand daemon. Note that drand does not automatically go into the background when launched, and long-running deployments should be run inside of a screen or tmux session, or otherwise "daemonized" using the tools available for your operating system.

+

If this node has already joined a network by performing a Distributed Key Generation phase, it will attempt to catch up with the drand beacon chain by contacting other nodes and will participate in the randomness generation protocol once it has caught up.

+

If the DKG has not yet been performed, the daemon will wait for an operator to begin the DKG phase using the drand dkg init command.

+

It contains a lot of flags for metrics, OpenTelemetry configuration, json log formatting, and configuring which database engine to user.

+
$ drand help start

NAME:
drand start - Start the drand daemon.

USAGE:
drand start [command options] [arguments...]

OPTIONS:
--folder value Folder to keep all drand cryptographic information, with absolute path. (default: "/Users/1337user/.drand") [$DRAND_FOLDER]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--private-listen value Set the listening (binding) address of the private API. Useful if you have some kind of proxy. [$DRAND_PRIVATE_LISTEN]
--public-listen value Set the listening (binding) address of the public API. Useful if you have some kind of proxy. [$DRAND_PUBLIC_LISTEN]
--metrics value Launch a metrics server at the specified (host:)port. [$DRAND_METRICS]
--traces value Publish metrics to the specific OpenTelemetry compatible host:port server. E.g. 127.0.0.1:4317 [$DRAND_TRACES]
--traces-probability value The probability for a certain trace to end up being collected.Between 0.0 and 1.0 values, that corresponds to 0% and 100%.Be careful as a high probability ratio can produce a lot of data. (default: 0.05) [$DRAND_TRACES_PROBABILITY]
--push Push mode forces the daemon to start making beacon requests to the other node, instead of waiting the other nodes contact it to catch-up on the round (default: false) [$DRAND_PUSH]
--verbose If set, verbosity is at the debug level (default: false) [$DRAND_VERBOSE]
--from value Old group.toml path to specify when a new node wishes to participate in a resharing protocol. This flag is optional in case a node is alreadyincluded in the current DKG. [$DRAND_FROM]
--skipValidation skips bls verification of beacon rounds for faster catchup. (default: false) [$DRAND_SKIP_VALIDATION]
--json Set the output as json format (default: false) [$DRAND_JSON]
--id value Indicates the id for the randomness generation process which will be started [$DRAND_ID]
--db value Which database engine to use. Supported values: bolt, postgres, or memdb. (default: "bolt") [$DRAND_DB]
--pg-dsn value PostgreSQL DSN configuration.
Supported options are:
- sslmode: if the SSL connection is disabled or required. Default disabled. See: https://www.postgresql.org/docs/15/libpq-ssl.html#LIBPQ-SSL-PROTECTION
- connect_timeout: how many seconds before the connection attempt times out. Default 5 (seconds). See: https://www.postgresql.org/docs/15/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT
- max-idle: number of maximum idle connections. Default: 2
- max-open: number of maximum open connections. Default: 0 - unlimited.
(default: "postgres://drand:drand@127.0.0.1:5432/drand?sslmode=disable&connect_timeout=5") [$DRAND_PG_DSN]
--memdb-size value The buffer size for in-memory storage. Must be at least 10. Recommended, 2000 or more (default: 2000) [$DRAND_MEMDB_SIZE]
--help, -h show help (default: false)
+

Endpoint Configuration

+

drand exposes up to four endpoints, depending on the flags passed in.

+

The private drand API endpoint is used to communicate with other nodes using gRPC. The private API is always enabled. As drand can now support multiple beacons, it will always need the private address to be set, in order to know where to listen. You can pass the --private-listen flag and specify the host:port to bind to. Note that the addresss associated with the keypair must be publicly accessible and mapped to the --private-listen address, for example using a reverse proxy.

+ +

The control API endpoint is used by the drand command to control a running drand daemon using commands like drand dkg init.

+

The control interface is always enabled and bound to the localhost interface. The default port is 8888, but this can be overridden with the --control flag. If you use a non-standard control port, you will also need to use the --control flag when running other commands such as drand share.

+ +

The remaining endpoints are optional, and will only be enabled if the flags are given.

+

The public HTTP endpoint provides an API that clients can fetch randomness from. To enable it, pass in the --public-listen flag and specify the host:port that you want to listen on. This endpoint exposes no sensitive information and is safe to expose to the internet. Alternatively, you may keep this endpoint behind a firewall and expose randomness to the public with the help of a relay server such as drand-relay-http.

+

The metrics endpoint provides an API for observing runtime metrics about the drand node. It can be enabled with the --metrics <metrics-port> flag. See drand Metrics for more details on accessing the metrics.

+ +

Finally drand can produce traces compatible with OpenTelemetry specification. To turn on this feature, set the DRAND_TRACES environment varible to the desired destination, e.g.

+
export DRAND_TRACES=127.0.0.1:4317
export DRAND_TRACES_PROBABILITY=1 # This will sample all traces to the destination server
+

After that, in the same terminal, use any of the drand features, such as make test-unit-memdb, to start producing traces.

+

To explore the trace details, launch a new browser tab/window at the Grafana instance, which will allow you to explore in detail the inner workings of Drand.

+

For more details on how to use Grafana, you can read the manual here.

+

TLS configuration

+

TLS certificate configuration is no longer supported by drand as of v2. Instead, you should run drand behind a reverse proxy and perform TLS termination there, as described in the 4.1 DevOps: Deployment . By default, drand assumes that all connections between nodes will take place over TLS. To override this config and run an insecure network, you can build it with the following go compiler flag: -tags=conn_insecure .

+

For more on TLS setup, see the 4.1 DevOps: Deployment.

+

drand stop

+

The stop command tells the drand daemon to shut down. If no beacon id is set, it will stop the entire daemon. However, if you provide the --id flag and a value, it will only stop that specific network.

+
$ drand help stop

NAME:
drand stop - Stop the drand daemon.

USAGE:
drand stop [command options] [arguments...]

OPTIONS:
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--help, -h show help (default: false)
+ +

drand load

+

The load command tells the drand daemon to load a network which has been previously stopped. You must set --id flag to choose the correct network to load again.

+
$ drand help load

NAME:
drand load - Load a stopped beacon from the filesystem

USAGE:
drand load [command options] [arguments...]

OPTIONS:
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default port 8888.
--id value Indicates the id for the randomness generation process which will be started
+ +

drand dkg

+

The dkg subcommand contains a range of commands related to the generation and resharing of the distributed key.

+

The init command must be used when setting up a new drand network before randomness generation can begin. The reshare command must be used after the network is running to "re-share" the key material, which allows us to change the members of the drand network without interrupting the generation of randomness.

+

For details about to running the initial DKG, see the Deployment Guide.

+
$ drand help dkg

NAME:
drand dkg - Commands for interacting with the DKG

USAGE:
drand dkg command [command options] [arguments...]

COMMANDS:
init
reshare
join
execute
accept
reject
abort
status
generate-proposal
help, h Shows a list of commands or help for one command

OPTIONS:
--help, -h show help (default: false)
+

drand dkg generate-proposal

+

The generate-proposal command is a helper to automatically pull the public keys of various nodes and form them into a toml file for running DKGs. This allows users to inspect and verify the expected parties to the DKG.

+

joiners are parties who are not yet participating in the network - for the first foundation of the network, everybody is a joiner! remainers are parties who are currently participating in the network generating randomness who are intended to continue doing so in the next 'epoch'. They can signal acceptance or rejection of proposals to the other nodes for consideration. leavers are parties who are currently participating in the network generating randomness, but who are intended to leave before the next 'epoch'.

+
$ ./drand dkg generate-proposal -h

NAME:
drand dkg generate-proposal

USAGE:
drand dkg generate-proposal [command options] [arguments...]

OPTIONS:
--joiner value [ --joiner value ] the address of a joiner you wish to add to a DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'
--remainer value [ --remainer value ] the address of a remainer you wish to add to a DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'
--out value the location you wish to save the proposal file to
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--leaver value [ --leaver value ] the address of a leaver you wish to add to the DKG proposal. You can pass it multiple times. To use TLS, prefix their address with 'https://'
--help, -h show help (default: false)
+

drand dkg init

+

The initial DKG is run to create a distributed key amongst a set of nodes for the first time. It takes a proposal file (created using the drand dkg generate-proposal command, or by hand for sadists), and key attributes of the new network such as period (how often it emits randomness), threshold (the number of shares required to create a valid signature), and the catchup period (how fast the network can create new beacons if it gets behind).

+
$ drand dkg init -h

NAME:
drand dkg init

USAGE:
drand dkg init [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to.[$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--scheme value Indicates a set of values drand will use to configure the randomness generation process (default: "pedersen-bls-chained") [$DRAND_SCHEME]
--period value period to set when doing a setup [$DRAND_PERIOD]
--threshold value threshold to use for the DKG (default: 0) [$DRAND_THRESHOLD]
--catchup-period value Minimum period while in catchup. Set only by the leader of share / reshares (default: "0s") [$DRAND_CATCHUP_PERIOD]
--proposal value Path to a toml file specifying the leavers, joiners and remainers for a network proposal [$DRAND_PROPOSAL_PATH]
--timeout value The duration from now in which DKG participants should abort the DKG if it has not completed. (default: "24h")
--source value The path to an external binary used to inject additional entropy into the DKG process
--genesis-delay value The duration from now until the network should start creating randomness
--help, -h show help (default: false)
+ +

drand dkg reshare

+

The resharing process is used for adding or removing nodes to a currently running network. The same private key generating during the initial distributed key generation is resharing between the proposed nodes such that they all receive a small share. Resharing can happen as often as necessary, and does not allow a single party to gain any more information about the private key by retaining their own shares between epochs. It operates similar to the drand dkg init command, though some parameters are no longer changeable between epochs (e.g. the period).

+
$ drand dkg reshare -h

NAME:
drand dkg reshare

USAGE:
drand dkg reshare [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to.[$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--threshold value threshold to use for the DKG (default: 0) [$DRAND_THRESHOLD]
--catchup-period value Minimum period while in catchup. Set only by the leader of share / reshares (default: "0s") [$DRAND_CATCHUP_PERIOD]
--proposal value Path to a toml file specifying the leavers, joiners and remainers for a network proposal [$DRAND_PROPOSAL_PATH]
--timeout value The duration from now in which DKG participants should abort the DKG if it has not completed. (default: "24h")
--help, -h show help (default: false)
+

drand dkg join

+

New joiners to a network must run the join command to register their interest in taking part in the distributed key generation/resharing process. If this is a resharing, the new nodes must obtain a copy of the group configuration file from an existing member, and use the --group <group-file-path> flag to specify the path to the group.toml file. In this case, --id flag is not required, as the unique identifier will be taken from the file.

+
$ drand dkg join -h

NAME:
drand dkg join

USAGE:
drand dkg join [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--group value The group file of the previous epoch [$DRAND_DKG_GROUP]
--help, -h show help (default: false)
+

drand dkg accept

+

Members of the existing network epoch can run accept to express their acceptance of a leader's resharing proposal.

+
$ drand dkg accept -h

NAME:
drand dkg accept

USAGE:
drand dkg accept [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--help, -h show help (default: false)
+

drand dkg reject

+

Members of the existing network epoch can run reject to express their rejection of a leader's resharing proposal. This does not a priori halt the DKG.

+
$ drand dkg reject -h

NAME:
drand dkg reject

USAGE:
drand dkg reject [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--help, -h show help (default: false)
+

drand dkg execute

+

Once nodes have accepted or rejected a proposal, the leader can kick off execution. This will start the actual protocol for distributed key generation or resharing.

+
$ drand dkg execute -h

NAME:
drand dkg execute

USAGE:
drand dkg execute [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--help, -h show help (default: false)
+

drand dkg abort

+

Should anything go wrong during the proposal of a DKG, such as incorrect parameters or too many rejections, the leader can abort it. This will cause other nodes to revert their current DKG state to the last successful one (or none if the abort was for an initial DKG). Future proposals will share an epoch identifier with the aborted proposal.

+
$ drand dkg abort -h

NAME:
drand dkg abort

USAGE:
drand dkg abort [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--help, -h show help (default: false)
+

drand dkg status

+

The status command allows operators to track the status of the DKG over time: what state their node is in, what who made a proposal, who has accepted or rejected a proposal, or when a resharing has completed. This can be output as CSV or in a pretty table, the default being pretty.

+
$ drand dkg status -h

NAME:
drand dkg status

USAGE:
drand dkg status [command options] [arguments...]

OPTIONS:
--id value Indicates the id for the randomness generation process which the command applies to. [$DRAND_ID]
--control value Set the port you want to listen to for control port commands. If not specified, we will use the default value. (default: "8888") [$DRAND_CONTROL]
--format value Set the format of the status output. Valid options are: pretty, csv (default: "pretty") [$DRAND_STATUS_FORMAT]
--help, -h show help (default: false)
+

drand get

+

The get command allows you to fetch public information from a running drand node, including random values and the public distributed key. Note that you do not need to be a node operator or a member of the drand group in order to use drand get, but you will need a copy of the group configuration file. You will also need access to the gRPC API endpoint, which may be protected by firewall rules.

+
$ drand get --help

NAME:
drand get - get allows for public information retrieval from a remote drand node.

USAGE:
drand get command [command options] [arguments...]

COMMANDS:
public Get the latest public randomness from the drand beacon and verify it against the collective public key as specified in group.toml. Only one node is contacted by default. This command attempts to connect to the drand beacon via TLS and falls back to plaintext communication if the contacted node has not activated TLS in which case it prints a warning.

chain-info Get the binding chain information that this node participates to
help, h Shows a list of commands or help for one command

OPTIONS:
--help, -h show help (default: false)
--version, -v print the version (default: false)
+

There are three main subcommands for drand get:

+
    +
  • drand get public <path-to-group.toml> returns the latest public random value from the group described in group.toml. You may fetch a specific round instead of the latest by supplying the -round <round-number> flag.
  • +
  • drand get chain-info --chain-hash <value> returns the binding chain information that this node participates to. In order to choose a network among the running ones on a node, you must provide the chain hash of it.
  • +
+

drand show

+

The show command returns private information from a local drand node, including its private cryptographic material.

+

There are several subcommands for drand show:

+
    +
  • drand show share prints the private distributed key share for the local node.
  • +
  • drand show group prints the group configuration file. If a DKG has been performed, this will include the distributed public key.
  • +
  • drand show chain-info prints the information for the randomness chain the local node is participating in.
  • +
  • drand show private prints the long-term private key of the local node.
  • +
  • drand show public prints the long-term public key of the local node.
  • +
+

For full usage information, run drand show --help.

+ +

drand util

+

The util command provides several subcommands that are useful for debugging and managing local node state:

+
    +
  • drand util check <address> attempts to contact the node at the given address to see if it's online and responding to requests. This can be used to check that a running network on your local node is reachable at its public address, or to make sure that a remote node can be reached before running drand share.
  • +
  • drand util list-schemes lists all scheme the node supports and can be used on share command.
  • +
  • drand util remote-status asks for the statuses of remote networks' nodes indicated by ADDRESS1 ADDRESS2 ADDRESS3..., including the network visibility over the rest of the addresses given.
  • +
  • drand util status gets the status of many modules of a running network on the local node.
  • +
  • drand util migrate runs the migration required the multi-beacon folder structure on the local node.
  • +
  • drand util ping sends a ping to the local drand daemon and prints its status.
  • +
  • drand util backup backs up the primary drand database of a running network to a secondary location.
  • +
  • drand util self-sign signs the public identity of a running network. Needed for backward compatibility with previous versions.
  • +
  • drand util reset deletes all distributed information (group file, key share, random beacon state, etc) from a network on the local node. It does NOT delete the long-term keypair.
  • +
  • drand util del-beacon <round-number> deletes all beacon chain rounds from <round-number> until the current head of the beacon chain from a running network's database. You MUST restart the running network after issuing this command.
  • +
+

For full usage information, run drand util --help.

+

Supplemental Tools

+

In addition to the main drand cli app, there are several supplemental tools that can be used to consume randomness from a drand network or help securely scale a drand deployment.

+

The following tools do not yet have binary releases and must be installed from source. The basic procedure is the same as **4.5 DevOps: Command-line Tools**, but instead of make install or make build, you'll run one of:

+
    +
  • make client
  • +
  • make relay-http
  • +
  • make relay-gossip
  • +
+

drand-client

+

The drand-client command is a standalone drand client that's optimized to fetch randomness from a drand network and provide it over a CDN.

+

The client is configured with the URL for a drand HTTP endpoint, and may optionally be configured with the addresses of one or more libp2p relay nodes. If libp2p relays are configured, the HTTP endpoint will be used as a fallback if the libp2p relays fail to deliver randomness at the expected interval.

+

To see full usage information, run drand-client help.

+

drand-relay-http

+

The drand-relay-http command provides a gRPC to HTTP relay server that can be used to relay requests from the public internet to a drand daemon. This is an alternative to the public HTTP endpoint that runs in the main drand process when starting drand with the --public-listen flag.

+

While the --public-listen flag is convenient, running a separate relay process allows the HTTP communications to be isolated from the main drand process, which limits the attack surface of the drand daemon.

+

To see full usage information, run drand-relay-http help.

+

drand-relay-gossip

+

The drand-relay-gossip command provides a relay server that connects to a drand node over gRPC and provides randomness to consumers over a libp2p PubSub topic. Randomness provided by a gossip relay may be consumed directly over PubSub by libp2p-capable programs, and/or via a CDN which has been configured to listen to a PubSub topic using drand-client.

+
+ + \ No newline at end of file diff --git a/site/img/drand-logo.avif b/site/img/drand-logo.avif new file mode 100644 index 00000000..d447675f Binary files /dev/null and b/site/img/drand-logo.avif differ diff --git a/site/img/league-members.avif b/site/img/league-members.avif new file mode 100644 index 00000000..228e6ca3 Binary files /dev/null and b/site/img/league-members.avif differ diff --git a/site/img/league-of-entropy.avif b/site/img/league-of-entropy.avif new file mode 100644 index 00000000..b3081bdb Binary files /dev/null and b/site/img/league-of-entropy.avif differ diff --git a/site/index.html b/site/index.html new file mode 100644 index 00000000..d521437f --- /dev/null +++ b/site/index.html @@ -0,0 +1,14 @@ + + + + + +Hello from drand | drand + + + + + +

drand

Distributed randomness beacon

drand

drand

drand is a distributed randomness beacon daemon written in the Go programming language. It generates collective, publicly verifiable, unbiased, and unpredictable random values at fixed intervals using advanced cryptographic techniques.

League of Entropy

League of Entropy

The League of Entropy is a voluntary consortium providing a verifiable, decentralized randomness beacon for anyone who needs a publicly verifiable source of randomness.

League Members

League Members

Active members of the League currently include Arbitrand, Automata Network, ChainSafe, cLabs, Cloudflare, DIA Association, Emerald Onion, École Polytechnique Fédérale de Lausanne (EPFL), Ethereum Foundation, Filecoin Foundation; Gelato Network; IPFS Force, KEN Labs, Kudelski Security, Protocol Labs, PTisp, Quantum Resistant Ledger (QRL) Foundation, Randamu, StorSwift, Tierion, University of Chile, UCL, Tangle Network, and Zama.

+ + \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml new file mode 100644 index 00000000..abbbfcb0 --- /dev/null +++ b/site/sitemap.xml @@ -0,0 +1 @@ +https://kentbull.github.io/drand-docs/blogweekly0.5https://kentbull.github.io/drand-docs/blog/archiveweekly0.5https://kentbull.github.io/drand-docs/blog/authorsweekly0.5https://kentbull.github.io/drand-docs/blog/authors/all-dave-grantham-articlesweekly0.5https://kentbull.github.io/drand-docs/blog/authors/all-sebastien-lorber-articlesweekly0.5https://kentbull.github.io/drand-docs/blog/authors/kentbullweekly0.5https://kentbull.github.io/drand-docs/blog/authors/yangshunweekly0.5https://kentbull.github.io/drand-docs/blog/drand-greetingsweekly0.5https://kentbull.github.io/drand-docs/blog/first-blog-postweekly0.5https://kentbull.github.io/drand-docs/blog/long-blog-postweekly0.5https://kentbull.github.io/drand-docs/blog/mdx-blog-postweekly0.5https://kentbull.github.io/drand-docs/blog/tagsweekly0.5https://kentbull.github.io/drand-docs/blog/tags/docusaurusweekly0.5https://kentbull.github.io/drand-docs/blog/tags/facebookweekly0.5https://kentbull.github.io/drand-docs/blog/tags/helloweekly0.5https://kentbull.github.io/drand-docs/blog/tags/holaweekly0.5https://kentbull.github.io/drand-docs/blog/welcomeweekly0.5https://kentbull.github.io/drand-docs/docs/about/1-0-aboutweekly0.5https://kentbull.github.io/drand-docs/docs/about/1-1-governanceweekly0.5https://kentbull.github.io/drand-docs/docs/category/10-about-what-is-drandweekly0.5https://kentbull.github.io/drand-docs/docs/category/20-concepts-getting-startedweekly0.5https://kentbull.github.io/drand-docs/docs/category/30-developers-guideweekly0.5https://kentbull.github.io/drand-docs/docs/category/40-operators-guideweekly0.5https://kentbull.github.io/drand-docs/docs/category/50-drand-communityweekly0.5https://kentbull.github.io/drand-docs/docs/category/60-drand-faqweekly0.5https://kentbull.github.io/drand-docs/docs/concepts/2-0-conceptsweekly0.5https://kentbull.github.io/drand-docs/docs/concepts/2-1-concepts-cryptographyweekly0.5https://kentbull.github.io/drand-docs/docs/concepts/2-2-concepts-security-modelweekly0.5https://kentbull.github.io/drand-docs/docs/concepts/2-3-concepts-specificationweekly0.5https://kentbull.github.io/drand-docs/docs/concepts/2-4-concepts-timelock-encryptionweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-0-dev-guideweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-1-dev-guide-organizationweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-2-dev-guide-drand-client-cliweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-3-dev-guide-client-librariesweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-4-dev-guide-http-apiweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-5-dev-guide-pubsub-networkweekly0.5https://kentbull.github.io/drand-docs/docs/dev-guide/3-6-dev-guide-code-examplesweekly0.5https://kentbull.github.io/drand-docs/docs/drand-community/5-0-drand-communityweekly0.5https://kentbull.github.io/drand-docs/docs/drand-community/5-1-drand-community-contributingweekly0.5https://kentbull.github.io/drand-docs/docs/drand-faq/6-0-drand-faqweekly0.5https://kentbull.github.io/drand-docs/docs/homeweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-0-ops-guideweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-1-ops-guide-deploymentweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-2-ops-guide-docker-installweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-3-ops-guide-storage-backendsweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-4-ops-guide-metrics-guideweekly0.5https://kentbull.github.io/drand-docs/docs/ops-guide/4-5-ops-guide-command-line-toolsweekly0.5https://kentbull.github.io/drand-docs/weekly0.5 \ No newline at end of file